Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
7b39466
feat: string resources
jvsena42 Mar 25, 2026
77cd683
feat: SendSectionView
jvsena42 Mar 25, 2026
ad62cea
feat: add swipe progress callback to SwipeToConfirm
jvsena42 Mar 25, 2026
ef35e2c
feat: add Instant enum type
jvsena42 Mar 25, 2026
7f37c8c
feat: update SendFeeViewModel Custom Fee Defaults. to: current custom…
jvsena42 Mar 25, 2026
7ccab2d
feat: switch to lighting when selecting instant
jvsena42 Mar 25, 2026
fe98cdc
feat: relative expire date for invoice
jvsena42 Mar 25, 2026
8a67ab0
feat: hide details on send confirmation screen
jvsena42 Mar 25, 2026
204e1dd
test: update test
jvsena42 Mar 25, 2026
d62e6cd
chore: lint
jvsena42 Mar 25, 2026
8d8fa26
Merge branch 'feat/settings-v60' into feat/send-v60
jvsena42 Mar 26, 2026
7c94de7
Merge branch 'feat/settings-v60' into feat/send-v60
jvsena42 Mar 27, 2026
bd59b6e
fix: spacing
jvsena42 Mar 27, 2026
d5fc1a1
fix: switch logic
jvsena42 Mar 27, 2026
d5687db
fix: coin animation
jvsena42 Mar 27, 2026
0b8e70a
fix: reset warnings on amount change and payment method switches
jvsena42 Mar 27, 2026
2bbad48
fix: strings order
jvsena42 Mar 27, 2026
9c84c60
fix: expire text update
jvsena42 Mar 27, 2026
b183d31
fix: apply side effect
jvsena42 Mar 27, 2026
f1cdb2c
fix: remove trailing comma
jvsena42 Mar 27, 2026
e2fb696
fix: remove trailing comma
jvsena42 Mar 27, 2026
978a51c
Merge branch 'feat/settings-v60' into feat/send-v60
jvsena42 Mar 30, 2026
c8da9c2
fix: clean confirmedWarnings when switch to lighting
jvsena42 Mar 30, 2026
85600dd
chore: lint
jvsena42 Mar 30, 2026
49ed094
chore: remove magic number
jvsena42 Mar 30, 2026
95f856c
chore: modifier rule lint
jvsena42 Mar 30, 2026
c95b053
chore: magic number
jvsena42 Mar 30, 2026
1bee2de
feat: dashed add button
jvsena42 Mar 30, 2026
3b80a36
feat: horizontal swipe
jvsena42 Mar 30, 2026
34f2503
fix: dust validation on updateCanSwitchWallet
jvsena42 Mar 30, 2026
0a1d121
Merge branch 'feat/settings-v60' into feat/send-v60
jvsena42 Mar 30, 2026
21ff423
fix: tags section padding
jvsena42 Mar 30, 2026
0224d21
fix: don't hide LNURL details
jvsena42 Mar 30, 2026
764b71a
fix: replace gradient BG with White06
jvsena42 Mar 30, 2026
702863d
doc: changelog entry
jvsena42 Mar 30, 2026
3f5e94d
Merge branch 'feat/settings-v60' into feat/send-v60
jvsena42 Mar 30, 2026
32610e2
doc: changelog entry
jvsena42 Mar 30, 2026
cc9d1f2
chore: code cleanup
jvsena42 Mar 30, 2026
fc5a38e
chore: set modifier as last parameter
jvsena42 Mar 30, 2026
057112c
refactor: eliminate unsafe cast
jvsena42 Mar 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]

### Added
- Show/hide details toggle on send confirmation screen with coin-stack animation #863
- "Send from" payment method switcher (Savings/Spending) for unified BIP21 payments #863
- "Instant" Lightning option on fee rate selection screen for unified payments #863
- Relative invoice expiry formatting on send confirmation screen #863
- Lightning Connections empty state with onboarding screen #857
- Unified PIN management screen (enable/disable/change in one place) #857
- Support entry in drawer menu #857
Expand All @@ -17,6 +21,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Mnemonic warning text transitions on reveal #857

### Changed
- Custom fee rate defaults now fall back through settings default, slow rate, then 1 #863
- Sanity warnings reset when amount or payment method changes #863
- Settings redesigned with tabbed navigation (General/Security/Advanced) with swipe support #857
- Icons added to all settings rows for faster scanning #857
- Selected values displayed on right side of settings rows #857
Expand Down
28 changes: 28 additions & 0 deletions app/src/main/java/to/bitkit/ext/DateTime.kt
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,34 @@ fun Long.toRelativeTimeString(
}
}

