diff --git a/app/src/androidTest/java/to/bitkit/ui/components/ButtonTest.kt b/app/src/androidTest/java/to/bitkit/ui/components/ButtonTest.kt new file mode 100644 index 0000000000..df343e05d3 --- /dev/null +++ b/app/src/androidTest/java/to/bitkit/ui/components/ButtonTest.kt @@ -0,0 +1,100 @@ +package to.bitkit.ui.components + +import androidx.compose.foundation.layout.Column +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.test.assertHeightIsEqualTo +import androidx.compose.ui.test.junit4.v2.createComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.unit.dp +import org.junit.Rule +import org.junit.Test +import to.bitkit.test.annotations.ComposeUi +import to.bitkit.ui.theme.AppThemeSurface + +@ComposeUi +class ButtonTest { + @get:Rule + val composeTestRule = createComposeRule() + + @Test + fun buttonHeightsRemainStableAcrossStates() { + composeTestRule.setContent { + AppThemeSurface { + Column { + PrimaryButton( + text = "Primary", + onClick = {}, + size = ButtonSize.Small, + fullWidth = false, + modifier = Modifier.testTag("PrimarySmallEnabled") + ) + PrimaryButton( + text = "Primary", + onClick = {}, + size = ButtonSize.Small, + enabled = false, + fullWidth = false, + modifier = Modifier.testTag("PrimarySmallDisabled") + ) + PrimaryButton( + text = "Primary", + onClick = {}, + size = ButtonSize.Small, + isLoading = true, + fullWidth = false, + modifier = Modifier.testTag("PrimarySmallLoading") + ) + SecondaryButton( + text = "Secondary", + onClick = {}, + size = ButtonSize.Small, + fullWidth = false, + modifier = Modifier.testTag("SecondarySmallEnabled") + ) + SecondaryButton( + text = "Secondary", + onClick = {}, + size = ButtonSize.Small, + enabled = false, + fullWidth = false, + modifier = Modifier.testTag("SecondarySmallDisabled") + ) + SecondaryButton( + text = "Secondary", + onClick = {}, + size = ButtonSize.Small, + isLoading = true, + fullWidth = false, + modifier = Modifier.testTag("SecondarySmallLoading") + ) + PrimaryButton( + text = "Primary", + onClick = {}, + fullWidth = false, + modifier = Modifier.testTag("PrimaryLarge") + ) + SecondaryButton( + text = "Secondary", + onClick = {}, + fullWidth = false, + modifier = Modifier.testTag("SecondaryLarge") + ) + } + } + } + + listOf( + "PrimarySmallEnabled", + "PrimarySmallDisabled", + "PrimarySmallLoading", + "SecondarySmallEnabled", + "SecondarySmallDisabled", + "SecondarySmallLoading", + ).forEach { + composeTestRule.onNodeWithTag(it).assertHeightIsEqualTo(40.dp) + } + composeTestRule.onNodeWithTag("PrimaryLarge").assertHeightIsEqualTo(56.dp) + composeTestRule.onNodeWithTag("SecondaryLarge").assertHeightIsEqualTo(56.dp) + } +} diff --git a/app/src/androidTest/java/to/bitkit/ui/screens/wallets/receive/EditInvoiceContentTest.kt b/app/src/androidTest/java/to/bitkit/ui/screens/wallets/receive/EditInvoiceContentTest.kt index e32ac099df..c11c694207 100644 --- a/app/src/androidTest/java/to/bitkit/ui/screens/wallets/receive/EditInvoiceContentTest.kt +++ b/app/src/androidTest/java/to/bitkit/ui/screens/wallets/receive/EditInvoiceContentTest.kt @@ -28,7 +28,6 @@ class EditInvoiceContentTest { EditInvoiceContent( amountInputViewModel = previewAmountInputViewModel(sats = 12_345), noteText = "Hardware payment", - isSoftKeyboardVisible = false, onchainOnly = true, keyboardVisible = false, tags = persistentListOf("Hardware"), diff --git a/app/src/androidTest/java/to/bitkit/ui/screens/wallets/receive/EditInvoiceScreenTest.kt b/app/src/androidTest/java/to/bitkit/ui/screens/wallets/receive/EditInvoiceScreenTest.kt index 064e65bf34..2f228445b6 100644 --- a/app/src/androidTest/java/to/bitkit/ui/screens/wallets/receive/EditInvoiceScreenTest.kt +++ b/app/src/androidTest/java/to/bitkit/ui/screens/wallets/receive/EditInvoiceScreenTest.kt @@ -24,7 +24,6 @@ class EditInvoiceScreenTest { EditInvoiceContent( amountInputViewModel = AmountInputViewModel(AmountInputHandler.stub()), noteText = "Dinner", - isSoftKeyboardVisible = false, keyboardVisible = false, tags = persistentListOf(), onBack = {}, @@ -51,7 +50,6 @@ class EditInvoiceScreenTest { EditInvoiceContent( amountInputViewModel = AmountInputViewModel(AmountInputHandler.stub()), noteText = "", - isSoftKeyboardVisible = false, keyboardVisible = false, tags = persistentListOf(), onBack = {}, diff --git a/app/src/main/java/to/bitkit/models/FeeRate.kt b/app/src/main/java/to/bitkit/models/FeeRate.kt index 8cb69c3ad2..05883f9b0a 100644 --- a/app/src/main/java/to/bitkit/models/FeeRate.kt +++ b/app/src/main/java/to/bitkit/models/FeeRate.kt @@ -11,6 +11,7 @@ import to.bitkit.ui.theme.Colors enum class FeeRate( @StringRes val title: Int, @StringRes val description: Int, + @StringRes val duration: Int, @StringRes val shortDescription: Int, @DrawableRes val icon: Int, val color: Color, @@ -18,6 +19,7 @@ enum class FeeRate( INSTANT( title = R.string.fee__instant__title, description = R.string.fee__instant__description, + duration = R.string.fee__instant__duration, shortDescription = R.string.fee__instant__shortDescription, color = Colors.Purple, icon = R.drawable.ic_speed_fast, @@ -25,6 +27,7 @@ enum class FeeRate( FAST( title = R.string.fee__fast__title, description = R.string.fee__fast__description, + duration = R.string.fee__fast__duration, shortDescription = R.string.fee__fast__shortDescription, color = Colors.Brand, icon = R.drawable.ic_speed_fast, @@ -32,6 +35,7 @@ enum class FeeRate( NORMAL( title = R.string.fee__normal__title, description = R.string.fee__normal__description, + duration = R.string.fee__normal__duration, shortDescription = R.string.fee__normal__shortDescription, color = Colors.Brand, icon = R.drawable.ic_speed_normal, @@ -39,6 +43,7 @@ enum class FeeRate( SLOW( title = R.string.fee__slow__title, description = R.string.fee__slow__description, + duration = R.string.fee__slow__duration, shortDescription = R.string.fee__slow__shortDescription, color = Colors.Brand, icon = R.drawable.ic_speed_slow, @@ -46,6 +51,7 @@ enum class FeeRate( MINIMUM( title = R.string.fee__minimum__title, description = R.string.fee__minimum__description, + duration = R.string.fee__minimum__duration, shortDescription = R.string.fee__minimum__shortDescription, color = Colors.Brand, icon = R.drawable.ic_speed_slow, @@ -53,6 +59,7 @@ enum class FeeRate( CUSTOM( title = R.string.fee__custom__title, description = R.string.fee__custom__description, + duration = R.string.fee__custom__duration, shortDescription = R.string.fee__custom__shortDescription, color = Colors.White64, icon = R.drawable.ic_settings, diff --git a/app/src/main/java/to/bitkit/ui/ContentView.kt b/app/src/main/java/to/bitkit/ui/ContentView.kt index 2f94cf9c8f..f3bc278b34 100644 --- a/app/src/main/java/to/bitkit/ui/ContentView.kt +++ b/app/src/main/java/to/bitkit/ui/ContentView.kt @@ -729,7 +729,7 @@ fun ContentView( onReceiveClick = { appViewModel.showSheet(Sheet.Receive(hardwareWalletId = currentHardwareWalletId)) }, - onScanClick = { appViewModel.showScannerSheet() }, + onScanClick = { appViewModel.showScannerSheet(showBackButton = false) }, ) } } diff --git a/app/src/main/java/to/bitkit/ui/components/Button.kt b/app/src/main/java/to/bitkit/ui/components/Button.kt index cda8c1eaf4..d32233b387 100644 --- a/app/src/main/java/to/bitkit/ui/components/Button.kt +++ b/app/src/main/java/to/bitkit/ui/components/Button.kt @@ -18,10 +18,12 @@ import androidx.compose.material.icons.filled.Favorite import androidx.compose.material.icons.filled.Home import androidx.compose.material3.Button import androidx.compose.material3.Icon +import androidx.compose.material3.LocalMinimumInteractiveComponentSize import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -30,6 +32,7 @@ import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp @@ -46,6 +49,7 @@ import to.bitkit.ui.shared.modifiers.clickableAlpha import to.bitkit.ui.shared.modifiers.rememberDebouncedClick import to.bitkit.ui.shared.util.primaryButtonStyle import to.bitkit.ui.theme.AppButtonDefaults +import to.bitkit.ui.theme.AppTextStyles import to.bitkit.ui.theme.AppThemeSurface import to.bitkit.ui.theme.Colors @@ -89,6 +93,12 @@ enum class ButtonSize { } } +@Composable +private fun ButtonSize.textStyle(): TextStyle = when (this) { + ButtonSize.Small -> AppTextStyles.CaptionB + ButtonSize.Large -> MaterialTheme.typography.labelLarge +} + @Composable fun PrimaryButton( text: String?, @@ -106,57 +116,60 @@ fun PrimaryButton( val contentPadding = PaddingValues(horizontal = size.primaryHorizontalPadding.takeIf { text != null } ?: 0.dp) val buttonShape = MaterialTheme.shapes.extraLarge - Button( - onClick = rememberDebouncedClick(onClick = onClick), - enabled = enabled && !isLoading, - colors = AppButtonDefaults.primaryColors.copy( - containerColor = Color.Transparent, - disabledContainerColor = Color.Transparent, - contentColor = contentColor, - ), - contentPadding = contentPadding, - shape = buttonShape, - modifier = modifier - .then(if (fullWidth) Modifier.fillMaxWidth() else Modifier) - .requiredHeight(size.height) - .primaryButtonStyle( - isEnabled = enabled && !isLoading, - shape = buttonShape, - primaryColor = color, - enableGradient = enableGradient, - shadowElevation = size.primaryShadowElevation, - ) - .alphaFeedback(enabled = enabled && !isLoading) - ) { - if (isLoading) { - GradientCircularProgressIndicator( - strokeWidth = 2.dp, - modifier = Modifier.size(size.height / 2) - ) - } else { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(size.primaryGap), - ) { - if (icon != null) { - Box( - modifier = if (enabled) { - Modifier - } else { - Modifier.graphicsLayer { - colorFilter = ColorFilter.tint(Colors.White32) + CompositionLocalProvider(LocalMinimumInteractiveComponentSize provides 0.dp) { + Button( + onClick = rememberDebouncedClick(onClick = onClick), + enabled = enabled && !isLoading, + colors = AppButtonDefaults.primaryColors.copy( + containerColor = Color.Transparent, + disabledContainerColor = Color.Transparent, + contentColor = contentColor, + ), + contentPadding = contentPadding, + shape = buttonShape, + modifier = modifier + .then(if (fullWidth) Modifier.fillMaxWidth() else Modifier) + .requiredHeight(size.height) + .primaryButtonStyle( + isEnabled = enabled && !isLoading, + shape = buttonShape, + primaryColor = color, + enableGradient = enableGradient, + shadowElevation = size.primaryShadowElevation, + ) + .alphaFeedback(enabled = enabled && !isLoading) + ) { + if (isLoading) { + GradientCircularProgressIndicator( + strokeWidth = 2.dp, + modifier = Modifier.size(size.height / 2) + ) + } else { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(size.primaryGap), + ) { + if (icon != null) { + Box( + modifier = if (enabled) { + Modifier + } else { + Modifier.graphicsLayer { + colorFilter = ColorFilter.tint(Colors.White32) + } } + ) { + icon() } - ) { - icon() } - } - text?.let { - Text( - text = text, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) + text?.let { + Text( + text = text, + style = size.textStyle(), + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } } } } @@ -205,42 +218,45 @@ fun SecondaryButton( } ) ) { - OutlinedButton( - onClick = rememberDebouncedClick(onClick = onClick), - enabled = enabled && !isLoading, - colors = AppButtonDefaults.secondaryColors.copy(contentColor = contentColor), - contentPadding = contentPadding, - border = border, - ) { - if (isLoading) { - GradientCircularProgressIndicator( - strokeWidth = 2.dp, - modifier = Modifier.size(size.height / 2) - ) - } else { - Row( - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(size.secondaryGap), - ) { - if (icon != null) { - Box( - modifier = if (enabled) { - Modifier - } else { - Modifier.graphicsLayer { - colorFilter = ColorFilter.tint(Colors.White32) + CompositionLocalProvider(LocalMinimumInteractiveComponentSize provides 0.dp) { + OutlinedButton( + onClick = rememberDebouncedClick(onClick = onClick), + enabled = enabled && !isLoading, + colors = AppButtonDefaults.secondaryColors.copy(contentColor = contentColor), + contentPadding = contentPadding, + border = border, + ) { + if (isLoading) { + GradientCircularProgressIndicator( + strokeWidth = 2.dp, + modifier = Modifier.size(size.height / 2) + ) + } else { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(size.secondaryGap), + ) { + if (icon != null) { + Box( + modifier = if (enabled) { + Modifier + } else { + Modifier.graphicsLayer { + colorFilter = ColorFilter.tint(Colors.White32) + } } + ) { + icon() } - ) { - icon() } - } - text?.let { - Text( - text = text, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) + text?.let { + Text( + text = text, + style = size.textStyle(), + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } } } } @@ -293,7 +309,7 @@ fun TertiaryButton( text?.let { Text( text = text, - style = MaterialTheme.typography.labelLarge, + style = size.textStyle(), color = contentColor, maxLines = 1, overflow = TextOverflow.Ellipsis, diff --git a/app/src/main/java/to/bitkit/ui/components/EmptyWalletView.kt b/app/src/main/java/to/bitkit/ui/components/EmptyWalletView.kt index c1d8fca937..7a039a2622 100644 --- a/app/src/main/java/to/bitkit/ui/components/EmptyWalletView.kt +++ b/app/src/main/java/to/bitkit/ui/components/EmptyWalletView.kt @@ -12,8 +12,6 @@ import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Close import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.runtime.Composable @@ -79,7 +77,7 @@ fun EmptyStateView( .testTag("WalletOnboardingClose") ) { Icon( - imageVector = Icons.Default.Close, + painter = painterResource(R.drawable.ic_x), contentDescription = null, tint = Colors.White64, modifier = Modifier.size(16.dp) diff --git a/app/src/main/java/to/bitkit/ui/components/FeeInfo.kt b/app/src/main/java/to/bitkit/ui/components/FeeInfo.kt index a939712a74..9f3b092b64 100644 --- a/app/src/main/java/to/bitkit/ui/components/FeeInfo.kt +++ b/app/src/main/java/to/bitkit/ui/components/FeeInfo.kt @@ -29,7 +29,7 @@ fun RowScope.FeeInfo( color = Colors.White64, ) Spacer(modifier = Modifier.height(8.dp)) - MoneySSB(sats = amount) + MoneySSB(sats = amount, showSymbol = true) Spacer(modifier = Modifier.weight(1f)) HorizontalDivider(modifier = Modifier.padding(top = 16.dp)) } diff --git a/app/src/main/java/to/bitkit/ui/components/LightningChannel.kt b/app/src/main/java/to/bitkit/ui/components/LightningChannel.kt index 3f44e409c2..2b604ebe71 100644 --- a/app/src/main/java/to/bitkit/ui/components/LightningChannel.kt +++ b/app/src/main/java/to/bitkit/ui/components/LightningChannel.kt @@ -15,15 +15,13 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowDownward -import androidx.compose.material.icons.filled.ArrowUpward import androidx.compose.material3.Icon import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -70,7 +68,7 @@ fun LightningChannel( ) { Row(verticalAlignment = CenterVertically) { Icon( - imageVector = Icons.Default.ArrowUpward, + painter = painterResource(R.drawable.ic_sent), contentDescription = null, tint = spendingAvailableColor, modifier = Modifier.size(14.dp) @@ -82,7 +80,7 @@ fun LightningChannel( } Row(verticalAlignment = CenterVertically) { Icon( - imageVector = Icons.Default.ArrowDownward, + painter = painterResource(R.drawable.ic_received), contentDescription = null, tint = receivingAvailableColor, modifier = Modifier.size(14.dp) diff --git a/app/src/main/java/to/bitkit/ui/components/Money.kt b/app/src/main/java/to/bitkit/ui/components/Money.kt index 6513be5b02..ac452290f6 100644 --- a/app/src/main/java/to/bitkit/ui/components/Money.kt +++ b/app/src/main/java/to/bitkit/ui/components/Money.kt @@ -10,6 +10,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.platform.testTag +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import to.bitkit.models.BITCOIN_SYMBOL import to.bitkit.models.PrimaryDisplay @@ -30,12 +32,17 @@ fun MoneyDisplay( sats: Long, modifier: Modifier = Modifier, onClick: (() -> Unit)? = null, - showSymbol: Boolean? = null, + showSymbol: Boolean = true, ) { - val text = showSymbol?.let { rememberMoneyText(sats, showSymbol = it) } ?: rememberMoneyText(sats) + val text = rememberMoneyText(sats, showSymbol = showSymbol) text?.let { Display( - text = it.withAccent(accentColor = Colors.White64), + text = it.withAccent( + accentStyle = SpanStyle( + color = Colors.White64, + fontWeight = FontWeight.ExtraBold, + ), + ), modifier = modifier .clickableAlpha(onClick = onClick) .testTag("MoneyText") @@ -130,6 +137,24 @@ fun MoneyMSB( } } +@Composable +fun MoneyCaptionM( + sats: Long, + modifier: Modifier = Modifier, + unit: PrimaryDisplay = LocalCurrencies.current.primaryDisplay, + color: Color = MaterialTheme.colorScheme.primary, + accent: Color = Colors.White64, + showSymbol: Boolean = false, +) { + rememberMoneyText(sats = sats, unit = unit, showSymbol = showSymbol)?.let { text -> + CaptionM( + text = text.withAccent(accentColor = accent), + color = color, + modifier = modifier.testTag("MoneyText") + ) + } +} + @Composable fun MoneyCaptionB( sats: Long, diff --git a/app/src/main/java/to/bitkit/ui/components/NumberPadTextField.kt b/app/src/main/java/to/bitkit/ui/components/NumberPadTextField.kt index aab4a2f7ec..ee31a2321a 100644 --- a/app/src/main/java/to/bitkit/ui/components/NumberPadTextField.kt +++ b/app/src/main/java/to/bitkit/ui/components/NumberPadTextField.kt @@ -4,18 +4,24 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Icon import androidx.compose.runtime.Composable import androidx.compose.runtime.State import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.withStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle +import to.bitkit.R import to.bitkit.models.BITCOIN_SYMBOL import to.bitkit.models.PrimaryDisplay import to.bitkit.models.USD_SYMBOL @@ -37,6 +43,7 @@ fun NumberPadTextField( viewModel: AmountInputViewModel, modifier: Modifier = Modifier, showSecondaryField: Boolean = true, + showEditButton: Boolean = false, uiState: State = viewModel.uiState.collectAsStateWithLifecycle(), currencies: CurrencyState = LocalCurrencies.current, onClick: (() -> Unit)? = { viewModel.switchUnit(currencies) }, @@ -52,6 +59,7 @@ fun NumberPadTextField( isSymbolSuffix = currencies.primaryDisplay == PrimaryDisplay.FIAT && isSuffixSymbolCurrency(currencies.selectedCurrency), showSecondaryField = showSecondaryField, + showEditButton = showEditButton, ) } @@ -66,6 +74,7 @@ private fun MoneyAmount( isSymbolSuffix: Boolean = false, showPlaceholder: Boolean = true, showSecondaryField: Boolean = true, + showEditButton: Boolean = false, valueStyle: SpanStyle = SpanStyle(color = Colors.White), placeholderStyle: SpanStyle = SpanStyle(color = Colors.White50), ) { @@ -76,7 +85,12 @@ private fun MoneyAmount( horizontalAlignment = Alignment.Start ) { if (showSecondaryField) { - MoneySSB(sats = satoshis, unit = unit.not(), color = Colors.White64, showSymbol = true) + MoneyCaptionM( + sats = satoshis, + unit = unit.not(), + color = Colors.White64, + showSymbol = true, + ) VerticalSpacer(12.dp) } Row( @@ -86,6 +100,7 @@ private fun MoneyAmount( if (!isSymbolSuffix) { Display( text = symbol, + fontWeight = FontWeight.ExtraBold, color = Colors.White64, modifier = Modifier.padding(end = 6.dp) ) @@ -103,15 +118,26 @@ private fun MoneyAmount( } } }, - modifier = if (isSymbolSuffix) Modifier else Modifier.weight(1f) + modifier = Modifier.weight(1f, fill = false) ) if (isSymbolSuffix) { Display( text = symbol, + fontWeight = FontWeight.ExtraBold, color = Colors.White64, modifier = Modifier.padding(start = 6.dp) ) } + if (showEditButton) { + Icon( + painter = painterResource(R.drawable.ic_pencil_simple), + contentDescription = stringResource(R.string.common__edit), + tint = Colors.White, + modifier = Modifier + .padding(start = 5.dp) + .size(24.dp) + ) + } } } } diff --git a/app/src/main/java/to/bitkit/ui/components/SheetHost.kt b/app/src/main/java/to/bitkit/ui/components/SheetHost.kt index 4be36cee7e..7f284dd301 100644 --- a/app/src/main/java/to/bitkit/ui/components/SheetHost.kt +++ b/app/src/main/java/to/bitkit/ui/components/SheetHost.kt @@ -92,7 +92,10 @@ sealed interface Sheet { val isConnecting: Boolean = false, val errorText: String? = null, ) : Sheet - data class QrScanner(val isPubkyScan: Boolean = false) : Sheet + data class QrScanner( + val isPubkyScan: Boolean = false, + val showBackButton: Boolean = true, + ) : Sheet data class PubkyAuth(val authUrl: String) : Sheet data class TimedSheet(val type: TimedSheetType) : Sheet diff --git a/app/src/main/java/to/bitkit/ui/components/SwipeToConfirm.kt b/app/src/main/java/to/bitkit/ui/components/SwipeToConfirm.kt index ede0bd9c64..1db7b12dd4 100644 --- a/app/src/main/java/to/bitkit/ui/components/SwipeToConfirm.kt +++ b/app/src/main/java/to/bitkit/ui/components/SwipeToConfirm.kt @@ -16,8 +16,6 @@ import androidx.compose.foundation.layout.requiredHeight import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.filled.ArrowForward import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Icon import androidx.compose.material3.Text @@ -36,7 +34,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.platform.LocalDensity @@ -67,7 +64,7 @@ fun SwipeToConfirm( modifier: Modifier = Modifier, text: String = stringResource(R.string.other__swipe), color: Color = Colors.Brand, - icon: ImageVector = Icons.AutoMirrored.Default.ArrowForward, + @DrawableRes icon: Int = R.drawable.ic_arrow_right, @DrawableRes endIcon: Int = R.drawable.ic_check, endIconTint: Color = Colors.Black, enabled: Boolean = true, @@ -184,7 +181,7 @@ fun SwipeToConfirm( .alpha(1f - (panX.value / (maxPanX / 2)) - loadingOpacity.value) ) { Icon( - imageVector = icon, + painter = painterResource(icon), contentDescription = null, tint = Color.Black, ) diff --git a/app/src/main/java/to/bitkit/ui/components/TabBar.kt b/app/src/main/java/to/bitkit/ui/components/TabBar.kt index e9954f42ee..17b5da5710 100644 --- a/app/src/main/java/to/bitkit/ui/components/TabBar.kt +++ b/app/src/main/java/to/bitkit/ui/components/TabBar.kt @@ -23,9 +23,6 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowDownward -import androidx.compose.material.icons.filled.ArrowUpward import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable @@ -51,8 +48,8 @@ import to.bitkit.ui.shared.util.primaryButtonStyle import to.bitkit.ui.theme.AppThemeSurface import to.bitkit.ui.theme.Colors -private val iconToTextGap = 4.dp -private val iconSize = 20.dp +private val iconToTextGap = 6.dp +private val iconSize = 16.dp const val TAB_BAR_HEIGHT = 56 const val TAB_BAR_PADDING_BOTTOM = 8 @@ -136,7 +133,7 @@ fun BoxScope.TabBar( ) { Row(verticalAlignment = Alignment.CenterVertically) { Icon( - imageVector = Icons.Default.ArrowUpward, + painter = painterResource(R.drawable.ic_sent), contentDescription = stringResource(R.string.wallet__send), modifier = Modifier.size(iconSize) ) @@ -157,7 +154,7 @@ fun BoxScope.TabBar( ) { Row(verticalAlignment = Alignment.CenterVertically) { Icon( - imageVector = Icons.Default.ArrowDownward, + painter = painterResource(R.drawable.ic_received), contentDescription = stringResource(R.string.wallet__receive), modifier = Modifier.size(iconSize) ) diff --git a/app/src/main/java/to/bitkit/ui/components/Tag.kt b/app/src/main/java/to/bitkit/ui/components/Tag.kt index c8e30288f7..8a29d6f4c5 100644 --- a/app/src/main/java/to/bitkit/ui/components/Tag.kt +++ b/app/src/main/java/to/bitkit/ui/components/Tag.kt @@ -92,12 +92,13 @@ fun AddTagButton( onClick: () -> Unit, modifier: Modifier = Modifier, ) { + val shape = AppShapes.small val cornerRadius = 8.dp Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(6.dp), modifier = modifier - .clip(AppShapes.small) + .clip(shape) .drawBehind { drawRoundRect( color = Colors.White64, @@ -111,12 +112,15 @@ fun AddTagButton( .clickableAlpha(onClick = onClick) .padding(horizontal = 12.dp, vertical = 8.dp) ) { - BodySSB(text = stringResource(R.string.wallet__tags_add_button), color = Colors.White) + BodySSB( + text = stringResource(R.string.wallet__tags_add_button), + color = Colors.White, + ) Icon( painter = painterResource(R.drawable.ic_plus), contentDescription = null, tint = Colors.White64, - modifier = Modifier.size(16.dp), + modifier = Modifier.size(16.dp) ) } } @@ -144,6 +148,7 @@ private fun Preview() { TagButton(text = it, onClick = null) } } + AddTagButton(onClick = {}) } } } diff --git a/app/src/main/java/to/bitkit/ui/components/Text.kt b/app/src/main/java/to/bitkit/ui/components/Text.kt index e8a089ecf1..e3d4146ca6 100644 --- a/app/src/main/java/to/bitkit/ui/components/Text.kt +++ b/app/src/main/java/to/bitkit/ui/components/Text.kt @@ -413,6 +413,27 @@ fun Caption( ) } +@Composable +fun CaptionM( + text: AnnotatedString, + modifier: Modifier = Modifier, + color: Color = MaterialTheme.colorScheme.primary, + textAlign: TextAlign = TextAlign.Start, + maxLines: Int = Int.MAX_VALUE, + overflow: TextOverflow = if (maxLines == 1) TextOverflow.Ellipsis else TextOverflow.Clip, +) { + Text( + text = text, + style = AppTextStyles.CaptionM.merge( + color = color, + textAlign = textAlign, + ), + maxLines = maxLines, + overflow = overflow, + modifier = modifier + ) +} + @Composable fun CaptionB( text: String, diff --git a/app/src/main/java/to/bitkit/ui/components/ToastView.kt b/app/src/main/java/to/bitkit/ui/components/ToastView.kt index f6f8f27b5f..08bbee6c7e 100644 --- a/app/src/main/java/to/bitkit/ui/components/ToastView.kt +++ b/app/src/main/java/to/bitkit/ui/components/ToastView.kt @@ -21,8 +21,6 @@ import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.systemBarsPadding -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Close import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme @@ -40,6 +38,7 @@ import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.Color import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.platform.testTag +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.IntOffset @@ -206,7 +205,7 @@ fun ToastView( .padding(16.dp) ) { Icon( - imageVector = Icons.Default.Close, + painter = painterResource(R.drawable.ic_x), contentDescription = stringResource(R.string.common__close), tint = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.size(16.dp) diff --git a/app/src/main/java/to/bitkit/ui/components/settings/SettingsButtonRow.kt b/app/src/main/java/to/bitkit/ui/components/settings/SettingsButtonRow.kt index 1099191702..a03b922b93 100644 --- a/app/src/main/java/to/bitkit/ui/components/settings/SettingsButtonRow.kt +++ b/app/src/main/java/to/bitkit/ui/components/settings/SettingsButtonRow.kt @@ -6,7 +6,6 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size @@ -152,7 +151,6 @@ private fun SettingsButtonRowCore( ) { if (subtitle != null) { BodyMSB(text = title) - Spacer(modifier = Modifier.height(4.dp)) BodySSB( text = subtitle, maxLines = maxLinesSubtitle, diff --git a/app/src/main/java/to/bitkit/ui/onboarding/CreateWalletScreen.kt b/app/src/main/java/to/bitkit/ui/onboarding/CreateWalletScreen.kt index cc59ba161f..1198f19c22 100644 --- a/app/src/main/java/to/bitkit/ui/onboarding/CreateWalletScreen.kt +++ b/app/src/main/java/to/bitkit/ui/onboarding/CreateWalletScreen.kt @@ -60,7 +60,7 @@ fun CreateWalletScreen( .padding(top = 48.dp) ) { Display(text = stringResource(R.string.onboarding__slide4_header).withAccent()) - VerticalSpacer(14.dp) + VerticalSpacer(8.dp) BodyM( text = stringResource(R.string.onboarding__slide4_text).withAccent( defaultColor = Colors.White64, diff --git a/app/src/main/java/to/bitkit/ui/onboarding/InitializingWalletView.kt b/app/src/main/java/to/bitkit/ui/onboarding/InitializingWalletView.kt index bb49c39ff1..0090fe6872 100644 --- a/app/src/main/java/to/bitkit/ui/onboarding/InitializingWalletView.kt +++ b/app/src/main/java/to/bitkit/ui/onboarding/InitializingWalletView.kt @@ -2,6 +2,7 @@ package to.bitkit.ui.onboarding import android.annotation.SuppressLint import androidx.compose.animation.core.Animatable +import androidx.compose.animation.core.FastOutSlowInEasing import androidx.compose.animation.core.LinearEasing import androidx.compose.animation.core.RepeatMode import androidx.compose.animation.core.VectorConverter @@ -88,21 +89,21 @@ fun InitializingWalletView( targetValue = 1f, typeConverter = Float.VectorConverter, animationSpec = infiniteRepeatable( - animation = tween(durationMillis = 2000, easing = LinearEasing), + animation = tween(durationMillis = 3500, easing = FastOutSlowInEasing), repeatMode = RepeatMode.Restart, ), label = "rocketAnimation" ) val xOffset = lerp( - start = -maxWidth / 2 - 100.dp, - end = maxWidth / 2 + 100.dp, + start = -maxWidth / 2 - 70.dp, + end = maxWidth / 2 + 128.dp, fraction = rocketOffset, ) val yOffset = lerp( - start = maxHeight / 2 + 150.dp, - end = 0.dp - 100.dp, + start = maxHeight * 0.5f, + end = -(maxHeight * 0.25f), fraction = rocketOffset, ) diff --git a/app/src/main/java/to/bitkit/ui/onboarding/OnboardingSlidesScreen.kt b/app/src/main/java/to/bitkit/ui/onboarding/OnboardingSlidesScreen.kt index a6fdf39a1a..5777cebb6b 100644 --- a/app/src/main/java/to/bitkit/ui/onboarding/OnboardingSlidesScreen.kt +++ b/app/src/main/java/to/bitkit/ui/onboarding/OnboardingSlidesScreen.kt @@ -206,7 +206,7 @@ fun OnboardingTab( .defaultMinSize(minHeight = 255.dp) ) { Display(text = title.withAccent(accentColor = titleAccentColor)) - VerticalSpacer(14.dp) + VerticalSpacer(8.dp) BodyM( text = text, color = Colors.White64, diff --git a/app/src/main/java/to/bitkit/ui/onboarding/RestoreWalletScreen.kt b/app/src/main/java/to/bitkit/ui/onboarding/RestoreWalletScreen.kt index f58f184397..9d7f3c65f9 100644 --- a/app/src/main/java/to/bitkit/ui/onboarding/RestoreWalletScreen.kt +++ b/app/src/main/java/to/bitkit/ui/onboarding/RestoreWalletScreen.kt @@ -194,6 +194,7 @@ private fun Content( MnemonicInputField( label = "${index + 1}.", value = uiState.words[index], + isFocused = uiState.focusedIndex == index, isError = index in uiState.invalidWordIndices && uiState.focusedIndex != index, onValueChange = { onChangeWord(index, it) }, onFocusChange = { focused -> onChangeWordFocus(index, focused) }, @@ -213,6 +214,7 @@ private fun Content( MnemonicInputField( label = "${index + 1}.", value = uiState.words[index], + isFocused = uiState.focusedIndex == index, isError = index in uiState.invalidWordIndices && uiState.focusedIndex != index, onValueChange = { onChangeWord(index, it) }, onFocusChange = { focused -> onChangeWordFocus(index, focused) }, @@ -359,6 +361,7 @@ fun MnemonicInputField( label: String, isError: Boolean = false, value: String, + isFocused: Boolean, onValueChange: (String) -> Unit, onFocusChange: (Boolean) -> Unit, onPositionChange: (Int) -> Unit, @@ -382,7 +385,9 @@ fun MnemonicInputField( textFieldValue = it onValueChange(it.text) }, - textStyle = AppTextStyles.BodySSB, + textStyle = AppTextStyles.BodySSB.copy( + fontWeight = if (isFocused) FontWeight.SemiBold else FontWeight.Normal, + ), prefix = { Text( text = label, diff --git a/app/src/main/java/to/bitkit/ui/screens/scanner/QrScanningScreen.kt b/app/src/main/java/to/bitkit/ui/screens/scanner/QrScanningScreen.kt index fbf4b87664..d7836dad5e 100644 --- a/app/src/main/java/to/bitkit/ui/screens/scanner/QrScanningScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/scanner/QrScanningScreen.kt @@ -202,6 +202,7 @@ fun QrScanningScreen( grantedContent = { Content( isPubkyScan = isPubkyScan, + isFlashlightOn = isFlashlightOn, previewView = previewView, onClickFlashlight = { isFlashlightOn = !isFlashlightOn @@ -242,6 +243,7 @@ private fun handlePaste( @Composable private fun Content( isPubkyScan: Boolean, + isFlashlightOn: Boolean, previewView: PreviewView, onClickFlashlight: () -> Unit, onClickGallery: () -> Unit, @@ -272,7 +274,7 @@ private fun Content( modifier = Modifier .padding(16.dp) .clip(CircleShape) - .background(Colors.White64) + .background(Colors.White32) .size(CameraOverlayButtonSize) .align(Alignment.TopStart) ) { @@ -288,7 +290,7 @@ private fun Content( modifier = Modifier .padding(16.dp) .clip(CircleShape) - .background(Colors.White64) + .background(if (isFlashlightOn) Colors.White64 else Colors.White32) .size(CameraOverlayButtonSize) .align(Alignment.TopEnd) ) { diff --git a/app/src/main/java/to/bitkit/ui/screens/shop/shopDiscover/ShopDiscoverScreen.kt b/app/src/main/java/to/bitkit/ui/screens/shop/shopDiscover/ShopDiscoverScreen.kt index 54336975eb..2c53856f6d 100644 --- a/app/src/main/java/to/bitkit/ui/screens/shop/shopDiscover/ShopDiscoverScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/shop/shopDiscover/ShopDiscoverScreen.kt @@ -88,7 +88,6 @@ fun ShopDiscoverScreen( CustomTabRowWithSpacing( tabs = tabs, currentTabIndex = pagerState.currentPage, - selectedColor = Colors.White, onTabChange = { scope.launch { pagerState.animateScrollToPage(tabs.indexOf(it)) } }, modifier = Modifier.padding(horizontal = 16.dp) ) diff --git a/app/src/main/java/to/bitkit/ui/screens/transfer/SavingsAdvancedScreen.kt b/app/src/main/java/to/bitkit/ui/screens/transfer/SavingsAdvancedScreen.kt index 81adb95d2d..1116b50a89 100644 --- a/app/src/main/java/to/bitkit/ui/screens/transfer/SavingsAdvancedScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/transfer/SavingsAdvancedScreen.kt @@ -184,7 +184,7 @@ fun ChannelItem( color = Colors.White64, modifier = Modifier.padding(bottom = 8.dp) ) - MoneySSB(sats = balanceSat.toLong()) + MoneySSB(sats = balanceSat.toLong(), showSymbol = true) } Switch( checked = iSelected, diff --git a/app/src/main/java/to/bitkit/ui/screens/transfer/SettingUpScreen.kt b/app/src/main/java/to/bitkit/ui/screens/transfer/SettingUpScreen.kt index f0a120c3a2..39297d57db 100644 --- a/app/src/main/java/to/bitkit/ui/screens/transfer/SettingUpScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/transfer/SettingUpScreen.kt @@ -30,6 +30,7 @@ import to.bitkit.ui.appViewModel import to.bitkit.ui.components.BodyM import to.bitkit.ui.components.Display import to.bitkit.ui.components.PrimaryButton +import to.bitkit.ui.components.VerticalSpacer import to.bitkit.ui.scaffold.AppTopBar import to.bitkit.ui.scaffold.DrawerNavIcon import to.bitkit.ui.scaffold.ScreenColumn @@ -141,7 +142,7 @@ private fun SettingUpScreen( smallCircleRes = R.drawable.ln_sync_small, modifier = Modifier.weight(1f) ) - Spacer(modifier = Modifier.height(16.dp)) + VerticalSpacer(16.dp) val steps = persistentListOf( stringResource(R.string.lightning__setting_up_step1), stringResource(R.string.lightning__setting_up_step2), @@ -151,10 +152,9 @@ private fun SettingUpScreen( ProgressSteps( steps = steps, activeStepIndex = lightningSetupStep, - modifier = Modifier - .padding(vertical = 16.dp) - .align(alignment = Alignment.CenterHorizontally) + modifier = Modifier.align(alignment = Alignment.CenterHorizontally) ) + Spacer(modifier = Modifier.height(16.dp)) } else { Image( painter = painterResource(id = R.drawable.check), diff --git a/app/src/main/java/to/bitkit/ui/screens/transfer/SpendingAdvancedScreen.kt b/app/src/main/java/to/bitkit/ui/screens/transfer/SpendingAdvancedScreen.kt index e125e82ae1..1f2790e242 100644 --- a/app/src/main/java/to/bitkit/ui/screens/transfer/SpendingAdvancedScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/transfer/SpendingAdvancedScreen.kt @@ -204,7 +204,7 @@ private fun Content( .fillMaxSize() .testTag("SpendingAdvanced") ) { - VerticalSpacer(minHeight = 16.dp, maxHeight = 32.dp) + VerticalSpacer(32.dp) Display( text = stringResource(R.string.lightning__spending_advanced__title) @@ -212,7 +212,7 @@ private fun Content( modifier = Modifier.fillMaxWidth() ) - FillHeight() + VerticalSpacer(32.dp) NumberPadTextField( viewModel = amountInputViewModel, diff --git a/app/src/main/java/to/bitkit/ui/screens/transfer/SpendingAmountScreen.kt b/app/src/main/java/to/bitkit/ui/screens/transfer/SpendingAmountScreen.kt index ec1b4349d4..bf7c7436af 100644 --- a/app/src/main/java/to/bitkit/ui/screens/transfer/SpendingAmountScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/transfer/SpendingAmountScreen.kt @@ -193,7 +193,7 @@ private fun SpendingAmountNodeRunning( ) { val amountUiState by amountInputViewModel.uiState.collectAsStateWithLifecycle() - VerticalSpacer(minHeight = 16.dp, maxHeight = 32.dp) + VerticalSpacer(32.dp) Display( text = stringResource(R.string.lightning__spending_amount__title) @@ -201,7 +201,7 @@ private fun SpendingAmountNodeRunning( modifier = Modifier.fillMaxWidth() ) - FillHeight() + VerticalSpacer(32.dp) NumberPadTextField( viewModel = amountInputViewModel, @@ -217,9 +217,7 @@ private fun SpendingAmountNodeRunning( Row( verticalAlignment = Alignment.Bottom, horizontalArrangement = Arrangement.spacedBy(8.dp), - modifier = Modifier - .padding(vertical = 8.dp) - .testTag("SendAmountNumberPad") + modifier = Modifier.testTag("SendAmountNumberPad") ) { Column { Text13Up( @@ -228,7 +226,11 @@ private fun SpendingAmountNodeRunning( modifier = Modifier.testTag("SpendingAmountAvailable") ) VerticalSpacer(8.dp) - MoneySSB(sats = uiState.balanceAfterFee, modifier = Modifier.testTag("SpendingAmountUnit")) + MoneySSB( + sats = uiState.balanceAfterFee, + showSymbol = true, + modifier = Modifier.testTag("SpendingAmountUnit") + ) } FillWidth() UnitButton( @@ -250,8 +252,7 @@ private fun SpendingAmountNodeRunning( ) } - HorizontalDivider() - VerticalSpacer(16.dp) + HorizontalDivider(modifier = Modifier.padding(top = 12.dp)) NumberPad( viewModel = amountInputViewModel, diff --git a/app/src/main/java/to/bitkit/ui/screens/transfer/SpendingConfirmScreen.kt b/app/src/main/java/to/bitkit/ui/screens/transfer/SpendingConfirmScreen.kt index e4c67598aa..5591a954db 100644 --- a/app/src/main/java/to/bitkit/ui/screens/transfer/SpendingConfirmScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/transfer/SpendingConfirmScreen.kt @@ -19,8 +19,11 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag @@ -67,6 +70,8 @@ import to.bitkit.ui.utils.withAccent import to.bitkit.viewmodels.SettingsViewModel import to.bitkit.viewmodels.TransferViewModel +private const val SWIPE_ROTATION_DEGREES = 14f + @Composable fun SpendingConfirmScreen( viewModel: TransferViewModel, @@ -153,6 +158,8 @@ private fun Content( isConfirmPaying: Boolean, isAdvanced: Boolean, ) { + val swipeProgress = remember { mutableFloatStateOf(0f) } + ScreenColumn { AppTopBar( titleText = stringResource(R.string.lightning__transfer__nav_title), @@ -170,6 +177,7 @@ private fun Content( .padding(horizontal = 60.dp) .align(Alignment.BottomCenter) .padding(bottom = 76.dp) + .graphicsLayer { rotationZ = swipeProgress.floatValue * SWIPE_ROTATION_DEGREES } ) } @@ -239,7 +247,7 @@ private fun Content( modifier = Modifier.fillMaxWidth() ) - VerticalSpacer(31.dp) + VerticalSpacer(16.dp) Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) { PrimaryButton( @@ -277,6 +285,7 @@ private fun Content( text = stringResource(R.string.lightning__transfer__swipe), loading = isConfirmPaying || !isConfirmFeeReady, color = Colors.Purple, + progress = swipeProgress, onConfirm = { if (!canConfirm) return@SwipeToConfirm onTransferToSpendingConfirm() diff --git a/app/src/main/java/to/bitkit/ui/screens/transfer/components/ProgressSteps.kt b/app/src/main/java/to/bitkit/ui/screens/transfer/components/ProgressSteps.kt index 776ab54fd9..9c880e1358 100644 --- a/app/src/main/java/to/bitkit/ui/screens/transfer/components/ProgressSteps.kt +++ b/app/src/main/java/to/bitkit/ui/screens/transfer/components/ProgressSteps.kt @@ -7,7 +7,6 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size @@ -106,8 +105,12 @@ fun ProgressSteps( } } } - Spacer(modifier = Modifier.height(16.dp)) - BodySSB(text = steps[activeStepIndex], color = Colors.White32) + Box( + contentAlignment = Alignment.Center, + modifier = Modifier.height(56.dp) + ) { + BodySSB(text = steps[activeStepIndex], color = Colors.White32) + } } } diff --git a/app/src/main/java/to/bitkit/ui/screens/transfer/external/ExternalAmountScreen.kt b/app/src/main/java/to/bitkit/ui/screens/transfer/external/ExternalAmountScreen.kt index 650587cc1d..982195a72a 100644 --- a/app/src/main/java/to/bitkit/ui/screens/transfer/external/ExternalAmountScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/transfer/external/ExternalAmountScreen.kt @@ -131,7 +131,6 @@ private fun Content( Row( verticalAlignment = Alignment.Bottom, horizontalArrangement = Arrangement.spacedBy(8.dp), - modifier = Modifier.padding(vertical = 8.dp) ) { Column { Text13Up( @@ -169,8 +168,7 @@ private fun Content( ) } - HorizontalDivider() - VerticalSpacer(16.dp) + HorizontalDivider(modifier = Modifier.padding(top = 12.dp)) NumberPad( viewModel = amountInputViewModel, diff --git a/app/src/main/java/to/bitkit/ui/screens/transfer/hardware/SpendingAmountHwScreen.kt b/app/src/main/java/to/bitkit/ui/screens/transfer/hardware/SpendingAmountHwScreen.kt index eef71f8391..07239c550e 100644 --- a/app/src/main/java/to/bitkit/ui/screens/transfer/hardware/SpendingAmountHwScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/transfer/hardware/SpendingAmountHwScreen.kt @@ -199,7 +199,7 @@ private fun NodeRunning( ) { val amountUiState by amountInputViewModel.uiState.collectAsStateWithLifecycle() - VerticalSpacer(minHeight = 16.dp, maxHeight = 32.dp) + VerticalSpacer(32.dp) Display( text = stringResource(R.string.lightning__spending_amount__title) @@ -207,7 +207,7 @@ private fun NodeRunning( modifier = Modifier.fillMaxWidth() ) - FillHeight() + VerticalSpacer(32.dp) NumberPadTextField( viewModel = amountInputViewModel, @@ -223,9 +223,7 @@ private fun NodeRunning( Row( verticalAlignment = Alignment.Bottom, horizontalArrangement = Arrangement.spacedBy(8.dp), - modifier = Modifier - .padding(vertical = 8.dp) - .testTag("HardwareTransferAmountNumberPad") + modifier = Modifier.testTag("HardwareTransferAmountNumberPad") ) { Column { Text13Up( @@ -234,7 +232,11 @@ private fun NodeRunning( modifier = Modifier.testTag("HardwareTransferAmountAvailable") ) VerticalSpacer(8.dp) - MoneySSB(sats = uiState.balanceAfterFee, modifier = Modifier.testTag("HardwareTransferAmountUnit")) + MoneySSB( + sats = uiState.balanceAfterFee, + showSymbol = true, + modifier = Modifier.testTag("HardwareTransferAmountUnit") + ) } FillWidth() UnitButton( @@ -256,8 +258,7 @@ private fun NodeRunning( ) } - HorizontalDivider() - VerticalSpacer(16.dp) + HorizontalDivider(modifier = Modifier.padding(top = 12.dp)) NumberPad( viewModel = amountInputViewModel, diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/SavingsWalletScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/SavingsWalletScreen.kt index dd9d5cd21e..f9aa4c5da8 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/SavingsWalletScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/SavingsWalletScreen.kt @@ -168,6 +168,7 @@ fun SavingsWalletScreen( modifier = Modifier.testTag("TransferToSpending") ) } + item { VerticalSpacer(32.dp) } } activityListGroupedItems( diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt index 9432a30df7..2f2a40b2ad 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt @@ -191,6 +191,7 @@ fun SpendingWalletScreen( modifier = Modifier.testTag("TransferToSavings") ) } + item { VerticalSpacer(32.dp) } } activityListGroupedItems( diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt index 3b65369c6c..d9cc09ae9e 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt @@ -681,7 +681,7 @@ private fun ActivityDetailContent( enabled = shouldEnable, icon = { Icon( - painter = painterResource(R.drawable.ic_timer_alt), + painter = painterResource(R.drawable.ic_timer_alt_yellow), contentDescription = null, tint = accentColor, modifier = Modifier.size(16.dp) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/TagSelectorSheet.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/TagSelectorSheet.kt index 692cb8e38a..e561f8017a 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/TagSelectorSheet.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/TagSelectorSheet.kt @@ -5,7 +5,6 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.wrapContentHeight @@ -25,10 +24,12 @@ import kotlinx.collections.immutable.persistentSetOf import to.bitkit.R import to.bitkit.ui.activityListViewModel import to.bitkit.ui.appViewModel +import to.bitkit.ui.components.BodyS import to.bitkit.ui.components.BottomSheetPreview import to.bitkit.ui.components.Caption13Up import to.bitkit.ui.components.SheetSize import to.bitkit.ui.components.TagButton +import to.bitkit.ui.components.VerticalSpacer import to.bitkit.ui.scaffold.SheetTopBar import to.bitkit.ui.shared.modifiers.sheetHeight import to.bitkit.ui.shared.util.gradientBackground @@ -72,28 +73,32 @@ private fun Content( ) { SheetTopBar(stringResource(R.string.wallet__tags_filter_title)) - Spacer(modifier = Modifier.height(42.dp)) + VerticalSpacer(26.dp) Caption13Up( text = stringResource(R.string.wallet__tags_filter), color = Colors.White64, ) - Spacer(modifier = Modifier.height(16.dp)) + VerticalSpacer(16.dp) - FlowRow( - modifier = Modifier - .fillMaxWidth() - .wrapContentHeight(align = Alignment.Top), - horizontalArrangement = Arrangement.spacedBy(8.dp), - verticalArrangement = Arrangement.spacedBy(8.dp), - ) { - availableTags.forEach { tag -> - TagButton( - text = tag, - onClick = { onTagClick(tag) }, - isSelected = selectedTags.contains(tag) - ) + if (availableTags.isEmpty()) { + BodyS(text = stringResource(R.string.wallet__tags_no)) + } else { + FlowRow( + modifier = Modifier + .fillMaxWidth() + .wrapContentHeight(align = Alignment.Top), + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + availableTags.forEach { tag -> + TagButton( + text = tag, + onClick = { onTagClick(tag) }, + isSelected = selectedTags.contains(tag) + ) + } } } diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/components/ActivityListGrouped.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/components/ActivityListGrouped.kt index ebbf830c1e..43ec8a2e7d 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/components/ActivityListGrouped.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/components/ActivityListGrouped.kt @@ -123,7 +123,9 @@ fun ActivityListGrouped( isHardware = item.scopedId() in hardwareIds, contact = if (showContactAvatar) contactForActivity(item, contacts) else null, ) - VerticalSpacer(16.dp) + if (index < groupedItems.lastIndex) { + VerticalSpacer(16.dp) + } } } } @@ -133,9 +135,7 @@ fun ActivityListGrouped( TertiaryButton( text = stringResource(R.string.wallet__activity_show_all), onClick = onAllActivityButtonClick, - modifier = Modifier - .wrapContentWidth() - .padding(top = 8.dp) + modifier = Modifier.wrapContentWidth() ) } } @@ -219,7 +219,9 @@ fun LazyListScope.activityListGroupedItems( testTag = "Activity-$index", isHardware = item.scopedId() in hardwareIds, ) - VerticalSpacer(16.dp) + if (index < groupedItems.lastIndex) { + VerticalSpacer(16.dp) + } } } } @@ -229,9 +231,7 @@ fun LazyListScope.activityListGroupedItems( TertiaryButton( text = stringResource(R.string.wallet__activity_show_all), onClick = onAllActivityButtonClick, - modifier = Modifier - .wrapContentWidth() - .padding(top = 8.dp) + modifier = Modifier.wrapContentWidth() ) } } diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/components/ActivityListSimple.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/components/ActivityListSimple.kt index 2a220d64cc..d52ce7970a 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/components/ActivityListSimple.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/components/ActivityListSimple.kt @@ -2,7 +2,6 @@ package to.bitkit.ui.screens.wallets.activity.components import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -63,7 +62,6 @@ fun ActivityListSimple( onClick = onAllActivityClick, modifier = Modifier .wrapContentWidth() - .padding(top = 16.dp) .testTag("ActivityShowAll") ) } diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/components/CustomTabRowWithSpacing.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/components/CustomTabRowWithSpacing.kt index 02776a9d4a..65a0c2c54d 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/components/CustomTabRowWithSpacing.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/components/CustomTabRowWithSpacing.kt @@ -36,7 +36,7 @@ fun CustomTabRowWithSpacing( currentTabIndex: Int, onTabChange: (T) -> Unit, modifier: Modifier = Modifier, - selectedColor: Color = Colors.Brand, + selectedColor: Color = Colors.White, badgeCount: (T) -> Int? = { null }, ) { Column(modifier = modifier) { diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/receive/EditInvoiceScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/receive/EditInvoiceScreen.kt index d63aa3a642..12c87a11ff 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/receive/EditInvoiceScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/receive/EditInvoiceScreen.kt @@ -6,7 +6,6 @@ import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutVertically -import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.Column @@ -17,10 +16,9 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.HorizontalDivider -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme import androidx.compose.material3.TextField import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -31,10 +29,8 @@ import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag -import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.tooling.preview.Devices.NEXUS_5 @@ -57,9 +53,9 @@ import to.bitkit.repositories.WalletState import to.bitkit.ui.LocalCurrencies import to.bitkit.ui.appViewModel import to.bitkit.ui.blocktankViewModel +import to.bitkit.ui.components.AddTagButton import to.bitkit.ui.components.BodySSB import to.bitkit.ui.components.BottomSheetPreview -import to.bitkit.ui.components.ButtonSize import to.bitkit.ui.components.Caption13Up import to.bitkit.ui.components.FillHeight import to.bitkit.ui.components.NumberPad @@ -73,9 +69,9 @@ import to.bitkit.ui.scaffold.SheetTopBar import to.bitkit.ui.shared.modifiers.sheetHeight import to.bitkit.ui.shared.util.gradientBackground import to.bitkit.ui.theme.AppTextFieldDefaults +import to.bitkit.ui.theme.AppTextStyles import to.bitkit.ui.theme.AppThemeSurface import to.bitkit.ui.theme.Colors -import to.bitkit.ui.utils.keyboardAsState import to.bitkit.utils.Logger import to.bitkit.utils.ServiceError import to.bitkit.viewmodels.AmountInputViewModel @@ -107,7 +103,6 @@ fun EditInvoiceScreen( val context = LocalContext.current val blocktankVM = blocktankViewModel ?: return var keyboardVisible by remember { mutableStateOf(false) } - var isSoftKeyboardVisible by keyboardAsState() var isCreatingCjit by remember { mutableStateOf(false) } val amountInputUiState by amountInputViewModel.uiState.collectAsStateWithLifecycle() val currentReceiveSats by rememberUpdatedState(amountInputUiState.sats.toULong()) @@ -183,7 +178,6 @@ fun EditInvoiceScreen( isLoading = isLoading || isCreatingCjit, onClickAddTag = onClickAddTag, onClickTag = onClickTag, - isSoftKeyboardVisible = isSoftKeyboardVisible, showPaymentRequestButton = showPaymentRequestButton, onClickPaymentRequest = { onClickPaymentRequest(amountInputUiState.sats.toULong(), walletUiState.bip21Description) @@ -206,7 +200,6 @@ private fun ReceiveTab.toReceiveLiquiditySource(): ReceiveLiquiditySource { fun EditInvoiceContent( amountInputViewModel: AmountInputViewModel, noteText: String, - isSoftKeyboardVisible: Boolean, onchainOnly: Boolean = false, keyboardVisible: Boolean, tags: ImmutableList, @@ -234,24 +227,6 @@ fun EditInvoiceContent( ) { val maxHeight = this.maxHeight - AnimatedVisibility( - visible = !keyboardVisible && !isSoftKeyboardVisible, - enter = fadeIn(), - exit = fadeOut(), - modifier = Modifier - .fillMaxWidth() - .align(Alignment.BottomEnd) - ) { - Image( - painter = painterResource(R.drawable.coin_stack), - contentDescription = null, - contentScale = ContentScale.FillWidth, - modifier = Modifier - .fillMaxWidth() - .padding(32.dp) - ) - } - Column( modifier = Modifier .fillMaxSize() @@ -272,6 +247,7 @@ fun EditInvoiceContent( NumberPadTextField( viewModel = amountInputViewModel, + showEditButton = !keyboardVisible, onClick = onClickBalance, modifier = Modifier .fillMaxWidth() @@ -308,7 +284,7 @@ fun EditInvoiceContent( ) } - HorizontalDivider(modifier = Modifier.padding(top = 24.dp)) + HorizontalDivider(modifier = Modifier.padding(top = 12.dp)) NumberPad( viewModel = amountInputViewModel, @@ -337,7 +313,7 @@ fun EditInvoiceContent( Column { VerticalSpacer(44.dp) Caption13Up(text = stringResource(R.string.wallet__note), color = Colors.White64) - VerticalSpacer(16.dp) + VerticalSpacer(8.dp) TextField( placeholder = { @@ -348,12 +324,17 @@ fun EditInvoiceContent( }, value = noteText, onValueChange = onTextChanged, + textStyle = AppTextStyles.BodySSB, minLines = 4, keyboardOptions = KeyboardOptions.Default.copy( imeAction = ImeAction.Done ), - colors = AppTextFieldDefaults.semiTransparent, - shape = MaterialTheme.shapes.medium, + colors = AppTextFieldDefaults.semiTransparent.copy( + focusedContainerColor = Colors.White06, + unfocusedContainerColor = Colors.White06, + errorContainerColor = Colors.White06, + ), + shape = RoundedCornerShape(8.dp), modifier = Modifier .fillMaxWidth() .testTag("ReceiveNote") @@ -367,9 +348,7 @@ fun EditInvoiceContent( FlowRow( horizontalArrangement = Arrangement.spacedBy(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp), - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 16.dp) + modifier = Modifier.fillMaxWidth() ) { tags.forEach { tagText -> TagButton( @@ -378,21 +357,11 @@ fun EditInvoiceContent( onClick = { onClickTag(tagText) }, ) } + AddTagButton( + onClick = onClickAddTag, + modifier = Modifier.testTag("TagsAdd") + ) } - PrimaryButton( - text = stringResource(R.string.wallet__tags_add), - size = ButtonSize.Small, - onClick = { onClickAddTag() }, - icon = { - Icon( - painter = painterResource(R.drawable.ic_tag), - contentDescription = null, - tint = Colors.Brand - ) - }, - fullWidth = false, - modifier = Modifier.testTag("TagsAdd") - ) } FillHeight() @@ -445,7 +414,6 @@ private fun Preview() { tags = persistentListOf(), onClickAddTag = {}, onClickTag = {}, - isSoftKeyboardVisible = false, modifier = Modifier.sheetHeight(), ) } @@ -469,7 +437,6 @@ private fun PreviewWithTags() { tags = persistentListOf("Team", "Dinner", "Home", "Work"), onClickAddTag = {}, onClickTag = {}, - isSoftKeyboardVisible = false, modifier = Modifier.sheetHeight(), ) } @@ -493,7 +460,6 @@ private fun PreviewWithKeyboard() { tags = persistentListOf("Team", "Dinner", "Home"), onClickAddTag = {}, onClickTag = {}, - isSoftKeyboardVisible = false, modifier = Modifier.sheetHeight(), ) } @@ -517,7 +483,6 @@ private fun PreviewSmallScreen() { tags = persistentListOf("Team", "Dinner", "Home"), onClickAddTag = {}, onClickTag = {}, - isSoftKeyboardVisible = false, modifier = Modifier.sheetHeight(), ) } diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/receive/ReceiveConfirmScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/receive/ReceiveConfirmScreen.kt index 26dfa90e49..0bb147def5 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/receive/ReceiveConfirmScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/receive/ReceiveConfirmScreen.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember @@ -25,8 +26,6 @@ import com.synonym.bitkitcore.IcJitEntry import kotlinx.serialization.Serializable import to.bitkit.R import to.bitkit.models.CjitQuoteValidator -import to.bitkit.models.PrimaryDisplay -import to.bitkit.ui.LocalCurrencies import to.bitkit.ui.components.BalanceHeaderView import to.bitkit.ui.components.BodyM import to.bitkit.ui.components.BottomSheetPreview @@ -34,8 +33,8 @@ import to.bitkit.ui.components.Caption13Up import to.bitkit.ui.components.FillHeight import to.bitkit.ui.components.PrimaryButton import to.bitkit.ui.components.SecondaryButton -import to.bitkit.ui.components.Title import to.bitkit.ui.components.VerticalSpacer +import to.bitkit.ui.components.rememberMoneyText import to.bitkit.ui.components.settings.SettingsSwitchRow import to.bitkit.ui.currencyViewModel import to.bitkit.ui.openNotificationSettings @@ -43,6 +42,7 @@ import to.bitkit.ui.scaffold.SheetTopBar import to.bitkit.ui.shared.modifiers.sheetHeight import to.bitkit.ui.shared.util.gradientBackground import to.bitkit.ui.theme.AppSwitchDefaults +import to.bitkit.ui.theme.AppTextStyles import to.bitkit.ui.theme.AppThemeSurface import to.bitkit.ui.theme.Colors import to.bitkit.ui.utils.rememberNotificationToggleClick @@ -61,8 +61,6 @@ fun ReceiveConfirmScreen( val context = LocalContext.current val currency = currencyViewModel ?: return - val currencies = LocalCurrencies.current - val notificationsGranted by settingsViewModel.notificationsGranted.collectAsStateWithLifecycle() val networkFeeFormatted = remember(entry.networkFeeSat) { @@ -77,20 +75,11 @@ fun ReceiveConfirmScreen( ?: entry.serviceFeeSat.toString() } - val displayUnit = currencies.displayUnit - val primaryDisplay = currencies.primaryDisplay - val receiveAmountFormatted = remember(entry.receiveAmountSats, entry.feeSat, primaryDisplay, displayUnit) { - val sats = entry.receiveAmountSats - entry.feeSat - - currency.convert(sats)?.let { converted -> - if (primaryDisplay == PrimaryDisplay.BITCOIN) { - val btcComponents = converted.bitcoinDisplay(displayUnit) - "${btcComponents.symbol} ${btcComponents.value}" - } else { - converted.formattedWithSymbol() - } - } ?: sats.toString() - } + val receiveAmountSats = entry.receiveAmountSats - entry.feeSat + val receiveAmountFormatted = rememberMoneyText( + sats = receiveAmountSats, + showSymbol = true, + ) ?: receiveAmountSats.toString() val onNotificationSwitchClick = rememberNotificationToggleClick( isGranted = notificationsGranted, @@ -161,7 +150,13 @@ private fun Content( Column { Caption13Up(text = stringResource(R.string.wallet__receive_will), color = Colors.White64) VerticalSpacer(4.dp) - Title(text = receiveAmountFormatted) + Text( + text = receiveAmountFormatted.withAccent( + defaultColor = Colors.White, + accentColor = Colors.White64, + ), + style = AppTextStyles.Title, + ) } FillHeight() diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/receive/ReceiveQrScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/receive/ReceiveQrScreen.kt index 5a9e04890b..054b8f864d 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/receive/ReceiveQrScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/receive/ReceiveQrScreen.kt @@ -297,7 +297,6 @@ fun ReceiveQrScreen( CustomTabRowWithSpacing( tabs = visibleTabs, currentTabIndex = visibleTabs.indexOf(selectedTab), - selectedColor = Colors.White, onTabChange = { tab -> haptic.performHapticFeedback(HapticFeedbackType.TextHandleMove) val newIndex = visibleTabs.indexOf(tab) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/send/AddTagScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/send/AddTagScreen.kt index a355b3d340..fcb0162207 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/send/AddTagScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/send/AddTagScreen.kt @@ -37,6 +37,7 @@ import to.bitkit.ui.components.VerticalSpacer import to.bitkit.ui.scaffold.SheetTopBar import to.bitkit.ui.shared.modifiers.sheetHeight import to.bitkit.ui.shared.util.gradientBackground +import to.bitkit.ui.theme.AppTextFieldDefaults import to.bitkit.ui.theme.AppThemeSurface import to.bitkit.ui.theme.Colors import to.bitkit.ui.theme.TRANSITION_SCREEN_MS @@ -132,6 +133,11 @@ fun AddTagContent( if (uiState.canSubmit) onTagConfirmed(uiState.confirmedTag) }), inputTransform = String::sanitizeTag, + colors = AppTextFieldDefaults.semiTransparent.copy( + focusedContainerColor = Colors.White06, + unfocusedContainerColor = Colors.White06, + errorContainerColor = Colors.White06, + ), modifier = Modifier .focusRequester(focusRequester) .fillMaxWidth() diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendAddressScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendAddressScreen.kt index e81da9c81b..a1c472b3ec 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendAddressScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendAddressScreen.kt @@ -30,6 +30,7 @@ import to.bitkit.ui.components.VerticalSpacer import to.bitkit.ui.scaffold.SheetTopBar import to.bitkit.ui.shared.modifiers.sheetHeight import to.bitkit.ui.shared.util.gradientBackground +import to.bitkit.ui.theme.AppTextFieldDefaults import to.bitkit.ui.theme.AppTextStyles import to.bitkit.ui.theme.AppThemeSurface import to.bitkit.ui.theme.Colors @@ -79,6 +80,11 @@ fun SendAddressScreen( autoCorrectEnabled = false ), textStyle = AppTextStyles.Title, + colors = AppTextFieldDefaults.semiTransparent.copy( + focusedContainerColor = Colors.White06, + unfocusedContainerColor = Colors.White06, + errorContainerColor = Colors.White06, + ), modifier = Modifier .fillMaxWidth() .focusRequester(focusRequester) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendAmountScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendAmountScreen.kt index 72a2ffd7d9..b24890b525 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendAmountScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendAmountScreen.kt @@ -316,7 +316,7 @@ private fun SendAmountNodeRunning( ) } - HorizontalDivider(modifier = Modifier.padding(top = 24.dp)) + HorizontalDivider(modifier = Modifier.padding(top = 12.dp)) NumberPad( viewModel = amountInputViewModel, diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendRecipientScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendRecipientScreen.kt index ff9819bbfa..10b217beff 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendRecipientScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendRecipientScreen.kt @@ -241,6 +241,7 @@ fun SendRecipientScreen( SendRecipientContent( previewView = previewView, + isFlashlightOn = isFlashlightOn, onClickFlashlight = { camera?.cameraControl?.let { control -> isFlashlightOn = !isFlashlightOn @@ -275,6 +276,7 @@ fun SendRecipientScreen( @Composable private fun SendRecipientContent( previewView: PreviewView?, + isFlashlightOn: Boolean, onClickFlashlight: () -> Unit, onClickGallery: () -> Unit, onClickContact: () -> Unit, @@ -306,6 +308,7 @@ private fun SendRecipientContent( if (cameraPermissionGranted && previewView != null) { CameraPreviewWithControls( previewView = previewView, + isFlashlightOn = isFlashlightOn, onClickFlashlight = onClickFlashlight, onClickGallery = onClickGallery, modifier = Modifier.fillMaxSize() @@ -355,6 +358,7 @@ private fun SendRecipientContent( @Composable private fun CameraPreviewWithControls( previewView: PreviewView, + isFlashlightOn: Boolean, onClickFlashlight: () -> Unit, onClickGallery: () -> Unit, modifier: Modifier = Modifier, @@ -377,7 +381,7 @@ private fun CameraPreviewWithControls( modifier = Modifier .padding(16.dp) .clip(CircleShape) - .background(Colors.White64) + .background(Colors.White32) .size(CameraOverlayButtonSize) .align(Alignment.TopStart) ) { @@ -402,7 +406,7 @@ private fun CameraPreviewWithControls( modifier = Modifier .padding(16.dp) .clip(CircleShape) - .background(Colors.White64) + .background(if (isFlashlightOn) Colors.White64 else Colors.White32) .size(CameraOverlayButtonSize) .align(Alignment.TopEnd) ) { @@ -494,6 +498,7 @@ private fun Preview() { BottomSheetPreview { SendRecipientContent( previewView = null, + isFlashlightOn = false, onClickFlashlight = {}, onClickGallery = {}, onClickContact = {}, diff --git a/app/src/main/java/to/bitkit/ui/settings/SettingsScreen.kt b/app/src/main/java/to/bitkit/ui/settings/SettingsScreen.kt index c037f21dc8..b815aa3ce3 100644 --- a/app/src/main/java/to/bitkit/ui/settings/SettingsScreen.kt +++ b/app/src/main/java/to/bitkit/ui/settings/SettingsScreen.kt @@ -61,7 +61,6 @@ import to.bitkit.ui.screens.wallets.activity.components.CustomTabRowWithSpacing import to.bitkit.ui.screens.wallets.activity.components.TabItem import to.bitkit.ui.settingsViewModel import to.bitkit.ui.theme.AppThemeSurface -import to.bitkit.ui.theme.Colors import to.bitkit.ui.utils.rememberBiometricAuthSupported import to.bitkit.viewmodels.LanguageViewModel @@ -241,7 +240,6 @@ private fun SettingsContent( CustomTabRowWithSpacing( tabs = tabs, currentTabIndex = pagerState.currentPage, - selectedColor = Colors.White, onTabChange = { scope.launch { pagerState.animateScrollToPage(tabs.indexOf(it)) } }, modifier = Modifier.padding(horizontal = 16.dp) ) diff --git a/app/src/main/java/to/bitkit/ui/settings/backgroundPayments/BackgroundPaymentsIntroScreen.kt b/app/src/main/java/to/bitkit/ui/settings/backgroundPayments/BackgroundPaymentsIntroScreen.kt index 8a20acf46a..ce5363abeb 100644 --- a/app/src/main/java/to/bitkit/ui/settings/backgroundPayments/BackgroundPaymentsIntroScreen.kt +++ b/app/src/main/java/to/bitkit/ui/settings/backgroundPayments/BackgroundPaymentsIntroScreen.kt @@ -84,7 +84,7 @@ fun BackgroundPaymentsIntroContent( text = stringResource(R.string.settings__bg__intro_title).withAccent(accentColor = Colors.Purple), color = Colors.White, ) - VerticalSpacer(14.dp) + VerticalSpacer(8.dp) BodyM(text = stringResource(R.string.settings__bg__intro_desc), color = Colors.White64) VerticalSpacer(32.dp) Row( diff --git a/app/src/main/java/to/bitkit/ui/settings/backups/BackupIntroScreen.kt b/app/src/main/java/to/bitkit/ui/settings/backups/BackupIntroScreen.kt index 4efd1aa552..e2e47edee9 100644 --- a/app/src/main/java/to/bitkit/ui/settings/backups/BackupIntroScreen.kt +++ b/app/src/main/java/to/bitkit/ui/settings/backups/BackupIntroScreen.kt @@ -6,11 +6,13 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -48,14 +50,16 @@ fun BackupIntroScreen( SheetTopBar(stringResource(R.string.security__backup_wallet)) Column( horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier.padding(horizontal = 16.dp), + modifier = Modifier.padding(horizontal = 32.dp), ) { Image( painter = painterResource(R.drawable.safe), contentDescription = null, + contentScale = ContentScale.Fit, modifier = Modifier .fillMaxWidth() .weight(1f) + .heightIn(max = 320.dp) .testTag("BackupIntroViewImage") ) Display( diff --git a/app/src/main/java/to/bitkit/ui/settings/lightning/LightningConnectionsScreen.kt b/app/src/main/java/to/bitkit/ui/settings/lightning/LightningConnectionsScreen.kt index 4c19139542..29f0a4f4ff 100644 --- a/app/src/main/java/to/bitkit/ui/settings/lightning/LightningConnectionsScreen.kt +++ b/app/src/main/java/to/bitkit/ui/settings/lightning/LightningConnectionsScreen.kt @@ -1,5 +1,6 @@ package to.bitkit.ui.settings.lightning +import androidx.annotation.DrawableRes import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement @@ -15,8 +16,6 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add -import androidx.compose.material.icons.filled.ArrowDownward -import androidx.compose.material.icons.filled.ArrowUpward import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon @@ -32,7 +31,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource @@ -286,20 +284,20 @@ private fun LightningBalancesSection(localBalance: ULong, remoteBalance: ULong) BalanceColumn( label = stringResource(R.string.lightning__spending_label), balance = localBalance, - icon = Icons.Default.ArrowUpward, + icon = R.drawable.ic_sent, color = Colors.Purple, ) BalanceColumn( label = stringResource(R.string.lightning__receiving_label), balance = remoteBalance, - icon = Icons.Default.ArrowDownward, + icon = R.drawable.ic_received, color = Colors.White, ) } } @Composable -private fun BalanceColumn(label: String, balance: ULong, icon: ImageVector, color: Color) { +private fun BalanceColumn(label: String, balance: ULong, @DrawableRes icon: Int, color: Color) { Column { Caption13Up(text = label, color = Colors.White64) VerticalSpacer(8.dp) @@ -307,7 +305,7 @@ private fun BalanceColumn(label: String, balance: ULong, icon: ImageVector, colo verticalAlignment = Alignment.CenterVertically, ) { Icon( - imageVector = icon, + painter = painterResource(icon), contentDescription = null, tint = color, modifier = Modifier.size(22.dp) @@ -404,7 +402,7 @@ private fun EmptyStateContent(modifier: Modifier = Modifier) { .withAccent(accentColor = Colors.Purple), ) - VerticalSpacer(14.dp) + VerticalSpacer(8.dp) BodyM( text = stringResource(R.string.lightning__conn_onboarding_text), diff --git a/app/src/main/java/to/bitkit/ui/settings/transactionSpeed/TransactionSpeedSettingsScreen.kt b/app/src/main/java/to/bitkit/ui/settings/transactionSpeed/TransactionSpeedSettingsScreen.kt index 35db5e6807..5db7bbc3fe 100644 --- a/app/src/main/java/to/bitkit/ui/settings/transactionSpeed/TransactionSpeedSettingsScreen.kt +++ b/app/src/main/java/to/bitkit/ui/settings/transactionSpeed/TransactionSpeedSettingsScreen.kt @@ -94,7 +94,7 @@ private fun TransactionSpeedSettingsContent( title = stringResource(R.string.settings__fee__custom__label), subtitle = stringResource(R.string.settings__fee__custom__description), iconRes = R.drawable.ic_settings, - iconTint = Colors.White, + iconTint = Colors.White64, value = SettingsButtonValue.BooleanValue(selectedSpeed is TransactionSpeed.Custom), onClick = onCustomFeeClick, modifier = Modifier.testTag("custom") diff --git a/app/src/main/java/to/bitkit/ui/sheets/BoostTransactionSheet.kt b/app/src/main/java/to/bitkit/ui/sheets/BoostTransactionSheet.kt index c9fe07801d..23cfddc6a0 100644 --- a/app/src/main/java/to/bitkit/ui/sheets/BoostTransactionSheet.kt +++ b/app/src/main/java/to/bitkit/ui/sheets/BoostTransactionSheet.kt @@ -27,6 +27,7 @@ import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel @@ -42,7 +43,7 @@ import to.bitkit.ui.components.BottomSheetPreview import to.bitkit.ui.components.ButtonSize import to.bitkit.ui.components.FillHeight import to.bitkit.ui.components.HorizontalSpacer -import to.bitkit.ui.components.PrimaryButton +import to.bitkit.ui.components.SecondaryButton import to.bitkit.ui.components.SheetSize import to.bitkit.ui.components.SwipeToConfirm import to.bitkit.ui.components.VerticalSpacer @@ -235,8 +236,9 @@ private fun DefaultModeContent( horizontalArrangement = Arrangement.spacedBy(4.dp) ) { val feeText = - rememberMoneyText(sats = uiState.totalFeeSats.toLong())?.withAccent(defaultColor = Colors.White) - ?.toString().orEmpty() + rememberMoneyText(sats = uiState.totalFeeSats.toLong(), showSymbol = true) + ?.withAccent(defaultColor = Colors.White, accentColor = Colors.White) + ?: AnnotatedString("") BodyMSB( text = feeText, @@ -255,8 +257,9 @@ private fun DefaultModeContent( val feeTextSecondary = rememberMoneyText( sats = uiState.totalFeeSats.toLong(), - reversed = true - )?.withAccent(defaultColor = Colors.White64)?.toString().orEmpty() + reversed = true, + showSymbol = true, + )?.withAccent(defaultColor = Colors.White64, accentColor = Colors.White64) ?: AnnotatedString("") BodySSB( text = feeTextSecondary, @@ -311,12 +314,8 @@ private fun CustomModeContent( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(2.dp) ) { - val rateText = - rememberMoneyText(sats = uiState.feeRate.toLong())?.withAccent(defaultColor = Colors.White) - ?.toString().orEmpty() - BodyMSB( - text = "$rateText/vbyte ($BITCOIN_SYMBOL ${uiState.totalFeeSats})", + text = "$BITCOIN_SYMBOL ${uiState.feeRate}/vbyte", color = Colors.White, modifier = Modifier.testTag(BoostTransactionTestTags.FEE_RATE_TEXT) ) @@ -326,8 +325,9 @@ private fun CustomModeContent( ) { val feeTextSecondary = rememberMoneyText( sats = uiState.totalFeeSats.toLong(), - reversed = true - )?.withAccent(defaultColor = Colors.White64)?.toString().orEmpty() + reversed = true, + showSymbol = true, + )?.withAccent(defaultColor = Colors.White64, accentColor = Colors.White64) ?: AnnotatedString("") BodySSB( text = feeTextSecondary, @@ -356,7 +356,7 @@ private fun CustomModeContent( VerticalSpacer(16.dp) - PrimaryButton( + SecondaryButton( text = stringResource(R.string.wallet__boost_recomended_button), fullWidth = false, onClick = onClickUseSuggestedFee, diff --git a/app/src/main/java/to/bitkit/ui/sheets/BoostTransactionViewModel.kt b/app/src/main/java/to/bitkit/ui/sheets/BoostTransactionViewModel.kt index e814bb10fa..37caf5c052 100644 --- a/app/src/main/java/to/bitkit/ui/sheets/BoostTransactionViewModel.kt +++ b/app/src/main/java/to/bitkit/ui/sheets/BoostTransactionViewModel.kt @@ -18,7 +18,7 @@ import org.lightningdevkit.ldknode.Txid import to.bitkit.ext.BoostType import to.bitkit.ext.boostType import to.bitkit.ext.nowTimestamp -import to.bitkit.models.FeeRate.Companion.getFeeShortDescription +import to.bitkit.models.FeeRate import to.bitkit.models.TransactionSpeed import to.bitkit.repositories.ActivityRepo import to.bitkit.repositories.BlocktankRepo @@ -140,7 +140,10 @@ class BoostTransactionViewModel @Inject constructor( val isIncreaseEnabled = totalFee < maxTotalFee && feeRate < MAX_FEE_RATE val isDecreaseEnabled = totalFee > currentFee && feeRate > minFeeRate val feeRates = blocktankRepo.blocktankState.value.info?.onchain?.feeRates - val estimateTime = context.getFeeShortDescription(feeRate, feeRates) + val estimateTime = feeRates + ?.let { FeeRate.fromSatsPerVByte(feeRate, it) } + ?.let { context.getString(it.duration) } + ?: context.getString(FeeRate.NORMAL.duration) _uiState.update { it.copy( diff --git a/app/src/main/java/to/bitkit/ui/sheets/GiftLoading.kt b/app/src/main/java/to/bitkit/ui/sheets/GiftLoading.kt index 8b05bb2341..eb27d3bb45 100644 --- a/app/src/main/java/to/bitkit/ui/sheets/GiftLoading.kt +++ b/app/src/main/java/to/bitkit/ui/sheets/GiftLoading.kt @@ -15,6 +15,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import to.bitkit.R import to.bitkit.models.BITCOIN_SYMBOL @@ -76,6 +77,7 @@ private fun Content( ) { Display( text = BITCOIN_SYMBOL, + fontWeight = FontWeight.ExtraBold, color = Colors.White, modifier = Modifier.padding(end = 6.dp), ) @@ -106,6 +108,7 @@ private fun Content( ) { Display( text = fiatSymbol, + fontWeight = FontWeight.ExtraBold, color = Colors.White, modifier = Modifier.padding(end = 6.dp), ) diff --git a/app/src/main/java/to/bitkit/ui/sheets/QrScanningSheet.kt b/app/src/main/java/to/bitkit/ui/sheets/QrScanningSheet.kt index d0086f37a6..4bf03d868a 100644 --- a/app/src/main/java/to/bitkit/ui/sheets/QrScanningSheet.kt +++ b/app/src/main/java/to/bitkit/ui/sheets/QrScanningSheet.kt @@ -16,7 +16,11 @@ fun QrScanningSheet( ) { Content( isPubkyScan = sheet.isPubkyScan, - onBack = { appViewModel.hideScannerSheet() }, + onBack = if (sheet.showBackButton) { + { appViewModel.hideScannerSheet() } + } else { + null + }, onScanSuccess = { appViewModel.onScannerSheetResult(it) }, ) } @@ -24,7 +28,7 @@ fun QrScanningSheet( @Composable private fun Content( isPubkyScan: Boolean, - onBack: () -> Unit, + onBack: (() -> Unit)?, onScanSuccess: (String) -> Unit, ) { Column( diff --git a/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt b/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt index c912066536..38a07e8498 100644 --- a/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt +++ b/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt @@ -4629,10 +4629,16 @@ class AppViewModel @Inject constructor( fun showScannerSheet( isPubkyScan: Boolean = false, + showBackButton: Boolean = true, onResult: ((String) -> Unit)? = null, ) { scanResultHandler = onResult - showSheet(Sheet.QrScanner(isPubkyScan = isPubkyScan)) + showSheet( + Sheet.QrScanner( + isPubkyScan = isPubkyScan, + showBackButton = showBackButton, + ) + ) } fun onScannerSheetResult(data: String) { diff --git a/app/src/main/res/drawable/ic_arrow_right.xml b/app/src/main/res/drawable/ic_arrow_right.xml new file mode 100644 index 0000000000..199a033449 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_right.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 2758d4211d..71e667dd80 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -68,19 +68,25 @@ نعم نعم، تابع يعتمد على الرسوم + يعتمد على الرسوم يعتمد على الرسوم مخصص ±10-20 دقيقة + ±10 دقائق ±10د سريع + ±2 ثانية فوري +2 ساعة + +2 ساعة +2س الحد الأدنى ±20-60 دقيقة + ±20 دقيقة ±20د عادي ±1-2 ساعة + ±1 ساعة ±1س بطيء عادةً ما يكون تحويل الأموال إلى المدخرات فوريًا، لكن قد تستغرق التسوية حتى <accent>14 يومًا</accent> في ظروف شبكة معينة. diff --git a/app/src/main/res/values-b+es+419/strings.xml b/app/src/main/res/values-b+es+419/strings.xml index 3cb9b455a9..08b8d31b53 100644 --- a/app/src/main/res/values-b+es+419/strings.xml +++ b/app/src/main/res/values-b+es+419/strings.xml @@ -68,19 +68,25 @@ Sí, continuar Depende de la tarifa + Depende de la tarifa Depende de la tarifa Personalizado ±10-20 minutos + ±10 minutos ±10m Rápido + ±2 segundos Instantáneo +2 horas + +2 horas +2h Mínimo ±20-60 minutos + ±20 minutos ±20m Normal ±1-2 horas + ±1 hora ±1h Lento La transferencia de fondos a ahorros suele ser instantánea, pero la liquidación puede tardar hasta <accent>14 días</accent> según las condiciones de red. @@ -317,7 +323,7 @@ Bitkit no tiene soporte Lightning en tu región, pero puedes usar nodos externos manualmente. Gasta bitcoin más rápido que nunca. Disfruta pagos instantáneos y baratos con amigos, familia y comercios. La privacidad\n<accent>no es un delito</accent> - Desliza para ocultar tu saldo, disfruta pagos más privados y protege tu wallet activando funciones de seguridad. + Tu dinero, tu privacidad. Desliza para ocultar tu saldo y gasta de forma más privada, sin rastreo de datos y sin KYC. Tus llaves\n<accent>tus monedas</accent> Vamos a crear tu billetera. Ten en cuenta que Bitkit es un app para móviles. <accent>No almacene todo su dinero en Bitkit.</accent> Términos de uso @@ -964,6 +970,7 @@ Seleccionar etiqueta Nueva etiqueta Introduzca una nueva etiqueta + Aún no hay etiquetas disponibles Etiquetas utilizadas anteriormente El pago Lightning se detuvo antes de completarse. Este pago Lightning venció. Solicite una factura nueva. diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index bc75f7329e..0f4885df8d 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -68,19 +68,25 @@ Sí, continua Depèn de la tarifa + Depèn de la tarifa Depèn de la tarifa Personalitzat ±10-20 minuts + ±10 minuts ±10m Ràpid + ±2 segons Instant +2 hores + +2 hores +2h Mínim ±20-60 minuts + ±20 minuts ±20m Normal ±1-2 hores + ±1 hora ±1h Lent La transferència de fons a estalvis sol ser instantània, però la liquidació pot trigar fins a <accent>14 dies</accent> en certes condicions de xarxa. @@ -964,6 +970,7 @@ Selecciona etiqueta Nova etiqueta Introdueix una nova etiqueta + Cap etiqueta disponible encara Etiquetes prèviament utilitzades El pagament Lightning s\'ha aturat abans de completar-se. Aquest pagament Lightning ha caducat. Demana una factura nova. diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index d68193f274..5ea9afbd88 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -68,19 +68,25 @@ Ano Ano, pokračovat Odvíjí se od poplatku + Odvíjí se od poplatku Odvíjí se od poplatku Vlastní +/- 10-20 minut + +/- 10 minut +/- 10m Rychle + +/- 2 sekundy Okamžitě +2 hodiny + +2 hodiny +2h Minimum +/- 20-60 minut + +/- 20 minut +/- 20m Standardní +/- 1-2 hodiny + +/- 1 hodina +/- 1h Pomalu Převod peněz na spořicí účet je obvykle okamžitý, ale za určitých síťových podmínek může vypořádání trvat až <accent>14 dní</accent>. @@ -964,6 +970,7 @@ Vyberte popisek Nový tag Vložte nový tag + Zatím nejsou k dispozici žádné popisky Dříve použité tagy Lightning platba byla zastavena před dokončením. Platnost této Lightning platby vypršela. Vyžádejte si novou fakturu. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index e7d1872c3a..00607ac192 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -67,21 +67,27 @@ Verwendbar Ja Ja, Weiter + ±2 Sekunden Sofort Schnell ±10-20 Minuten + ±10 Minuten ±10m Normal ±20-60 Minuten + ±20 Minuten ±20m Langsam ±1-2 Stunden + ±1 Stunde ±1h Minimum +2 Stunden + +2 Stunden +2h Benutzerdefiniert Abhängig von der Gebühr + Abhängig von der Gebühr Abhängig von der Gebühr Spending\n<accent>Balance</accent> Fülle dein Guthaben auf, um sofortige und günstige Transaktionen mit Freunden, Familie und Händlern zu genießen. @@ -836,6 +842,7 @@ Hinzufügen Neuer Tag Neuen Tag eingeben + Noch keine Tags verfügbar Früher verwendete Tags Aktivität nach Tags filtern Tag auswählen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index bff3a035c9..99f52ff5c1 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -68,19 +68,25 @@ Ναι Ναι, Προχώρα Εξαρτάται από το τέλος + Εξαρτάται από το τέλος Εξαρτάται από το τέλος Προσαρμοσμένο ±10-20 λεπτά + ±10 λεπτά ±10 λεπτά Γρήγορα + ±2 δευτερόλεπτα Άμεσα +2 ώρες + +2 ώρες +2 ώρες Ελάχιστο ±20-60 λεπτά + ±20 λεπτά ±20 λεπτά Κανονικά ±1-2 ώρες + ±1 ώρα ±1 ώρα Αργά Η μεταφορά κεφαλαίων στις αποταμιεύσεις είναι συνήθως άμεση, αλλά η εκκαθάριση μπορεί να διαρκέσει έως <accent>14 ημέρες</accent> υπό ορισμένες συνθήκες δικτύου. @@ -317,7 +323,7 @@ *Το Bitkit δεν παρέχει προς το παρόν υπηρεσίες Lightning στη χώρα σου, αλλά μπορείς να συνδεθείς σε άλλους κόμβους. Ξόδεψε bitcoin πιο γρήγορα από ποτέ. Απόλαυσε άμεσες και φθηνές πληρωμές με φίλους, οικογένεια και εμπόρους. Το απόρρητο δεν\n<accent>είναι έγκλημα</accent> - Σύρε για να κρύψεις το υπόλοιπό σου, απόλαυσε πιο ιδιωτικές πληρωμές και προστάτεψε το πορτοφόλι σου ενεργοποιώντας λειτουργίες ασφαλείας. + Τα χρήματά σας, η ιδιωτικότητά σας. Σύρετε για να κρύψετε το υπόλοιπό σας και ξοδέψτε πιο ιδιωτικά, χωρίς παρακολούθηση δεδομένων και μηδενικό KYC. Τα κλειδιά σου,\n<accent>τα κέρματά σου</accent> Ας δημιουργήσουμε το πορτοφόλι σου. Να γνωρίζεις ότι το Bitkit είναι λογισμικό κινητού. <accent>Μην αποθηκεύεις όλα τα χρήματά σου στο Bitkit.</accent> Όροι χρήσης @@ -964,6 +970,7 @@ Επιλογή ετικέτας Νέα ετικέτα Εισάγαγε νέα ετικέτα + Δεν υπάρχουν διαθέσιμες ετικέτες ακόμα Προηγούμενες ετικέτες Η πληρωμή Lightning σταμάτησε πριν ολοκληρωθεί. Αυτή η πληρωμή Lightning έληξε. Ζητήστε νέο τιμολόγιο. diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 7c54fd7292..e2db33121e 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -68,19 +68,25 @@ Sí, proceda Depende de la tarifa + Depende de la tarifa Depende de la tarifa Personalizar ±10-20 minutos + ±10 minutos ±10m Rápido + ±2 segundos Instantáneo +2 horas + +2 horas +2h Mínimo ±20-60 minutos + ±20 minutos ±20m Normal ±1-2 horas + ±1 hora ±1h Lento La transferencia de fondos a ahorros suele ser instantánea, pero la liquidación puede tardar hasta <accent>14 días</accent> en ciertas condiciones de red. @@ -317,7 +323,7 @@ *Bitkit actualmente no ofrece servicios Lightning en tu país, pero aún puedes conectarte a otros nodos. Gasta bitcoin más rápido que nunca. Disfruta de pagos instantáneos y baratos con amigos, familia y comerciantes. La privacidad\n<accent>no es un crimen</accent> - Desliza para ocultar tu saldo, disfruta de pagos más privados y protege tu monedero activando funciones de seguridad. + Tu dinero, tu privacidad. Desliza para ocultar tu saldo y gasta de forma más privada, sin rastreo de datos y sin KYC. Sus claves,\n<accent>sus monedas</accent> Vamos a crear tu monedero. Ten en cuenta que Bitkit es software móvil. <accent>No guardes todo tu dinero en Bitkit.</accent> Condiciones de uso @@ -964,6 +970,7 @@ Seleccionar etiqueta Nueva etiqueta Introduzca una nueva etiqueta + Aún no hay etiquetas disponibles Etiquetas utilizadas anteriormente El pago Lightning se detuvo antes de completarse. Este pago Lightning ha caducado. Solicita una factura nueva. diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 2d4036f234..305c13c80c 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -67,21 +67,27 @@ ₿ / vbyte Éxito Utilizable + ±2 segundos Instantáneo Rápido ±10-20 minutos + ±10 minutos ±10m Normal ±20-60 minutos + ±20 minutos ±20m Lento ±1-2 horas + ±1 hora ±1h Mínimo +2 horas + +2 horas +2h Personalizar Depende de la tarifa + Depende de la tarifa Depende de la tarifa Transferir fondos a ahorros normalmente es instantáneo, pero la liquidación podría llevar hasta <accent>14 días</accent> en ciertas condiciones de red. Disponibilidad\n<accent>de fondos</accent> @@ -295,7 +301,7 @@ *Bitkit no ofrece actualmente servicios Lightning en tu país, pero puedes conectarte a otros nodos. Gasta bitcoin más rápido que nunca. Disfruta de pagos instantáneos y baratos con amigos, familia y comerciantes. La privacidad\n<accent>no es un crimen</accent> - Desliza para ocultar tu saldo, disfruta de pagos más privados y protege tu monedero activando las funciones de seguridad. + Tu dinero, tu privacidad. Desliza para ocultar tu saldo y gasta de forma más privada, sin rastreo de datos y sin KYC. Sus claves,\n<accent>sus monedas</accent> Vamos a crear tu monedero. Ten en cuenta que Bitkit es software móvil. <accent>No guardes todo tu dinero en Bitkit.</accent> Bitkit\n<accent>condiciones de uso</accent> @@ -832,6 +838,7 @@ Seleccionar Etiqueta Nueva etiqueta Introduzca una nueva etiqueta + Aún no hay etiquetas disponibles Etiquetas utilizadas anteriormente Filtrar la actividad mediante etiquetas El pago Lightning se detuvo antes de completarse. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 4323ccb31d..543f22b20a 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -67,21 +67,27 @@ Prêt Succès Utilisable + ±2 secondes Instantané Rapide ±10-20 minutes + ±10 minutes ±10min Normal ±20-60 minutes + ±20 minutes ±20min Lent ±1-2 heures + ±1 heure ±1h Minimum +2 heures + +2 heures +2h Personnalisé Dépend des frais + Dépend des frais Dépend des frais Dépenses \n<accent>Solde</accent> Alimentez votre solde de dépenses pour profiter de transactions instantanées et bon marché avec vos amis, votre famille et les commerçants. @@ -292,12 +298,12 @@ Sauter intro Ignorer La liberté dans \n<accent>votre poche</accent> - Bitkit vous donne les clés pour gérer votre argent. Dépensez maintenant ou économisez pour plus tard. C\'est à vous de choisir. + Bitkit vous donne les clés pour contrôler votre argent, votre profil et vos contacts. Prenez le contrôle et devenez sans frontières. Paiements \n<accent>Instantanés</accent> Dépensez des bitcoins plus rapidement que jamais. Profitez de paiements instantanés et bon marché avec vos amis, votre famille et les commerçants. *Bitkit ne fournit pas actuellement de services Lightning dans votre pays, mais vous pouvez toujours vous connecter à d\'autres nœuds. La vie privée \n<accent>n\'est pas un crime</accent> - Glissez pour cacher votre solde, profitez de paiements plus confidentiels et protégez votre portefeuille en activant les fonctions de sécurité. + Votre argent, votre vie privée. Balayez pour masquer votre solde et dépensez de manière plus privée, sans suivi de données et sans KYC. Vos clés, \n<accent>votre argent</accent> Créez votre portefeuille. Veuillez noter que Bitkit est un logiciel mobile. <accent>Ne stockez pas tout votre argent dans Bitkit.</accent> Créer @@ -832,6 +838,7 @@ Ajouter Nouvelle étiquette Saisissez une nouvelle étiquette + Aucun tag n\'est encore disponible Étiquettes précédemment utilisées Filtrer l\'activité à l\'aide de tags Sélectionnez un Tag diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 1471192c5d..1d77f16f40 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -68,19 +68,25 @@ Sì, Procedi Dipende dalle fee + Dipende dalle fee Dipende dalle fee Custom ±10-20 minuti + ±10 minuti ±10m Veloce + ±2 secondi Istantanea +2 ore + +2 ore +2h Minimo ±20-60 minuti + ±20 minuti ±20m Normale ±1-2 ore + ±1 ora ±1h Lenta Il trasferimento dei fondi al conto di risparmio è solitamente istantaneo, ma il pagamento potrebbe richiedere fino a <accent>14 giorni</accent> in determinate condizioni di rete. @@ -312,12 +318,12 @@ Salta Salta l\'Intro La libertà\n<accent>nella tua tasca</accent> - Bitkit ti dà le chiavi per gestire i tuoi soldi. Spendi ora o risparmia per dopo. La scelta è tua. + Bitkit ti dà le chiavi per controllare i tuoi soldi, il tuo profilo e i tuoi contatti. Prendi il controllo e diventa senza confini. Pagamenti\n<accent>istantanei</accent> *Bitkit attualmente non fornisce servizi Lightning nel tuo paese, ma puoi comunque connetterti ad altri nodi. Spendi bitcoin più velocemente che mai. Goditi pagamenti immediati ed economici con amici, familiari e commercianti. La privacy\n<accent>non è un crimine</accent> - Scorri per nascondere il tuo saldo, usufruire di pagamenti più privati ​​e proteggere il tuo portafoglio abilitando le funzionalità di sicurezza. + I tuoi soldi, la tua privacy. Scorri per nascondere il saldo e spendi in modo più privato, senza tracciamento dei dati e zero KYC. Le tue chiavi,\n<accent>le tue monete</accent> Creiamo il tuo portafoglio. Tieni presente che Bitkit è un software mobile. <accent>Non conservare tutti i tuoi soldi in Bitkit.</accent> Termini di Utilizzo @@ -964,6 +970,7 @@ Seleziona Tag Nuovo tag Inserisci un nuovo tag + Non ci sono ancora tag disponibili Tag usati in precedenza Il pagamento Lightning è stato interrotto prima del completamento. Questo pagamento Lightning è scaduto. Richiedi una nuova fattura. diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 534fc2b7d6..2aa6472742 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -68,19 +68,25 @@ Ja Ja, doorgaan Afhankelijk van de vergoeding + Afhankelijk van de vergoeding Afhankelijk van de vergoeding Aangepast ±10-20 minuten + ±10 minuten ±10m Snel + ±2 seconden Direct +2 uur + +2 uur +2h Minimum ±20-60 minuten + ±20 minuten ±20m Normaal ±1-2 uur + ±1 uur ±1h Langzaam Overboeking naar spaargeld is meestal direct, maar de afhandeling kan tot <accent>14 dagen</accent> duren onder bepaalde netwerkomstandigheden. @@ -312,12 +318,12 @@ Overslaan Intro overslaan Vrijheid in\n<accent>je zak</accent> - Bitkit geeft je de sleutels om je geld te beheren. Besteed nu of spaar voor later. De keuze is aan jou. + Bitkit geeft u de sleutels om uw geld, profiel en contacten te beheren. Neem de controle en word grenzeloos. Directe\n<accent>betalingen</accent> *Bitkit biedt momenteel geen Lightning-services in jouw land, maar je kunt nog steeds verbinding maken met andere nodes. Besteed bitcoin sneller dan ooit. Geniet van directe en goedkope betalingen met vrienden, familie en winkeliers. Privacy is\n<accent>geen misdaad</accent> - Veeg om je saldo te verbergen, geniet van meer private betalingen en bescherm je wallet door beveiligingsfuncties in te schakelen. + Uw geld, uw privacy. Veeg om uw saldo te verbergen en besteed meer privé, zonder datatracking en zonder KYC. Jouw sleutels,\n<accent>jouw coins</accent> Laten we je wallet aanmaken. Let op: Bitkit is mobiele software. <accent>Bewaar niet al je geld in Bitkit.</accent> Gebruiksvoorwaarden @@ -964,6 +970,7 @@ Tag selecteren Nieuwe tag Voer een nieuwe tag in + Nog geen labels beschikbaar Eerder gebruikte tags De Lightning-betaling is gestopt voordat deze was voltooid. Deze Lightning-betaling is verlopen. Vraag een nieuwe factuur aan. diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 1393109888..226f005df7 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -67,21 +67,27 @@ Gotowe Sukces Użyteczne + ±2 sekundy Natychmiast Szybko ±10-20 minut + ±10 minut ±10m Normalnie ±20-60 minut + ±20 minut ±20m Wolno ±1-2 godzin + ±1 godzina ±1h Minimum +2 godziny + +2 godziny +2h Własna Zależy od opłaty + Zależy od opłaty Zależy od opłaty Saldo \n<accent>Wydatków</accent> Zasil swoje saldo wydatków, aby cieszyć się natychmiastowymi i tanimi transakcjami z przyjaciółmi, rodziną i sprzedawcami. @@ -292,12 +298,12 @@ Pomiń wprowadzenie Pomiń Wolność w\n<accent>twojej kieszeni</accent> - Bitkit przekazuje Ci klucze do zarządzania Twoimi pieniędzmi. Wydawaj teraz lub oszczędzaj na później. Wybór należy do Ciebie. + Bitkit przekazuje Ci klucze do kontrolowania Twoich pieniędzy, profilu i kontaktów. Przejmij kontrolę i stań się wolnym. Płatności\n<accent>natychmiastowe</accent> Wydawaj bitcoiny szybciej niż kiedykolwiek. Ciesz się natychmiastowymi i tanimi płatnościami z przyjaciółmi, rodziną i sprzedawcami. Bitkit nie świadczy obecnie usług Lightning w Twoim kraju, ale nadal możesz łączyć się z innymi węzłami. Prywatność nie jest\n<accent>przestępstwem</accent> - Przesuń, aby ukryć saldo, zwiększyć prywatność płatności i zabezpieczyć portfel dzięki funkcjom bezpieczeństwa. + Twoje pieniądze, Twoja prywatność. Przesuń, aby ukryć saldo i wydawaj bardziej prywatnie, bez śledzenia danych i bez KYC. Twoje klucze,\n<accent>twoje monety</accent> Utwórzmy twój portfel. Pamiętaj, że Bitkit to oprogramowanie mobilne. <accent>Nie przechowuj w nim wszystkich swoich środków.</accent> Nowy portfel @@ -832,6 +838,7 @@ Dodaj Nowy tag Wprowadź nowy tag + Brak dostępnych tagów Poprzednio używane tagi Filtruj aktywność za pomocą tagów Wybierz tag diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 30da27ac33..cd169751af 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -68,19 +68,25 @@ Sim Sim, continuar Depende da taxa + Depende da taxa Depende da taxa Personalizada ±10-20 minutos + ±10 minutos ±10m Rápido + ±2 segundos Instantâneo +2 horas + +2 horas +2h Mínimo ±20-60 minutos + ±20 minutos ±20m Normal ±1-2 horas + ±1 hora ±1h Devagar A transferência de fundos para a poupança geralmente é instantânea, mas pode levar até <accent>14 dias</accent> em determinadas condições da rede. @@ -312,12 +318,12 @@ Pular Pular Introdução Liberdade no\n<accent>seu bolso</accent> - A Bitkit lhe dá as chaves para gerenciar seu dinheiro. Gaste agora ou economize para depois. A escolha é sua. + O Bitkit entrega as chaves para controlar seu dinheiro, perfil e contatos. Assuma o controle e torne-se sem fronteiras. Pagamentos\n<accent>instantâneos</accent> *No momento, a Bitkit não fornece serviços Lightning em seu país, mas você ainda pode se conectar a outros nós. Envie bitcoin mais rápido do que nunca. Aproveite os pagamentos instantâneos e baratos com amigos, familiares e comerciantes. Privacidade\n<accent>não é crime</accent> - Deslize seu saldo para ocultá-lo, desfrute de pagamentos mais privados e proteja sua carteira ativando os recursos de segurança. + Seu dinheiro, sua privacidade. Deslize para ocultar seu saldo e gaste de forma mais privada, sem rastreamento de dados e zero KYC. Suas chaves,\n<accent>suas moedas</accent> Vamos criar sua carteira. Lembre-se de que a Bitkit é um aplicativo móvel. <accent>Não armazene todo o seu dinheiro na Bitkit.</accent> Termos de uso @@ -964,6 +970,7 @@ Selecionar Tag Nova Tag Inserir uma nova tag + Ainda não há tags disponíveis Tags usadas anteriormente O pagamento Lightning foi interrompido antes de ser concluído. Este pagamento Lightning expirou. Solicite uma nova fatura. diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index f22cf4cd74..dc44f1410a 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -67,21 +67,27 @@ Pronto Sucesso Utilizável + ±2 segundos Instantâneo Rápido ±10-20 minutos + ±10 minutos ±10m Normal ±20-60 minutos + ±20 minutos ±20m Devagar ±1-2 horas + ±1 hora ±1h Mínimo +2 horas + +2 horas +2h Personalizada Depende da taxa + Depende da taxa Depende da taxa Saldo de\n<accent>Gastos</accent> Use seu saldo de gastos para desfrutar de transações instantâneas e baratas com amigos, familiares e comerciantes. @@ -798,6 +804,7 @@ Adicionar Nova Tag Inserir uma nova tag + Ainda não há tags disponíveis Tags usadas anteriormente Filtrar atividades usando tags Selecionar Tag diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 837be97a27..0dfa10221d 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -76,19 +76,25 @@ Да Да,\nПродолжить Зависит от комиссии + Зависит от комиссии Зависит от комиссии Другое ±10-20 минут + ±10 минут ±10м Быстро + ±2 секунды Мгновенно +2 часа + +2 часа +2ч Минимум ±20-60 минут + ±20 минут ±20м Нормально ±1-2 часа + ±1 час ±1ч Медленно Перевод средств в сбережения обычно мгновенный, но расчёт может занять до <accent>14 дней</accent> в определённых сетевых условиях. @@ -325,12 +331,12 @@ Пропустить Пропустить Свобода в\n<accent>вашем кармане</accent> - Bitkit предоставляет вам ключи для управления вашими деньгами. Тратьте сейчас или копите на потом. Выбор за вами. + Bitkit даёт вам ключи для управления вашими деньгами, профилем и контактами. Возьмите контроль и станьте безграничными. Мгновенные\n<accent>платежи</accent> *Bitkit в настоящее время не предоставляет услуги Lightning в вашей стране, но вы всё ещё можете подключаться к другим нодам. Тратьте биткойны быстрее, чем когда-либо. Наслаждайтесь мгновенными и недорогими платежами с друзьями, семьёй и продавцами. Конфиденциальность — это\n<accent>не преступление</accent> - Проведите пальцем, чтобы скрыть свой баланс, наслаждайтесь более конфиденциальными платежами и защитите свой кошелёк, включив функции безопасности. + Ваши деньги, ваша конфиденциальность. Проведите пальцем, чтобы скрыть баланс и тратить более конфиденциально, без отслеживания данных и KYC. Ваши ключи,\n<accent>ваши монеты</accent> Давайте создадим ваш кошелёк. Пожалуйста, имейте в виду, что Bitkit — это мобильное ПО. <accent>Не храните все свои деньги в Bitkit.</accent> Условия использования @@ -992,6 +998,7 @@ Bitkit должен увеличить приёмную ёмкость ваше Выберите тег Новый тег Введите тег + Тегов пока нет Ранее использовавшиеся теги Платеж Lightning был остановлен до завершения. Срок действия этого платежа Lightning истек. Запросите новый счет. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 81e9d45f2b..27d6e02e67 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -149,21 +149,27 @@ Paste QR Or Link SCANNING QR & NFC Depends on the fee + Depends on the fee Depends on the fee Custom ±10-20 minutes + ±10 minutes ±10m Fast ±1-5 seconds + ±2 seconds Instant Instant +2 hours + +2 hours +2h Minimum ±20-60 minutes + ±20 minutes ±20m Normal ±1-2 hours + ±1 hour ±1h Slow Open Settings @@ -477,12 +483,12 @@ Skip Skip Intro Freedom in\n<accent>your pocket</accent> - Bitkit hands you the keys to manage your money. Spend now or save for later. The choice is yours. + Bitkit hands you the keys to control your money, profile, and contacts. Take charge and become borderless. Instant\n<accent>payments</accent> *Bitkit does not currently provide Lightning services in your country, but you can still connect to other nodes. - Spend bitcoin faster than ever. Enjoy instant and cheap payments with friends, family, and merchants. + Enjoy instant and cheap payments with friends, family, and merchants on the Lightning Network. Privacy is\n<accent>not a crime</accent> - Swipe to hide your balance, enjoy more private payments, and protect your wallet by enabling security features. + Your money, your privacy. Swipe to hide your balance and spend more privately, with no data tracking and zero KYC. Your keys,\n<accent>your coins</accent> Let’s create your wallet. Please be aware that Bitkit is mobile software. <accent>Don’t store all your money in Bitkit.</accent> Terms of Use @@ -1439,6 +1445,7 @@ Select Tag New tag Enter a new tag + No tags available yet Previously used tags Your instant payment failed. Please try again. Payment Failed diff --git a/app/src/test/java/to/bitkit/ui/sheets/BoostTransactionViewModelTest.kt b/app/src/test/java/to/bitkit/ui/sheets/BoostTransactionViewModelTest.kt index eda6245661..46862ec10b 100644 --- a/app/src/test/java/to/bitkit/ui/sheets/BoostTransactionViewModelTest.kt +++ b/app/src/test/java/to/bitkit/ui/sheets/BoostTransactionViewModelTest.kt @@ -57,7 +57,8 @@ class BoostTransactionViewModelTest : BaseUnitTest() { private val totalFee = 1000UL private val testValue = 50000UL - private val onchainActivity = OnchainActivity.create(walletId = "wallet0", + private val onchainActivity = OnchainActivity.create( + walletId = "wallet0", id = "test_id", txType = PaymentType.SENT, txId = mockTxId, @@ -70,17 +71,17 @@ class BoostTransactionViewModelTest : BaseUnitTest() { private val activitySent = Activity.Onchain(onchainActivity) - private val fastFeeTime = "±10m" - private val normalFeeTime = "±20m" - private val flowFeeTime = "±1h" - private val minFeeTime = "+2h" + private val fastFeeTime = "±10 minutes" + private val normalFeeTime = "±20 minutes" + private val slowFeeTime = "±1 hour" + private val minFeeTime = "+2 hours" @Before fun setUp() = runBlocking { - whenever(context.getString(R.string.fee__fast__shortDescription)).thenReturn(fastFeeTime) - whenever(context.getString(R.string.fee__normal__shortDescription)).thenReturn(normalFeeTime) - whenever(context.getString(R.string.fee__slow__shortDescription)).thenReturn(flowFeeTime) - whenever(context.getString(R.string.fee__minimum__shortDescription)).thenReturn(minFeeTime) + whenever(context.getString(R.string.fee__fast__duration)).thenReturn(fastFeeTime) + whenever(context.getString(R.string.fee__normal__duration)).thenReturn(normalFeeTime) + whenever(context.getString(R.string.fee__slow__duration)).thenReturn(slowFeeTime) + whenever(context.getString(R.string.fee__minimum__duration)).thenReturn(minFeeTime) whenever(onchain.feeRates).thenReturn(feeRates) whenever(mockBtInfo.onchain).thenReturn(onchain) whenever(blocktankRepo.blocktankState).thenReturn(blocktankState) @@ -282,7 +283,7 @@ class BoostTransactionViewModelTest : BaseUnitTest() { sut.setupActivity(lowFeeActivity) awaitItem() // loading state val state = awaitItem() - assertEquals(flowFeeTime, state.estimateTime) + assertEquals(slowFeeTime, state.estimateTime) } } diff --git a/app/src/test/java/to/bitkit/viewmodels/AppViewModelSendFlowTest.kt b/app/src/test/java/to/bitkit/viewmodels/AppViewModelSendFlowTest.kt index 829cd2bf29..fe68f0f795 100644 --- a/app/src/test/java/to/bitkit/viewmodels/AppViewModelSendFlowTest.kt +++ b/app/src/test/java/to/bitkit/viewmodels/AppViewModelSendFlowTest.kt @@ -2606,6 +2606,27 @@ class AppViewModelSendFlowTest : BaseUnitTest() { verify(coreService, never()).decode(any()) } + @Test + fun `scanner sheet shows back button by default`() = test { + sut.showScannerSheet() + advanceUntilIdle() + + assertEquals(Sheet.QrScanner(showBackButton = true), sut.currentSheet.value) + + sut.hideScannerSheet() + advanceUntilIdle() + + assertNull(sut.currentSheet.value) + } + + @Test + fun `scanner sheet can hide back button for tab bar entry`() = test { + sut.showScannerSheet(showBackButton = false) + advanceUntilIdle() + + assertEquals(Sheet.QrScanner(showBackButton = false), sut.currentSheet.value) + } + @Test fun `canSwitchWallet is false when amount equals dust limit`() = test { balanceState.value = BalanceState( diff --git a/changelog.d/next/1270.fixed.md b/changelog.d/next/1270.fixed.md new file mode 100644 index 0000000000..1f6d4c7a27 --- /dev/null +++ b/changelog.d/next/1270.fixed.md @@ -0,0 +1 @@ +Polished wallet, transfer, receive, onboarding, and settings screens with corrected spacing, typography, icons, and amount displays.