Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
59cbdba
chore: add widgetsOnboardingHintDismissed flag
jvsena42 Feb 18, 2026
7256873
feat: update HomeUiState with new fields
jvsena42 Feb 18, 2026
7c813a3
feat: update HomeViewModel with page tracking and hint logic
jvsena42 Feb 18, 2026
49fabc5
chore: simplify ActivityListSimple
jvsena42 Feb 18, 2026
c81eb53
chore: add string resources and drawable
jvsena42 Feb 18, 2026
764a92f
feat: restructure HomeScreen with VerticalPager
jvsena42 Feb 18, 2026
0dc1ddb
feat: change SuggestionCard to use aspectRatio instead of fixed size
jvsena42 Feb 18, 2026
f58a288
feat: convert suggestion list into a grid
jvsena42 Feb 18, 2026
6db1be5
feat: add Suggestions entry to AddWidgetsScreen
jvsena42 Feb 18, 2026
7cf6cd1
feat: create SuggestionsPreviewScreen and wire navigation
jvsena42 Feb 18, 2026
f59d13c
chore: lint
jvsena42 Feb 18, 2026
634af1d
feat: replace autogenerated icons
jvsena42 Feb 19, 2026
b134eb0
feat: make suggestions a widget type
jvsena42 Feb 19, 2026
eb3a667
fix: check for pending transfer on showEmptyState
jvsena42 Feb 23, 2026
c315002
Merge branch 'master' into feat/home-redesign
jvsena42 Feb 23, 2026
63d4e38
fix: replace icon with image
jvsena42 Feb 23, 2026
bd60dbc
fix: implement Headline24 style
jvsena42 Feb 23, 2026
2d0ca86
fix: accent tag
jvsena42 Feb 23, 2026
10b1da1
feat: image padding
jvsena42 Feb 23, 2026
6689065
Merge remote-tracking branch 'origin/feat/home-redesign' into feat/ho…
jvsena42 Feb 23, 2026
907df7d
fix: bottom padding
jvsena42 Feb 23, 2026
ce97fcc
fix: cards alignment
jvsena42 Feb 23, 2026
e91c097
fix: close suggestion icon color
jvsena42 Feb 23, 2026
169df7b
fix: show all padding
jvsena42 Feb 23, 2026
767d5cd
fix: update show all label
jvsena42 Feb 23, 2026
9dc135c
fix: TabBar height
jvsena42 Feb 23, 2026
ad0ab3e
fix: TabBar bottom padding
jvsena42 Feb 23, 2026
1d91ee0
fix: remove empty state bottom padding
jvsena42 Feb 23, 2026
37180db
fix: support icon height
jvsena42 Feb 23, 2026
adf2779
feat: update default widgets set
jvsena42 Feb 23, 2026
6b3b144
feat: icon edit widget
jvsena42 Feb 23, 2026
37c4985
fix: drawer icon color
jvsena42 Feb 23, 2026
bbed759
fix: remove unnecessary spacer
jvsena42 Feb 23, 2026
8a97b12
fix: icon color
jvsena42 Feb 23, 2026
4744405
Merge branch 'master' into feat/home-redesign
jvsena42 Mar 4, 2026
b963072
feat: display balances section on empty state
jvsena42 Mar 4, 2026
29a1278
feat: default widgets
jvsena42 Mar 4, 2026
8793e70
fix: onboarding hint text and alightment
jvsena42 Mar 4, 2026
12784ed
chore: add immutable annotation
jvsena42 Mar 4, 2026
ee63974
chore: add stable annotation annotation
jvsena42 Mar 4, 2026
bade558
refactor: remove navController from inner composables to improve stab…
jvsena42 Mar 4, 2026
5e3ff4b
chore: add immutability annotation
jvsena42 Mar 4, 2026
40bea4c
chore: add more preview cases
jvsena42 Mar 4, 2026
86f3368
fix: initial page state
jvsena42 Mar 4, 2026
4044a1e
chore: match preview with default widgets
jvsena42 Mar 4, 2026
cb1107c
fix: match home screen paddings to ios
jvsena42 Mar 4, 2026
7535f59
fix: roolback balance header space
jvsena42 Mar 4, 2026
789344e
fix: rollback space
jvsena42 Mar 4, 2026
08d5105
fix: divider color
jvsena42 Mar 4, 2026
7691b95
fix: match letter spacing with ios
jvsena42 Mar 4, 2026
5889531
fix: prefix font weight
jvsena42 Mar 4, 2026
65b1ade
fix: skip last spacer
jvsena42 Mar 4, 2026
1d49b6e
fix: reimport icons with padding
jvsena42 Mar 4, 2026
c54654b
fix: suggestions order
jvsena42 Mar 5, 2026
9d3e149
fix: suggestion title padding
jvsena42 Mar 5, 2026
37c0fc3
fix: card dimensions
jvsena42 Mar 5, 2026
7b5f739
fix: reimport image
jvsena42 Mar 5, 2026
34e7a8a
fix: BlockCard.kt styles
jvsena42 Mar 5, 2026
8fa9f50
fix: banner padding
jvsena42 Mar 5, 2026
9f57678
fix: banner icon size
jvsena42 Mar 5, 2026
66f0a9b
merge: master into feat/home-redesign
jvsena42 Mar 5, 2026
bf6b9f3
fix: match spacing with figma
jvsena42 Mar 5, 2026
f013116
fix: preserve widget order during edit mode
jvsena42 Mar 5, 2026
0ccd103
chore: lint
jvsena42 Mar 5, 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
1 change: 1 addition & 0 deletions app/src/main/java/to/bitkit/data/SettingsStore.kt
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ data class SettingsData(
val backupWarningIgnoredMillis: Long = 0,
val notificationsIgnoredMillis: Long = 0,
val balanceWarningTimes: Int = 0,
val widgetsOnboardingHintDismissed: Boolean = false,
val coinSelectAuto: Boolean = true,
val coinSelectPreference: CoinSelectionPreference = CoinSelectionPreference.BranchAndBound,
val electrumServer: String = Env.electrumServerUrl,
Expand Down
7 changes: 4 additions & 3 deletions app/src/main/java/to/bitkit/data/WidgetsStore.kt
Original file line number Diff line number Diff line change
Expand Up @@ -160,9 +160,10 @@ class WidgetsStore @Inject constructor(
@Serializable
data class WidgetsData(
val widgets: List<WidgetWithPosition> = listOf(
WidgetWithPosition(type = WidgetType.PRICE, position = 0),
WidgetWithPosition(type = WidgetType.BLOCK, position = 1),
WidgetWithPosition(type = WidgetType.NEWS, position = 2),
WidgetWithPosition(type = WidgetType.SUGGESTIONS, position = 0),
WidgetWithPosition(type = WidgetType.PRICE, position = 1),
WidgetWithPosition(type = WidgetType.BLOCK, position = 2),
WidgetWithPosition(type = WidgetType.NEWS, position = 3),
),
val headlinePreferences: HeadlinePreferences = HeadlinePreferences(),
val factsPreferences: FactsPreferences = FactsPreferences(),
Expand Down
4 changes: 3 additions & 1 deletion app/src/main/java/to/bitkit/data/dto/price/PriceDTO.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package to.bitkit.data.dto.price

import androidx.compose.runtime.Stable
import kotlinx.serialization.Serializable

@Stable
@Serializable
data class PriceDTO(
val widgets: List<PriceWidgetData>,
@Stable val widgets: List<PriceWidgetData>,
val source: String
)
2 changes: 2 additions & 0 deletions app/src/main/java/to/bitkit/models/BalanceState.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package to.bitkit.models

import androidx.compose.runtime.Immutable
import kotlinx.serialization.Serializable

@Immutable
@Serializable
data class BalanceState(
val totalOnchainSats: ULong = 0uL,
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/java/to/bitkit/models/WidgetType.kt
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,9 @@ enum class WidgetType(
WEATHER(
iconRes = R.drawable.widget_cloud,
title = R.string.widgets__weather__name
),
SUGGESTIONS(
iconRes = R.drawable.widget_suggestions,
title = R.string.widgets__suggestions__name,
)
}
2 changes: 2 additions & 0 deletions app/src/main/java/to/bitkit/models/WidgetWithPosition.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package to.bitkit.models

import androidx.compose.runtime.Immutable
import kotlinx.serialization.Serializable

@Immutable
@Serializable
data class WidgetWithPosition(
val type: WidgetType,
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/java/to/bitkit/models/widget/ArticleModel.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package to.bitkit.models.widget

import androidx.compose.runtime.Immutable
import kotlinx.serialization.Serializable
import to.bitkit.data.dto.ArticleDTO
import to.bitkit.ext.toRelativeTimeString
Expand All @@ -12,6 +13,7 @@ import kotlin.time.ExperimentalTime

private const val TAG = "ArticleModel"

@Immutable
@Serializable
data class ArticleModel(
val title: String,
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/java/to/bitkit/models/widget/BlockModel.kt
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package to.bitkit.models.widget

import androidx.compose.runtime.Immutable
import kotlinx.serialization.Serializable
import to.bitkit.data.dto.BlockDTO
import to.bitkit.ext.toDateUTC
import to.bitkit.ext.toTimeUTC

@Immutable
@Serializable
data class BlockModel(
val height: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package to.bitkit.models.widget

import androidx.compose.runtime.Immutable
import kotlinx.serialization.Serializable

@Immutable
@Serializable
data class BlocksPreferences(
val showBlock: Boolean = true,
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/java/to/bitkit/models/widget/FactsPreferences.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package to.bitkit.models.widget

import androidx.compose.runtime.Immutable
import kotlinx.serialization.Serializable

@Immutable
@Serializable
data class FactsPreferences(
val showSource: Boolean = false
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package to.bitkit.models.widget

import androidx.compose.runtime.Immutable
import kotlinx.serialization.Serializable

@Immutable
@Serializable
data class HeadlinePreferences(
val showTime: Boolean = true,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package to.bitkit.models.widget

import androidx.compose.runtime.Stable
import kotlinx.serialization.Serializable
import to.bitkit.data.dto.price.GraphPeriod
import to.bitkit.data.dto.price.TradingPair

@Stable
@Serializable
data class PricePreferences(
val enabledPairs: List<TradingPair> = listOf(
@Stable val enabledPairs: List<TradingPair> = listOf(
TradingPair.BTC_USD
),
val period: GraphPeriod? = GraphPeriod.ONE_DAY,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package to.bitkit.models.widget

import androidx.compose.runtime.Immutable
import kotlinx.serialization.Serializable

@Immutable
@Serializable
data class WeatherPreferences(
val showTitle: Boolean = true,
Expand Down
12 changes: 8 additions & 4 deletions app/src/main/java/to/bitkit/repositories/WidgetsRepo.kt
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ class WidgetsRepo @Inject constructor(

private fun updateWidgetJobs(enabledWidgetTypes: Set<WidgetType>) {
val widgetTypesWithServices = WidgetType.entries.filter {
it != WidgetType.CALCULATOR
it != WidgetType.CALCULATOR && it != WidgetType.SUGGESTIONS
}

widgetTypesWithServices.forEach { widgetType ->
Expand Down Expand Up @@ -138,7 +138,9 @@ class WidgetsRepo @Inject constructor(
}
}

WidgetType.CALCULATOR -> throw NotImplementedError("Calculator widget doesn't need a service")
WidgetType.CALCULATOR,
WidgetType.SUGGESTIONS,
-> throw NotImplementedError("Widget doesn't need a service")
}

widgetJobs[widgetType] = job
Expand Down Expand Up @@ -226,8 +228,10 @@ class WidgetsRepo @Inject constructor(
widgetsStore.updateBlock(block)
}

WidgetType.CALCULATOR -> {
throw NotImplementedError("Calculator widget doesn't need a service")
WidgetType.CALCULATOR,
WidgetType.SUGGESTIONS,
-> {
throw NotImplementedError("Widget doesn't need a service")
}

WidgetType.FACTS -> updateWidget(factsService) { facts ->
Expand Down
16 changes: 15 additions & 1 deletion app/src/main/java/to/bitkit/ui/ContentView.kt
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,8 @@ import to.bitkit.ui.screens.wallets.activity.TagSelectorSheet
import to.bitkit.ui.screens.wallets.receive.ReceiveSheet
import to.bitkit.ui.screens.wallets.suggestion.BuyIntroScreen
import to.bitkit.ui.screens.widgets.AddWidgetsScreen
import to.bitkit.ui.screens.widgets.suggestions.SuggestionsPreviewScreen
import to.bitkit.ui.screens.widgets.suggestions.SuggestionsViewModel
import to.bitkit.ui.screens.widgets.WidgetsIntroScreen
import to.bitkit.ui.screens.widgets.blocks.BlocksEditScreen
import to.bitkit.ui.screens.widgets.blocks.BlocksPreviewScreen
Expand Down Expand Up @@ -1358,10 +1360,19 @@ private fun NavGraphBuilder.widgets(
WidgetType.NEWS -> navController.navigate(Routes.HeadlinesPreview)
WidgetType.PRICE -> navController.navigate(Routes.PricePreview)
WidgetType.WEATHER -> navController.navigate(Routes.WeatherPreview)
WidgetType.SUGGESTIONS -> navController.navigate(Routes.SuggestionsPreview)
}
},
fiatSymbol = LocalCurrencies.current.currencySymbol,
onBackCLick = { navController.popBackStack() }
onBackCLick = { navController.popBackStack() },
)
}
composableWithDefaultTransitions<Routes.SuggestionsPreview> {
val viewModel = hiltViewModel<SuggestionsViewModel>()
SuggestionsPreviewScreen(
suggestionsViewModel = viewModel,
onClose = { navController.navigateToHome() },
onBack = { navController.popBackStack() },
)
}
composableWithDefaultTransitions<Routes.CalculatorPreview> {
Expand Down Expand Up @@ -1931,6 +1942,9 @@ sealed interface Routes {
@Serializable
data object AddWidget : Routes

@Serializable
data object SuggestionsPreview : Routes

@Serializable
data object Headlines : Routes

Expand Down
4 changes: 3 additions & 1 deletion app/src/main/java/to/bitkit/ui/components/ActivityBanner.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredHeight
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.Icon
Expand Down Expand Up @@ -161,7 +162,8 @@ fun ActivityBanner(
Icon(
painter = painterResource(icon),
contentDescription = null,
tint = gradientColor
tint = gradientColor,
modifier = Modifier.size(20.dp)
)

Headline20(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import androidx.compose.ui.platform.LocalInspectionMode
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import to.bitkit.R
Expand Down Expand Up @@ -203,6 +204,7 @@ fun LargeRow(
if (!hideBalance && prefix != null) {
Display(
text = prefix,
fontWeight = FontWeight.ExtraBold,
color = Colors.White64,
modifier = Modifier
.padding(end = 8.dp)
Expand All @@ -212,6 +214,7 @@ fun LargeRow(
if (showSymbol && !isSymbolSuffix) {
Display(
text = symbol,
fontWeight = FontWeight.ExtraBold,
color = Colors.White64,
modifier = Modifier
.padding(end = 8.dp)
Expand All @@ -231,6 +234,7 @@ fun LargeRow(
if (showSymbol && isSymbolSuffix) {
Display(
text = symbol,
fontWeight = FontWeight.ExtraBold,
color = Colors.White64,
modifier = Modifier
.padding(start = 8.dp)
Expand Down
28 changes: 18 additions & 10 deletions app/src/main/java/to/bitkit/ui/components/SuggestionCard.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ import androidx.compose.foundation.border
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.aspectRatio
import androidx.compose.foundation.layout.defaultMinSize
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
Expand All @@ -25,6 +26,7 @@ import androidx.compose.material3.IconButton
import androidx.compose.material3.ShapeDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Brush
Expand Down Expand Up @@ -54,7 +56,6 @@ fun SuggestionCard(
description: String,
@DrawableRes icon: Int,
onClose: (() -> Unit)? = null,
size: Int = 152,
disableGlow: Boolean = false,
captionColor: Color = Colors.White64,
onClick: () -> Unit,
Expand All @@ -75,7 +76,8 @@ fun SuggestionCard(

Box(
modifier = modifier
.size(size.dp)
.fillMaxWidth()
.aspectRatio(1f)
.clip(ShapeDefaults.Large)
.then(
if (isDismissible || disableGlow) {
Expand Down Expand Up @@ -108,34 +110,38 @@ fun SuggestionCard(
.clickableAlpha { onClick() }
) {
Column(
verticalArrangement = Arrangement.Bottom,
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp, vertical = 12.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
.padding(16.dp),
) {
Row(
Box(
modifier = Modifier
.fillMaxWidth()
.weight(1f)
) {
Image(
painter = painterResource(icon),
contentDescription = null,
contentScale = ContentScale.FillHeight,
modifier = Modifier.weight(1f)
alignment = Alignment.TopStart,
contentScale = ContentScale.Fit,
modifier = Modifier
.defaultMinSize(minHeight = 80.dp)
.align(Alignment.BottomStart)
)

if (onClose != null) {
IconButton(
onClick = onClose,
modifier = Modifier
.size(16.dp)
.align(Alignment.TopEnd)
.testTag("SuggestionDismiss")
) {
Icon(
painter = painterResource(R.drawable.ic_x),
contentDescription = null,
tint = Colors.White,
tint = Colors.White64,
)
}
}
Expand All @@ -144,6 +150,7 @@ fun SuggestionCard(
Headline20(
text = AnnotatedString(title),
color = Colors.White,
modifier = Modifier.padding(top = 4.dp),
)

CaptionB(
Expand Down Expand Up @@ -173,7 +180,8 @@ private fun Modifier.gradientRadialBackground(
@Composable
private fun Preview() {
LazyVerticalGrid(
verticalArrangement = Arrangement.spacedBy(4.dp),
verticalArrangement = Arrangement.spacedBy(16.dp),
horizontalArrangement = Arrangement.spacedBy(16.dp),
columns = GridCells.Fixed(2),
modifier = Modifier.fillMaxSize(),
) {
Expand Down
Loading
Loading