From bdd0e11a9a44d1849eef285979f6dba48dd543ea Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Thu, 3 Sep 2026 18:00:19 +0200 Subject: [PATCH 01/29] fix(ui): add missing money symbols --- .../main/java/to/bitkit/ui/components/FeeInfo.kt | 2 +- app/src/main/java/to/bitkit/ui/components/Money.kt | 13 ++++++++++--- .../to/bitkit/ui/components/NumberPadTextField.kt | 3 +++ .../ui/screens/transfer/SavingsAdvancedScreen.kt | 2 +- .../ui/screens/transfer/SpendingAmountScreen.kt | 6 +++++- .../transfer/hardware/SpendingAmountHwScreen.kt | 6 +++++- .../main/java/to/bitkit/ui/sheets/GiftLoading.kt | 3 +++ 7 files changed, 28 insertions(+), 7 deletions(-) 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/Money.kt b/app/src/main/java/to/bitkit/ui/components/Money.kt index 6513be5b02..3b03621eb4 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") 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..4857bf6eb6 100644 --- a/app/src/main/java/to/bitkit/ui/components/NumberPadTextField.kt +++ b/app/src/main/java/to/bitkit/ui/components/NumberPadTextField.kt @@ -12,6 +12,7 @@ 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 @@ -86,6 +87,7 @@ private fun MoneyAmount( if (!isSymbolSuffix) { Display( text = symbol, + fontWeight = FontWeight.ExtraBold, color = Colors.White64, modifier = Modifier.padding(end = 6.dp) ) @@ -108,6 +110,7 @@ private fun MoneyAmount( if (isSymbolSuffix) { Display( text = symbol, + fontWeight = FontWeight.ExtraBold, color = Colors.White64, modifier = Modifier.padding(start = 6.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/SpendingAmountScreen.kt b/app/src/main/java/to/bitkit/ui/screens/transfer/SpendingAmountScreen.kt index ec1b4349d4..7e8b487d57 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 @@ -228,7 +228,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( 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..fc65ea79ba 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 @@ -234,7 +234,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( 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), ) From 80d009b5dc093ec295b1596aa69367bbddb92a49 Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Thu, 3 Sep 2026 18:39:34 +0200 Subject: [PATCH 02/29] fix(ui): adjust scanner icon backgrounds --- .../to/bitkit/ui/screens/scanner/QrScanningScreen.kt | 6 ++++-- .../ui/screens/wallets/send/SendRecipientScreen.kt | 9 +++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) 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/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 = {}, From d10cb90dc4b0e91f3787f1bfe38647fe2141df24 Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Thu, 3 Sep 2026 18:46:25 +0200 Subject: [PATCH 03/29] fix: update tab indicator default --- .../bitkit/ui/screens/shop/shopDiscover/ShopDiscoverScreen.kt | 1 - .../wallets/activity/components/CustomTabRowWithSpacing.kt | 2 +- .../to/bitkit/ui/screens/wallets/receive/ReceiveQrScreen.kt | 1 - app/src/main/java/to/bitkit/ui/settings/SettingsScreen.kt | 1 - 4 files changed, 1 insertion(+), 4 deletions(-) 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/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/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/settings/SettingsScreen.kt b/app/src/main/java/to/bitkit/ui/settings/SettingsScreen.kt index c037f21dc8..9d47918ac1 100644 --- a/app/src/main/java/to/bitkit/ui/settings/SettingsScreen.kt +++ b/app/src/main/java/to/bitkit/ui/settings/SettingsScreen.kt @@ -241,7 +241,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) ) From c91efb00a9eb6546b9511c8a64ee29f84d17f86f Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Fri, 4 Sep 2026 12:26:57 +0200 Subject: [PATCH 04/29] fix: polish receive amount ui --- .../java/to/bitkit/ui/components/Money.kt | 18 +++++++ .../ui/components/NumberPadTextField.kt | 27 +++++++++- .../main/java/to/bitkit/ui/components/Tag.kt | 11 ++-- .../main/java/to/bitkit/ui/components/Text.kt | 40 ++++++++++++++ .../wallets/receive/EditInvoiceScreen.kt | 53 +++++-------------- .../wallets/receive/ReceiveConfirmScreen.kt | 32 +++++------ 6 files changed, 116 insertions(+), 65 deletions(-) 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 3b03621eb4..ac452290f6 100644 --- a/app/src/main/java/to/bitkit/ui/components/Money.kt +++ b/app/src/main/java/to/bitkit/ui/components/Money.kt @@ -137,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 4857bf6eb6..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,10 +4,14 @@ 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 @@ -17,6 +21,7 @@ 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 @@ -38,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) }, @@ -53,6 +59,7 @@ fun NumberPadTextField( isSymbolSuffix = currencies.primaryDisplay == PrimaryDisplay.FIAT && isSuffixSymbolCurrency(currencies.selectedCurrency), showSecondaryField = showSecondaryField, + showEditButton = showEditButton, ) } @@ -67,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), ) { @@ -77,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( @@ -105,7 +118,7 @@ private fun MoneyAmount( } } }, - modifier = if (isSymbolSuffix) Modifier else Modifier.weight(1f) + modifier = Modifier.weight(1f, fill = false) ) if (isSymbolSuffix) { Display( @@ -115,6 +128,16 @@ private fun MoneyAmount( 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/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..55ac33452a 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,46 @@ fun Caption( ) } +@Composable +fun CaptionM( + text: String, + 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, +) { + CaptionM( + text = AnnotatedString(text), + modifier = modifier, + color = color, + textAlign = textAlign, + maxLines = maxLines, + overflow = overflow, + ) +} + +@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, + ), + modifier = modifier, + maxLines = maxLines, + overflow = overflow, + ) +} + @Composable fun CaptionB( text: String, 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..8b552185b9 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 @@ -234,24 +230,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 +250,7 @@ fun EditInvoiceContent( NumberPadTextField( viewModel = amountInputViewModel, + showEditButton = !keyboardVisible, onClick = onClickBalance, modifier = Modifier .fillMaxWidth() @@ -308,7 +287,7 @@ fun EditInvoiceContent( ) } - HorizontalDivider(modifier = Modifier.padding(top = 24.dp)) + HorizontalDivider(modifier = Modifier.padding(top = 12.dp)) NumberPad( viewModel = amountInputViewModel, @@ -337,7 +316,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 = { @@ -352,8 +331,12 @@ fun EditInvoiceContent( 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") @@ -379,18 +362,8 @@ fun EditInvoiceContent( ) } } - 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, + AddTagButton( + onClick = onClickAddTag, modifier = Modifier.testTag("TagsAdd") ) } 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..67640c3996 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,8 @@ 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 +147,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() From 687dfd647fc2de42b8c22b1dd6ce1ce39e8f877f Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Fri, 4 Sep 2026 12:27:25 +0200 Subject: [PATCH 05/29] fix: polish transaction speed settings ui --- .../java/to/bitkit/ui/components/settings/SettingsButtonRow.kt | 1 - .../settings/transactionSpeed/TransactionSpeedSettingsScreen.kt | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) 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..a35a70f4b1 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 @@ -152,7 +152,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/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") From c04ca390a047600359214cdc9dfe83e639172ba6 Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Tue, 15 Sep 2026 13:07:40 +0200 Subject: [PATCH 06/29] fix: polish small activity buttons --- .../java/to/bitkit/ui/components/Button.kt | 168 +++++++++--------- .../wallets/activity/ActivityDetailScreen.kt | 2 +- 2 files changed, 88 insertions(+), 82 deletions(-) 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..17f39838af 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 @@ -106,57 +108,59 @@ 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, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } } } } @@ -205,42 +209,44 @@ 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, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } } } } 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) From 6a5517a0f310595d2e7d3028e6830570222a7dd4 Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Tue, 15 Sep 2026 13:22:40 +0200 Subject: [PATCH 07/29] fix: polish invoice tag inputs --- .../screens/wallets/receive/EditInvoiceScreen.kt | 14 +++++++------- .../bitkit/ui/screens/wallets/send/AddTagScreen.kt | 6 ++++++ 2 files changed, 13 insertions(+), 7 deletions(-) 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 8b552185b9..bda6ad2403 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 @@ -69,6 +69,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.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 @@ -327,6 +328,7 @@ fun EditInvoiceContent( }, value = noteText, onValueChange = onTextChanged, + textStyle = AppTextStyles.BodySSB, minLines = 4, keyboardOptions = KeyboardOptions.Default.copy( imeAction = ImeAction.Done @@ -350,9 +352,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( @@ -361,11 +361,11 @@ fun EditInvoiceContent( onClick = { onClickTag(tagText) }, ) } + AddTagButton( + onClick = onClickAddTag, + modifier = Modifier.testTag("TagsAdd") + ) } - AddTagButton( - onClick = onClickAddTag, - modifier = Modifier.testTag("TagsAdd") - ) } FillHeight() 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() From 97345533c1f923cdc1e4b64603169af8c8ae4344 Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Tue, 15 Sep 2026 13:56:19 +0200 Subject: [PATCH 08/29] fix: polish boost sheet --- app/src/main/java/to/bitkit/models/FeeRate.kt | 7 ++++ .../bitkit/ui/sheets/BoostTransactionSheet.kt | 36 ++++++++++++------- .../ui/sheets/BoostTransactionViewModel.kt | 7 ++-- app/src/main/res/values-ar/strings.xml | 5 +++ app/src/main/res/values-b+es+419/strings.xml | 5 +++ app/src/main/res/values-ca/strings.xml | 5 +++ app/src/main/res/values-cs/strings.xml | 5 +++ app/src/main/res/values-de/strings.xml | 5 +++ app/src/main/res/values-el/strings.xml | 5 +++ app/src/main/res/values-es-rES/strings.xml | 5 +++ app/src/main/res/values-es/strings.xml | 5 +++ app/src/main/res/values-fr/strings.xml | 5 +++ app/src/main/res/values-it/strings.xml | 5 +++ app/src/main/res/values-nl/strings.xml | 5 +++ app/src/main/res/values-pl/strings.xml | 5 +++ app/src/main/res/values-pt-rBR/strings.xml | 5 +++ app/src/main/res/values-pt/strings.xml | 5 +++ app/src/main/res/values-ru/strings.xml | 5 +++ app/src/main/res/values/strings.xml | 6 ++++ 19 files changed, 117 insertions(+), 14 deletions(-) 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/sheets/BoostTransactionSheet.kt b/app/src/main/java/to/bitkit/ui/sheets/BoostTransactionSheet.kt index c9fe07801d..7511bb83a0 100644 --- a/app/src/main/java/to/bitkit/ui/sheets/BoostTransactionSheet.kt +++ b/app/src/main/java/to/bitkit/ui/sheets/BoostTransactionSheet.kt @@ -27,13 +27,15 @@ 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.text.buildAnnotatedString import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.synonym.bitkitcore.Activity import to.bitkit.R -import to.bitkit.models.BITCOIN_SYMBOL +import to.bitkit.models.PrimaryDisplay import to.bitkit.ui.components.BodyMSB import to.bitkit.ui.components.BodyS import to.bitkit.ui.components.BodySSB @@ -42,7 +44,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 +237,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 +258,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, @@ -312,11 +316,18 @@ private fun CustomModeContent( verticalArrangement = Arrangement.spacedBy(2.dp) ) { val rateText = - rememberMoneyText(sats = uiState.feeRate.toLong())?.withAccent(defaultColor = Colors.White) - ?.toString().orEmpty() + rememberMoneyText( + sats = uiState.feeRate.toLong(), + unit = PrimaryDisplay.BITCOIN, + showSymbol = true, + )?.withAccent(defaultColor = Colors.White, accentColor = Colors.White) + ?: AnnotatedString("") BodyMSB( - text = "$rateText/vbyte ($BITCOIN_SYMBOL ${uiState.totalFeeSats})", + text = buildAnnotatedString { + append(rateText) + append("/vbyte") + }, color = Colors.White, modifier = Modifier.testTag(BoostTransactionTestTags.FEE_RATE_TEXT) ) @@ -326,8 +337,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 +368,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/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 2758d4211d..7970a990b1 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -68,19 +68,24 @@ نعم نعم، تابع يعتمد على الرسوم + يعتمد على الرسوم يعتمد على الرسوم مخصص ±10-20 دقيقة + ±10 دقائق ±10د سريع فوري +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..5de1b99bb0 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,24 @@ Sí, continuar Depende de la tarifa + Depende de la tarifa Depende de la tarifa Personalizado ±10-20 minutos + ±10 minutos ±10m Rápido 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. diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index bc75f7329e..2d08c43bd3 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -68,19 +68,24 @@ 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 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. diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index d68193f274..658843af3f 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -68,19 +68,24 @@ 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 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>. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index e7d1872c3a..148c30b10e 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -70,18 +70,23 @@ 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. diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index bff3a035c9..a565e4a265 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -68,19 +68,24 @@ Ναι Ναι, Προχώρα Εξαρτάται από το τέλος + Εξαρτάται από το τέλος Εξαρτάται από το τέλος Προσαρμοσμένο ±10-20 λεπτά + ±10 λεπτά ±10 λεπτά Γρήγορα Άμεσα +2 ώρες + +2 ώρες +2 ώρες Ελάχιστο ±20-60 λεπτά + ±20 λεπτά ±20 λεπτά Κανονικά ±1-2 ώρες + ±1 ώρα ±1 ώρα Αργά Η μεταφορά κεφαλαίων στις αποταμιεύσεις είναι συνήθως άμεση, αλλά η εκκαθάριση μπορεί να διαρκέσει έως <accent>14 ημέρες</accent> υπό ορισμένες συνθήκες δικτύου. diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 7c54fd7292..c599446ea5 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -68,19 +68,24 @@ Sí, proceda Depende de la tarifa + Depende de la tarifa Depende de la tarifa Personalizar ±10-20 minutos + ±10 minutos ±10m Rápido 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. diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 2d4036f234..8da60cd11d 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -70,18 +70,23 @@ 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> diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 4323ccb31d..60211409ad 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -70,18 +70,23 @@ 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. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 1471192c5d..c154840214 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -68,19 +68,24 @@ Sì, Procedi Dipende dalle fee + Dipende dalle fee Dipende dalle fee Custom ±10-20 minuti + ±10 minuti ±10m Veloce 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. diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 534fc2b7d6..533f0f9623 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -68,19 +68,24 @@ Ja Ja, doorgaan Afhankelijk van de vergoeding + Afhankelijk van de vergoeding Afhankelijk van de vergoeding Aangepast ±10-20 minuten + ±10 minuten ±10m Snel 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. diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 1393109888..4ce4568770 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -70,18 +70,23 @@ 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. diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 30da27ac33..8840f0c5d8 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -68,19 +68,24 @@ Sim Sim, continuar Depende da taxa + Depende da taxa Depende da taxa Personalizada ±10-20 minutos + ±10 minutos ±10m Rápido 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. diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index f22cf4cd74..53ecd5408b 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -70,18 +70,23 @@ 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. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 837be97a27..f7eca66af7 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -76,19 +76,24 @@ Да Да,\nПродолжить Зависит от комиссии + Зависит от комиссии Зависит от комиссии Другое ±10-20 минут + ±10 минут ±10м Быстро Мгновенно +2 часа + +2 часа +2ч Минимум ±20-60 минут + ±20 минут ±20м Нормально ±1-2 часа + ±1 час ±1ч Медленно Перевод средств в сбережения обычно мгновенный, но расчёт может занять до <accent>14 дней</accent> в определённых сетевых условиях. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 81e9d45f2b..ad12933a94 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 From e3f5932281abd48c9f0b3a7ec382796e5f175734 Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Tue, 15 Sep 2026 14:20:14 +0200 Subject: [PATCH 09/29] fix: align amount keypad spacing --- .../to/bitkit/ui/screens/transfer/SpendingAmountScreen.kt | 7 ++----- .../ui/screens/transfer/external/ExternalAmountScreen.kt | 4 +--- .../ui/screens/transfer/hardware/SpendingAmountHwScreen.kt | 7 ++----- .../to/bitkit/ui/screens/wallets/send/SendAmountScreen.kt | 2 +- 4 files changed, 6 insertions(+), 14 deletions(-) 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 7e8b487d57..081c1554a8 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 @@ -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( @@ -254,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/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 fc65ea79ba..3a7dea72cc 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 @@ -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( @@ -260,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/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, From d213ec5490d1752c7f1420bbf1b17e603fb2d5a1 Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Tue, 15 Sep 2026 14:46:17 +0200 Subject: [PATCH 10/29] fix: polish transfer flow layout --- .../ui/screens/transfer/SpendingAdvancedScreen.kt | 4 ++-- .../ui/screens/transfer/SpendingAmountScreen.kt | 4 ++-- .../ui/screens/transfer/SpendingConfirmScreen.kt | 11 ++++++++++- .../transfer/hardware/SpendingAmountHwScreen.kt | 4 ++-- .../bitkit/ui/screens/wallets/SavingsWalletScreen.kt | 1 + .../bitkit/ui/screens/wallets/SpendingWalletScreen.kt | 1 + 6 files changed, 18 insertions(+), 7 deletions(-) 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 081c1554a8..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, 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/hardware/SpendingAmountHwScreen.kt b/app/src/main/java/to/bitkit/ui/screens/transfer/hardware/SpendingAmountHwScreen.kt index 3a7dea72cc..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, 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( From e37d403e21420f03ef251892fff5c7822a930050 Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Tue, 15 Sep 2026 14:59:05 +0200 Subject: [PATCH 11/29] fix: align home activity spacing --- .../screens/wallets/activity/components/ActivityListSimple.kt | 2 -- 1 file changed, 2 deletions(-) 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") ) } From d59f76f2da54b7b250207175db1f30d9671a1755 Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Tue, 15 Sep 2026 14:59:10 +0200 Subject: [PATCH 12/29] fix: align button text styles --- app/src/main/java/to/bitkit/ui/components/Button.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) 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 17f39838af..d32233b387 100644 --- a/app/src/main/java/to/bitkit/ui/components/Button.kt +++ b/app/src/main/java/to/bitkit/ui/components/Button.kt @@ -32,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 @@ -48,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 @@ -91,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?, @@ -157,6 +165,7 @@ fun PrimaryButton( text?.let { Text( text = text, + style = size.textStyle(), maxLines = 1, overflow = TextOverflow.Ellipsis, ) @@ -243,6 +252,7 @@ fun SecondaryButton( text?.let { Text( text = text, + style = size.textStyle(), maxLines = 1, overflow = TextOverflow.Ellipsis, ) @@ -299,7 +309,7 @@ fun TertiaryButton( text?.let { Text( text = text, - style = MaterialTheme.typography.labelLarge, + style = size.textStyle(), color = contentColor, maxLines = 1, overflow = TextOverflow.Ellipsis, From 8d882524c623aeaae48a20c718a75300052df9d7 Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Tue, 15 Sep 2026 14:59:14 +0200 Subject: [PATCH 13/29] fix: tighten onboarding copy spacing --- app/src/main/java/to/bitkit/ui/onboarding/CreateWalletScreen.kt | 2 +- .../main/java/to/bitkit/ui/onboarding/OnboardingSlidesScreen.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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/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, From 7df8d82fe98c2946f28f6c3cc9cb441867e8b669 Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Tue, 15 Sep 2026 14:59:19 +0200 Subject: [PATCH 14/29] fix: adjust restore mnemonic text weight --- .../java/to/bitkit/ui/onboarding/RestoreWalletScreen.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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..da7e811c43 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, From 6b3463314424e11e188328638c0093ee77e4b6aa Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Tue, 15 Sep 2026 14:59:25 +0200 Subject: [PATCH 15/29] fix: polish settings intro layout --- .../backgroundPayments/BackgroundPaymentsIntroScreen.kt | 2 +- .../java/to/bitkit/ui/settings/backups/BackupIntroScreen.kt | 6 +++++- .../ui/settings/lightning/LightningConnectionsScreen.kt | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) 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..30bf9dc106 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 @@ -404,7 +404,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), From 69e73691568ac02c6e56fa8895c48c23f405c39b Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Tue, 15 Sep 2026 14:59:32 +0200 Subject: [PATCH 16/29] fix: update onboarding copy translations --- app/src/main/res/values-b+es+419/strings.xml | 2 +- app/src/main/res/values-el/strings.xml | 2 +- app/src/main/res/values-es-rES/strings.xml | 2 +- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-fr/strings.xml | 4 ++-- app/src/main/res/values-it/strings.xml | 4 ++-- app/src/main/res/values-nl/strings.xml | 4 ++-- app/src/main/res/values-pl/strings.xml | 4 ++-- app/src/main/res/values-pt-rBR/strings.xml | 4 ++-- app/src/main/res/values-ru/strings.xml | 4 ++-- app/src/main/res/values/strings.xml | 6 +++--- 11 files changed, 19 insertions(+), 19 deletions(-) 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 5de1b99bb0..33b1862e3d 100644 --- a/app/src/main/res/values-b+es+419/strings.xml +++ b/app/src/main/res/values-b+es+419/strings.xml @@ -322,7 +322,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 diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index a565e4a265..68d3575686 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -322,7 +322,7 @@ *Το Bitkit δεν παρέχει προς το παρόν υπηρεσίες Lightning στη χώρα σου, αλλά μπορείς να συνδεθείς σε άλλους κόμβους. Ξόδεψε bitcoin πιο γρήγορα από ποτέ. Απόλαυσε άμεσες και φθηνές πληρωμές με φίλους, οικογένεια και εμπόρους. Το απόρρητο δεν\n<accent>είναι έγκλημα</accent> - Σύρε για να κρύψεις το υπόλοιπό σου, απόλαυσε πιο ιδιωτικές πληρωμές και προστάτεψε το πορτοφόλι σου ενεργοποιώντας λειτουργίες ασφαλείας. + Τα χρήματά σας, η ιδιωτικότητά σας. Σύρετε για να κρύψετε το υπόλοιπό σας και ξοδέψτε πιο ιδιωτικά, χωρίς παρακολούθηση δεδομένων και μηδενικό KYC. Τα κλειδιά σου,\n<accent>τα κέρματά σου</accent> Ας δημιουργήσουμε το πορτοφόλι σου. Να γνωρίζεις ότι το Bitkit είναι λογισμικό κινητού. <accent>Μην αποθηκεύεις όλα τα χρήματά σου στο Bitkit.</accent> Όροι χρήσης diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index c599446ea5..cd90534949 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -322,7 +322,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 diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 8da60cd11d..cfc77cb7d6 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -300,7 +300,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> diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 60211409ad..02d7b7c3eb 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -297,12 +297,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 diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index c154840214..91e3a5df3c 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -317,12 +317,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 diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 533f0f9623..09113bb14c 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -317,12 +317,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 diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 4ce4568770..c7fdcfa3db 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -297,12 +297,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 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 8840f0c5d8..fd5ef7e9dc 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -317,12 +317,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 diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f7eca66af7..b3702c750a 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -330,12 +330,12 @@ Пропустить Пропустить Свобода в\n<accent>вашем кармане</accent> - Bitkit предоставляет вам ключи для управления вашими деньгами. Тратьте сейчас или копите на потом. Выбор за вами. + Bitkit даёт вам ключи для управления вашими деньгами, профилем и контактами. Возьмите контроль и станьте безграничными. Мгновенные\n<accent>платежи</accent> *Bitkit в настоящее время не предоставляет услуги Lightning в вашей стране, но вы всё ещё можете подключаться к другим нодам. Тратьте биткойны быстрее, чем когда-либо. Наслаждайтесь мгновенными и недорогими платежами с друзьями, семьёй и продавцами. Конфиденциальность — это\n<accent>не преступление</accent> - Проведите пальцем, чтобы скрыть свой баланс, наслаждайтесь более конфиденциальными платежами и защитите свой кошелёк, включив функции безопасности. + Ваши деньги, ваша конфиденциальность. Проведите пальцем, чтобы скрыть баланс и тратить более конфиденциально, без отслеживания данных и KYC. Ваши ключи,\n<accent>ваши монеты</accent> Давайте создадим ваш кошелёк. Пожалуйста, имейте в виду, что Bitkit — это мобильное ПО. <accent>Не храните все свои деньги в Bitkit.</accent> Условия использования diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ad12933a94..1be5088ee0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -483,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 From bbd724ba0337397a32fc45ebfb10179bb63a9581 Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Tue, 15 Sep 2026 15:06:13 +0200 Subject: [PATCH 17/29] fix: add wallet polish changelog --- changelog.d/next/1256.fixed.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/next/1256.fixed.md diff --git a/changelog.d/next/1256.fixed.md b/changelog.d/next/1256.fixed.md new file mode 100644 index 0000000000..1f6d4c7a27 --- /dev/null +++ b/changelog.d/next/1256.fixed.md @@ -0,0 +1 @@ +Polished wallet, transfer, receive, onboarding, and settings screens with corrected spacing, typography, icons, and amount displays. From c438e9035fa6a6a6794183650cd5ca46840ff1f8 Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Tue, 15 Sep 2026 15:19:45 +0200 Subject: [PATCH 18/29] fix: address wallet polish review --- .../ui/screens/wallets/receive/ReceiveConfirmScreen.kt | 5 ++++- changelog.d/next/{1256.fixed.md => 1270.fixed.md} | 0 2 files changed, 4 insertions(+), 1 deletion(-) rename changelog.d/next/{1256.fixed.md => 1270.fixed.md} (100%) 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 67640c3996..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 @@ -76,7 +76,10 @@ fun ReceiveConfirmScreen( } val receiveAmountSats = entry.receiveAmountSats - entry.feeSat - val receiveAmountFormatted = rememberMoneyText(sats = receiveAmountSats, showSymbol = true) ?: receiveAmountSats.toString() + val receiveAmountFormatted = rememberMoneyText( + sats = receiveAmountSats, + showSymbol = true, + ) ?: receiveAmountSats.toString() val onNotificationSwitchClick = rememberNotificationToggleClick( isGranted = notificationsGranted, diff --git a/changelog.d/next/1256.fixed.md b/changelog.d/next/1270.fixed.md similarity index 100% rename from changelog.d/next/1256.fixed.md rename to changelog.d/next/1270.fixed.md From db4e76283c845079a130676a6d6adc6e7c8a3667 Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Tue, 15 Sep 2026 15:23:26 +0200 Subject: [PATCH 19/29] fix: remove unrelated changelog fragment --- changelog.d/next/1255.fixed.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 changelog.d/next/1255.fixed.md diff --git a/changelog.d/next/1255.fixed.md b/changelog.d/next/1255.fixed.md deleted file mode 100644 index 6d973f81bc..0000000000 --- a/changelog.d/next/1255.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Incoming payment requests appear sooner while the app is open, without unnecessary wallet backup uploads. From 1fd15381c026b72625479ae22738d26fa6e77f23 Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Tue, 15 Sep 2026 16:33:06 +0200 Subject: [PATCH 20/29] fix: polish wallet loading animation --- .../to/bitkit/ui/onboarding/InitializingWalletView.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) 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, ) From a19bb16c4312eb2868811741ddb9d65cf7f6b0dc Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Tue, 15 Sep 2026 16:57:13 +0200 Subject: [PATCH 21/29] fix: replace material arrow icons --- .../java/to/bitkit/ui/components/EmptyWalletView.kt | 4 +--- .../java/to/bitkit/ui/components/LightningChannel.kt | 8 +++----- .../java/to/bitkit/ui/components/SwipeToConfirm.kt | 7 ++----- app/src/main/java/to/bitkit/ui/components/TabBar.kt | 11 ++++------- .../main/java/to/bitkit/ui/components/ToastView.kt | 5 ++--- .../settings/lightning/LightningConnectionsScreen.kt | 12 +++++------- app/src/main/res/drawable/ic_arrow_right.xml | 10 ++++++++++ 7 files changed, 27 insertions(+), 30 deletions(-) create mode 100644 app/src/main/res/drawable/ic_arrow_right.xml 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/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/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/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/settings/lightning/LightningConnectionsScreen.kt b/app/src/main/java/to/bitkit/ui/settings/lightning/LightningConnectionsScreen.kt index 30bf9dc106..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) 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 @@ + + + From 6e78672f83ed82e5f9b9f2a4691942d923b0e554 Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Thu, 17 Sep 2026 18:25:14 +0200 Subject: [PATCH 22/29] fix: hide scanner back button from tab bar --- app/src/main/java/to/bitkit/ui/ContentView.kt | 2 +- app/src/main/java/to/bitkit/ui/components/SheetHost.kt | 5 ++++- app/src/main/java/to/bitkit/ui/sheets/QrScanningSheet.kt | 8 ++++++-- app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt | 8 +++++++- 4 files changed, 18 insertions(+), 5 deletions(-) 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/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/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) { From 2ec036f331922e4b3baaf3b54e369501ef1e4525 Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Thu, 17 Sep 2026 18:36:06 +0200 Subject: [PATCH 23/29] fix: align wallet activity footer spacing --- .../activity/components/ActivityListGrouped.kt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) 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() ) } } From 0e4c7b93aff0d88d608951b87d22db22ab55a33b Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Thu, 17 Sep 2026 19:07:40 +0200 Subject: [PATCH 24/29] fix: align transfer progress footer spacing --- .../to/bitkit/ui/screens/transfer/SettingUpScreen.kt | 5 ++--- .../ui/screens/transfer/components/ProgressSteps.kt | 9 ++++++--- 2 files changed, 8 insertions(+), 6 deletions(-) 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..441283417b 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 @@ -151,10 +151,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/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) + } } } From 88b06e0b4dc8fdcaeb4e848103ed36b502f56f2e Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Thu, 17 Sep 2026 20:31:03 +0200 Subject: [PATCH 25/29] fix: match send address field background --- .../to/bitkit/ui/screens/wallets/send/SendAddressScreen.kt | 6 ++++++ 1 file changed, 6 insertions(+) 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) From d271c62ebaf754429726d7d983019c4358fac54a Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Thu, 17 Sep 2026 21:08:17 +0200 Subject: [PATCH 26/29] fix: align activity tag filter sheet --- .../wallets/activity/TagSelectorSheet.kt | 37 +++++++++++-------- app/src/main/res/values-b+es+419/strings.xml | 1 + app/src/main/res/values-ca/strings.xml | 1 + app/src/main/res/values-cs/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-el/strings.xml | 1 + app/src/main/res/values-es-rES/strings.xml | 1 + app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-nl/strings.xml | 1 + app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values-pt-rBR/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 16 files changed, 36 insertions(+), 16 deletions(-) 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/res/values-b+es+419/strings.xml b/app/src/main/res/values-b+es+419/strings.xml index 33b1862e3d..37b2a80bf0 100644 --- a/app/src/main/res/values-b+es+419/strings.xml +++ b/app/src/main/res/values-b+es+419/strings.xml @@ -969,6 +969,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 2d08c43bd3..47f0ee380a 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -969,6 +969,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 658843af3f..fb1de71545 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -969,6 +969,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 148c30b10e..e817285246 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -841,6 +841,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 68d3575686..95801bf5c4 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -969,6 +969,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 cd90534949..218c762899 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -969,6 +969,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 cfc77cb7d6..cc11fa19bf 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -837,6 +837,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 02d7b7c3eb..4597290865 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -837,6 +837,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 91e3a5df3c..06cec16f93 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -969,6 +969,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 09113bb14c..654bf38d17 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -969,6 +969,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 c7fdcfa3db..63b0d51ec4 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -837,6 +837,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 fd5ef7e9dc..2ba37a005a 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -969,6 +969,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 53ecd5408b..8d76587705 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -803,6 +803,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 b3702c750a..bcb2dc0733 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -997,6 +997,7 @@ Bitkit должен увеличить приёмную ёмкость ваше Выберите тег Новый тег Введите тег + Тегов пока нет Ранее использовавшиеся теги Платеж Lightning был остановлен до завершения. Срок действия этого платежа Lightning истек. Запросите новый счет. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1be5088ee0..27d6e02e67 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1445,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 From f547fa7118d86c7c077f3bf1490f2d54a491532d Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Fri, 18 Sep 2026 13:21:33 +0200 Subject: [PATCH 27/29] fix: restore changelog fragment --- changelog.d/next/1255.fixed.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/next/1255.fixed.md diff --git a/changelog.d/next/1255.fixed.md b/changelog.d/next/1255.fixed.md new file mode 100644 index 0000000000..6d973f81bc --- /dev/null +++ b/changelog.d/next/1255.fixed.md @@ -0,0 +1 @@ +Incoming payment requests appear sooner while the app is open, without unnecessary wallet backup uploads. From a25c0034c7de1c996b262f21c570afb6e9c47045 Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Fri, 18 Sep 2026 15:38:54 +0200 Subject: [PATCH 28/29] fix: address boost sheet review feedback --- .../bitkit/ui/sheets/BoostTransactionSheet.kt | 16 ++------------ app/src/main/res/values-ar/strings.xml | 1 + app/src/main/res/values-b+es+419/strings.xml | 1 + app/src/main/res/values-ca/strings.xml | 1 + app/src/main/res/values-cs/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-el/strings.xml | 1 + app/src/main/res/values-es-rES/strings.xml | 1 + app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-nl/strings.xml | 1 + app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values-pt-rBR/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + .../sheets/BoostTransactionViewModelTest.kt | 21 ++++++++++--------- 17 files changed, 28 insertions(+), 24 deletions(-) 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 7511bb83a0..23cfddc6a0 100644 --- a/app/src/main/java/to/bitkit/ui/sheets/BoostTransactionSheet.kt +++ b/app/src/main/java/to/bitkit/ui/sheets/BoostTransactionSheet.kt @@ -28,14 +28,13 @@ 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.text.buildAnnotatedString import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.synonym.bitkitcore.Activity import to.bitkit.R -import to.bitkit.models.PrimaryDisplay +import to.bitkit.models.BITCOIN_SYMBOL import to.bitkit.ui.components.BodyMSB import to.bitkit.ui.components.BodyS import to.bitkit.ui.components.BodySSB @@ -315,19 +314,8 @@ private fun CustomModeContent( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(2.dp) ) { - val rateText = - rememberMoneyText( - sats = uiState.feeRate.toLong(), - unit = PrimaryDisplay.BITCOIN, - showSymbol = true, - )?.withAccent(defaultColor = Colors.White, accentColor = Colors.White) - ?: AnnotatedString("") - BodyMSB( - text = buildAnnotatedString { - append(rateText) - append("/vbyte") - }, + text = "$BITCOIN_SYMBOL ${uiState.feeRate}/vbyte", color = Colors.White, modifier = Modifier.testTag(BoostTransactionTestTags.FEE_RATE_TEXT) ) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 7970a990b1..71e667dd80 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -75,6 +75,7 @@ ±10 دقائق ±10د سريع + ±2 ثانية فوري +2 ساعة +2 ساعة 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 37b2a80bf0..08b8d31b53 100644 --- a/app/src/main/res/values-b+es+419/strings.xml +++ b/app/src/main/res/values-b+es+419/strings.xml @@ -75,6 +75,7 @@ ±10 minutos ±10m Rápido + ±2 segundos Instantáneo +2 horas +2 horas diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 47f0ee380a..0f4885df8d 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -75,6 +75,7 @@ ±10 minuts ±10m Ràpid + ±2 segons Instant +2 hores +2 hores diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index fb1de71545..5ea9afbd88 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -75,6 +75,7 @@ +/- 10 minut +/- 10m Rychle + +/- 2 sekundy Okamžitě +2 hodiny +2 hodiny diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index e817285246..00607ac192 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -67,6 +67,7 @@ Verwendbar Ja Ja, Weiter + ±2 Sekunden Sofort Schnell ±10-20 Minuten diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 95801bf5c4..99f52ff5c1 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -75,6 +75,7 @@ ±10 λεπτά ±10 λεπτά Γρήγορα + ±2 δευτερόλεπτα Άμεσα +2 ώρες +2 ώρες diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 218c762899..e2db33121e 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -75,6 +75,7 @@ ±10 minutos ±10m Rápido + ±2 segundos Instantáneo +2 horas +2 horas diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index cc11fa19bf..305c13c80c 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -67,6 +67,7 @@ ₿ / vbyte Éxito Utilizable + ±2 segundos Instantáneo Rápido ±10-20 minutos diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 4597290865..543f22b20a 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -67,6 +67,7 @@ Prêt Succès Utilisable + ±2 secondes Instantané Rapide ±10-20 minutes diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 06cec16f93..1d77f16f40 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -75,6 +75,7 @@ ±10 minuti ±10m Veloce + ±2 secondi Istantanea +2 ore +2 ore diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 654bf38d17..2aa6472742 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -75,6 +75,7 @@ ±10 minuten ±10m Snel + ±2 seconden Direct +2 uur +2 uur diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 63b0d51ec4..226f005df7 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -67,6 +67,7 @@ Gotowe Sukces Użyteczne + ±2 sekundy Natychmiast Szybko ±10-20 minut diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 2ba37a005a..cd169751af 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -75,6 +75,7 @@ ±10 minutos ±10m Rápido + ±2 segundos Instantâneo +2 horas +2 horas diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 8d76587705..dc44f1410a 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -67,6 +67,7 @@ Pronto Sucesso Utilizável + ±2 segundos Instantâneo Rápido ±10-20 minutos diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index bcb2dc0733..0dfa10221d 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -83,6 +83,7 @@ ±10 минут ±10м Быстро + ±2 секунды Мгновенно +2 часа +2 часа 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) } } From 897ade6d37d6ed842ec6fa4e4915b2d49d5e8b93 Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Sat, 19 Sep 2026 14:50:02 +0200 Subject: [PATCH 29/29] fix: address polish review feedback --- .../to/bitkit/ui/components/ButtonTest.kt | 100 ++++++++++++++++++ .../wallets/receive/EditInvoiceContentTest.kt | 1 - .../wallets/receive/EditInvoiceScreenTest.kt | 2 - .../main/java/to/bitkit/ui/components/Text.kt | 21 +--- .../components/settings/SettingsButtonRow.kt | 1 - .../ui/onboarding/RestoreWalletScreen.kt | 2 +- .../ui/screens/transfer/SettingUpScreen.kt | 3 +- .../wallets/receive/EditInvoiceScreen.kt | 8 -- .../to/bitkit/ui/settings/SettingsScreen.kt | 1 - .../viewmodels/AppViewModelSendFlowTest.kt | 21 ++++ 10 files changed, 125 insertions(+), 35 deletions(-) create mode 100644 app/src/androidTest/java/to/bitkit/ui/components/ButtonTest.kt 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/ui/components/Text.kt b/app/src/main/java/to/bitkit/ui/components/Text.kt index 55ac33452a..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,25 +413,6 @@ fun Caption( ) } -@Composable -fun CaptionM( - text: String, - 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, -) { - CaptionM( - text = AnnotatedString(text), - modifier = modifier, - color = color, - textAlign = textAlign, - maxLines = maxLines, - overflow = overflow, - ) -} - @Composable fun CaptionM( text: AnnotatedString, @@ -447,9 +428,9 @@ fun CaptionM( color = color, textAlign = textAlign, ), - modifier = modifier, maxLines = maxLines, overflow = overflow, + modifier = modifier ) } 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 a35a70f4b1..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 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 da7e811c43..9d7f3c65f9 100644 --- a/app/src/main/java/to/bitkit/ui/onboarding/RestoreWalletScreen.kt +++ b/app/src/main/java/to/bitkit/ui/onboarding/RestoreWalletScreen.kt @@ -386,7 +386,7 @@ fun MnemonicInputField( onValueChange(it.text) }, textStyle = AppTextStyles.BodySSB.copy( - fontWeight = if (isFocused) FontWeight.SemiBold else FontWeight.Normal + fontWeight = if (isFocused) FontWeight.SemiBold else FontWeight.Normal, ), prefix = { Text( 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 441283417b..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), 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 bda6ad2403..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 @@ -72,7 +72,6 @@ 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 @@ -104,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()) @@ -180,7 +178,6 @@ fun EditInvoiceScreen( isLoading = isLoading || isCreatingCjit, onClickAddTag = onClickAddTag, onClickTag = onClickTag, - isSoftKeyboardVisible = isSoftKeyboardVisible, showPaymentRequestButton = showPaymentRequestButton, onClickPaymentRequest = { onClickPaymentRequest(amountInputUiState.sats.toULong(), walletUiState.bip21Description) @@ -203,7 +200,6 @@ private fun ReceiveTab.toReceiveLiquiditySource(): ReceiveLiquiditySource { fun EditInvoiceContent( amountInputViewModel: AmountInputViewModel, noteText: String, - isSoftKeyboardVisible: Boolean, onchainOnly: Boolean = false, keyboardVisible: Boolean, tags: ImmutableList, @@ -418,7 +414,6 @@ private fun Preview() { tags = persistentListOf(), onClickAddTag = {}, onClickTag = {}, - isSoftKeyboardVisible = false, modifier = Modifier.sheetHeight(), ) } @@ -442,7 +437,6 @@ private fun PreviewWithTags() { tags = persistentListOf("Team", "Dinner", "Home", "Work"), onClickAddTag = {}, onClickTag = {}, - isSoftKeyboardVisible = false, modifier = Modifier.sheetHeight(), ) } @@ -466,7 +460,6 @@ private fun PreviewWithKeyboard() { tags = persistentListOf("Team", "Dinner", "Home"), onClickAddTag = {}, onClickTag = {}, - isSoftKeyboardVisible = false, modifier = Modifier.sheetHeight(), ) } @@ -490,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/settings/SettingsScreen.kt b/app/src/main/java/to/bitkit/ui/settings/SettingsScreen.kt index 9d47918ac1..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 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(