fun formatInvoiceExpiryRelative(
expirySeconds: ULong,
locale: Locale = Locale.getDefault(),
): String {
val seconds = expirySeconds.toLong()
if (seconds <= 0) return ""

val uLocale = ULocale.forLocale(locale)
val numberFormat = NumberFormat.getNumberInstance(uLocale)?.apply { maximumFractionDigits = 0 }
val formatter = RelativeDateTimeFormatter.getInstance(
uLocale,
numberFormat,
RelativeDateTimeFormatter.Style.LONG,
DisplayContext.CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE,
) ?: return ""

val minutes = seconds / Factor.SECONDS_TO_MINUTES.toLong()
val hours = minutes / Factor.MINUTES_TO_HOURS.toLong()
val days = hours / Factor.HOURS_TO_DAYS.toLong()

return when {
minutes < 1 -> formatter.format(seconds.toDouble(), Direction.NEXT, RelativeUnit.SECONDS)
hours < 1 -> formatter.format(minutes.toDouble(), Direction.NEXT, RelativeUnit.MINUTES)
days < 1 -> formatter.format(hours.toDouble(), Direction.NEXT, RelativeUnit.HOURS)
else -> formatter.format(days.toDouble(), Direction.NEXT, RelativeUnit.DAYS)
}
}

fun getDaysInMonth(month: LocalDate): List<LocalDate?> {
val firstDayOfMonth = LocalDate(month.year, month.month, Constants.FIRST_DAY_OF_MONTH)
val daysInMonth = month.month.toJavaMonth().length(isLeapYear(month.year))
Expand Down
9 changes: 8 additions & 1 deletion app/src/main/java/to/bitkit/models/FeeRate.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,13 @@ enum class FeeRate(
@DrawableRes val icon: Int,
val color: Color,
) {
INSTANT(
title = R.string.fee__instant__title,
description = R.string.fee__instant__description,
shortDescription = R.string.fee__instant__shortDescription,
color = Colors.Purple,
icon = R.drawable.ic_lightning,
),
FAST(
title = R.string.fee__fast__title,
description = R.string.fee__fast__description,
Expand Down Expand Up @@ -53,7 +60,7 @@ enum class FeeRate(

fun toSpeed(): TransactionSpeed {
return when (this) {
FAST -> TransactionSpeed.Fast
INSTANT, FAST -> TransactionSpeed.Fast
NORMAL -> TransactionSpeed.Medium
MINIMUM, SLOW -> TransactionSpeed.Slow
CUSTOM -> TransactionSpeed.Custom(0u)
Expand Down
24 changes: 24 additions & 0 deletions app/src/main/java/to/bitkit/ui/components/SendSectionView.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package to.bitkit.ui.components

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material3.HorizontalDivider
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import to.bitkit.ui.theme.Colors

@Composable
fun SendSectionView(
caption: String,
modifier: Modifier = Modifier,
content: @Composable () -> Unit,
) {
Column(modifier = modifier.fillMaxWidth()) {
Caption13Up(text = caption, color = Colors.White64)
VerticalSpacer(8.dp)
content()
VerticalSpacer(16.dp)
HorizontalDivider(modifier = Modifier.fillMaxWidth())
}
}
9 changes: 8 additions & 1 deletion app/src/main/java/to/bitkit/ui/components/SwipeToConfirm.kt
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableFloatState
import androidx.compose.runtime.SideEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.mutableStateOf
Expand Down Expand Up @@ -61,15 +63,16 @@ private val Padding = 8.dp

@Composable
fun SwipeToConfirm(
modifier: Modifier = Modifier,
text: String = stringResource(R.string.other__swipe),
color: Color = Colors.Brand,
icon: ImageVector = Icons.AutoMirrored.Default.ArrowForward,
@DrawableRes endIcon: Int = R.drawable.ic_check,
endIconTint: Color = Colors.Black,
loading: Boolean = false,
confirmed: Boolean = false,
progress: MutableFloatState? = null,
onConfirm: () -> Unit,
modifier: Modifier = Modifier,
) {
val scope = rememberCoroutineScope()
val trailColor = remember(color) { color.copy(alpha = 0.24f) }
Expand All @@ -94,6 +97,10 @@ fun SwipeToConfirm(
)
}

SideEffect {
progress?.floatValue = (panX.value / maxPanX).coerceIn(0f, 1f)
}

Box(
modifier = modifier
.requiredHeight(CircleSize + Padding * 2)
Expand Down
Loading
Loading