Skip to content

Commit a6a6878

Browse files
authored
Merge pull request #78 from synonymdev/feat/sliding-screen-transitions
Add sliding screen transitions
2 parents 652aa13 + 8376f51 commit a6a6878

File tree

10 files changed

+194
-53
lines changed

10 files changed

+194
-53
lines changed

app/src/main/java/to/bitkit/ui/ContentView.kt

Lines changed: 102 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package to.bitkit.ui
22

3-
import androidx.compose.animation.core.tween
4-
import androidx.compose.animation.slideInHorizontally
5-
import androidx.compose.animation.slideOutHorizontally
63
import androidx.compose.runtime.Composable
74
import androidx.compose.runtime.CompositionLocalProvider
85
import androidx.compose.runtime.DisposableEffect
@@ -69,6 +66,10 @@ import to.bitkit.ui.settings.OrderDetailScreen
6966
import to.bitkit.ui.settings.SettingsScreen
7067
import to.bitkit.ui.settings.backups.BackupWalletScreen
7168
import to.bitkit.ui.settings.backups.RestoreWalletScreen
69+
import to.bitkit.ui.utils.screenScaleIn
70+
import to.bitkit.ui.utils.screenScaleOut
71+
import to.bitkit.ui.utils.screenSlideIn
72+
import to.bitkit.ui.utils.screenSlideOut
7273
import to.bitkit.utils.Logger
7374
import to.bitkit.viewmodels.ActivityListViewModel
7475
import to.bitkit.viewmodels.AppViewModel
@@ -323,7 +324,7 @@ fun ContentView(
323324
} else {
324325
navController.navigateToTransferSpendingAmount()
325326
}
326-
},
327+
},
327328
onFund = {
328329
scope.launch {
329330
// TODO show receive sheet -> ReceiveAmount
@@ -367,7 +368,7 @@ private fun NavGraphBuilder.home(
367368
HomeScreen(
368369
walletViewModel = viewModel,
369370
appViewModel = appViewModel,
370-
rootNavController = navController
371+
rootNavController = navController,
371372
)
372373
}
373374
}
@@ -376,7 +377,12 @@ private fun NavGraphBuilder.settings(
376377
viewModel: WalletViewModel,
377378
navController: NavHostController,
378379
) {
379-
composable<Routes.Settings> {
380+
composable<Routes.Settings>(
381+
enterTransition = { screenSlideIn },
382+
exitTransition = { screenScaleOut },
383+
popEnterTransition = { screenScaleIn },
384+
popExitTransition = { screenSlideOut },
385+
) {
380386
SettingsScreen(viewModel, navController)
381387
}
382388
}
@@ -385,13 +391,21 @@ private fun NavGraphBuilder.nodeState(
385391
viewModel: WalletViewModel,
386392
navController: NavHostController,
387393
) {
388-
composable<Routes.NodeState> {
394+
composable<Routes.NodeState>(
395+
enterTransition = { screenSlideIn },
396+
exitTransition = { screenSlideOut },
397+
) {
389398
NodeStateScreen(viewModel, navController)
390399
}
391400
}
392401

393402
private fun NavGraphBuilder.generalSettings(navController: NavHostController) {
394-
composable<Routes.GeneralSettings> {
403+
composable<Routes.GeneralSettings>(
404+
enterTransition = { screenSlideIn },
405+
exitTransition = { screenScaleOut },
406+
popEnterTransition = { screenScaleIn },
407+
popExitTransition = { screenSlideOut },
408+
) {
395409
GeneralSettingsScreen(navController)
396410
}
397411
}
@@ -400,7 +414,12 @@ private fun NavGraphBuilder.defaultUnitSettings(
400414
currencyViewModel: CurrencyViewModel,
401415
navController: NavHostController,
402416
) {
403-
composable<Routes.DefaultUnitSettings> {
417+
composable<Routes.DefaultUnitSettings>(
418+
enterTransition = { screenSlideIn },
419+
exitTransition = { screenScaleOut },
420+
popEnterTransition = { screenScaleIn },
421+
popExitTransition = { screenSlideOut },
422+
) {
404423
DefaultUnitSettingsScreen(currencyViewModel, navController)
405424
}
406425
}
@@ -409,39 +428,64 @@ private fun NavGraphBuilder.localCurrencySettings(
409428
currencyViewModel: CurrencyViewModel,
410429
navController: NavHostController,
411430
) {
412-
composable<Routes.LocalCurrencySettings> {
431+
composable<Routes.LocalCurrencySettings>(
432+
enterTransition = { screenSlideIn },
433+
exitTransition = { screenScaleOut },
434+
popEnterTransition = { screenScaleIn },
435+
popExitTransition = { screenSlideOut },
436+
) {
413437
LocalCurrencySettingsScreen(currencyViewModel, navController)
414438
}
415439
}
416440

417441
private fun NavGraphBuilder.backupSettings(
418442
navController: NavHostController,
419443
) {
420-
composable<Routes.BackupSettings> {
444+
composable<Routes.BackupSettings>(
445+
enterTransition = { screenSlideIn },
446+
exitTransition = { screenScaleOut },
447+
popEnterTransition = { screenScaleIn },
448+
popExitTransition = { screenSlideOut },
449+
) {
421450
BackupSettingsScreen(navController)
422451
}
423452
}
424453

425454
private fun NavGraphBuilder.backupWalletSettings(
426455
navController: NavHostController,
427456
) {
428-
composable<Routes.BackupWalletSettings> {
457+
composable<Routes.BackupWalletSettings>(
458+
enterTransition = { screenSlideIn },
459+
exitTransition = { screenScaleOut },
460+
popEnterTransition = { screenScaleIn },
461+
popExitTransition = { screenSlideOut },
462+
) {
429463
BackupWalletScreen(navController)
430464
}
431465
}
432466

433467
private fun NavGraphBuilder.restoreWalletSettings(
434468
navController: NavHostController,
435469
) {
436-
composable<Routes.RestoreWalletSettings> {
470+
composable<Routes.RestoreWalletSettings>(
471+
enterTransition = { screenSlideIn },
472+
exitTransition = { screenScaleOut },
473+
popEnterTransition = { screenScaleIn },
474+
popExitTransition = { screenSlideOut },
475+
) {
437476
RestoreWalletScreen(navController)
438477
}
439478
}
440479

441480
private fun NavGraphBuilder.channelOrdersSettings(
442481
navController: NavHostController,
443482
) {
444-
composable<Routes.ChannelOrdersSettings> {
483+
composable<Routes.ChannelOrdersSettings>(
484+
enterTransition = { screenSlideIn },
485+
exitTransition = { screenScaleOut },
486+
popEnterTransition = { screenScaleIn },
487+
popExitTransition = { screenSlideOut },
488+
) {
445489
ChannelOrdersScreen(
446490
onBackClick = { navController.popBackStack() },
447491
onOrderItemClick = { navController.navigateToOrderDetail(it) },
@@ -453,7 +497,12 @@ private fun NavGraphBuilder.channelOrdersSettings(
453497
private fun NavGraphBuilder.orderDetailSettings(
454498
navController: NavHostController,
455499
) {
456-
composable<Routes.OrderDetail> { navBackEntry ->
500+
composable<Routes.OrderDetail>(
501+
enterTransition = { screenSlideIn },
502+
exitTransition = { screenScaleOut },
503+
popEnterTransition = { screenScaleIn },
504+
popExitTransition = { screenSlideOut },
505+
) { navBackEntry ->
457506
OrderDetailScreen(
458507
orderItem = navBackEntry.toRoute(),
459508
onBackClick = { navController.popBackStack() },
@@ -464,7 +513,12 @@ private fun NavGraphBuilder.orderDetailSettings(
464513
private fun NavGraphBuilder.cjitDetailSettings(
465514
navController: NavHostController,
466515
) {
467-
composable<Routes.CjitDetail> { navBackEntry ->
516+
composable<Routes.CjitDetail>(
517+
enterTransition = { screenSlideIn },
518+
exitTransition = { screenScaleOut },
519+
popEnterTransition = { screenScaleIn },
520+
popExitTransition = { screenSlideOut },
521+
) { navBackEntry ->
468522
CJitDetailScreen(
469523
cjitItem = navBackEntry.toRoute(),
470524
onBackClick = { navController.popBackStack() },
@@ -476,7 +530,12 @@ private fun NavGraphBuilder.lightning(
476530
viewModel: WalletViewModel,
477531
navController: NavHostController,
478532
) {
479-
composable<Routes.Lightning> {
533+
composable<Routes.Lightning>(
534+
enterTransition = { screenSlideIn },
535+
exitTransition = { screenScaleOut },
536+
popEnterTransition = { screenScaleIn },
537+
popExitTransition = { screenSlideOut },
538+
) {
480539
LightningSettingsScreen(viewModel, navController)
481540
}
482541
}
@@ -485,15 +544,25 @@ private fun NavGraphBuilder.devSettings(
485544
viewModel: WalletViewModel,
486545
navController: NavHostController,
487546
) {
488-
composable<Routes.DevSettings> {
547+
composable<Routes.DevSettings>(
548+
enterTransition = { screenSlideIn },
549+
exitTransition = { screenScaleOut },
550+
popEnterTransition = { screenScaleIn },
551+
popExitTransition = { screenSlideOut },
552+
) {
489553
DevSettingsScreen(viewModel, navController)
490554
}
491555
}
492556

493557
private fun NavGraphBuilder.regtestSettings(
494558
navController: NavHostController,
495559
) {
496-
composable<Routes.RegtestSettings> {
560+
composable<Routes.RegtestSettings>(
561+
enterTransition = { screenSlideIn },
562+
exitTransition = { screenScaleOut },
563+
popEnterTransition = { screenScaleIn },
564+
popExitTransition = { screenSlideOut },
565+
) {
497566
val viewModel = hiltViewModel<BlocktankRegtestViewModel>()
498567
BlocktankRegtestScreen(viewModel, navController)
499568
}
@@ -503,7 +572,12 @@ private fun NavGraphBuilder.allActivity(
503572
viewModel: ActivityListViewModel,
504573
navController: NavHostController,
505574
) {
506-
composable<Routes.AllActivity> {
575+
composable<Routes.AllActivity>(
576+
enterTransition = { screenSlideIn },
577+
exitTransition = { screenScaleOut },
578+
popEnterTransition = { screenScaleIn },
579+
popExitTransition = { screenSlideOut },
580+
) {
507581
AllActivityScreen(
508582
viewModel = viewModel,
509583
onBackCLick = { navController.popBackStack() },
@@ -516,7 +590,12 @@ private fun NavGraphBuilder.activityItem(
516590
viewModel: ActivityListViewModel,
517591
navController: NavHostController,
518592
) {
519-
composable<Routes.ActivityItem> { navBackEntry ->
593+
composable<Routes.ActivityItem>(
594+
enterTransition = { screenSlideIn },
595+
exitTransition = { screenScaleOut },
596+
popEnterTransition = { screenScaleIn },
597+
popExitTransition = { screenSlideOut },
598+
) { navBackEntry ->
520599
ActivityItemScreen(
521600
viewModel = viewModel,
522601
activityItem = navBackEntry.toRoute(),
@@ -530,18 +609,8 @@ private fun NavGraphBuilder.qrScanner(
530609
navController: NavHostController,
531610
) {
532611
composable<Routes.QrScanner>(
533-
enterTransition = {
534-
slideInHorizontally(
535-
initialOffsetX = { it },
536-
animationSpec = tween(durationMillis = 300)
537-
)
538-
},
539-
exitTransition = {
540-
slideOutHorizontally(
541-
targetOffsetX = { it },
542-
animationSpec = tween(durationMillis = 300)
543-
)
544-
},
612+
enterTransition = { screenSlideIn },
613+
exitTransition = { screenSlideOut },
545614
) {
546615
QrScanningScreen(navController = navController) { qrCode ->
547616
navController.popBackStack()

app/src/main/java/to/bitkit/ui/MainActivity.kt

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ import to.bitkit.ui.screens.SplashScreen
2323
import to.bitkit.ui.screens.wallets.sheets.NewTransactionSheet
2424
import to.bitkit.ui.theme.AppThemeSurface
2525
import to.bitkit.ui.utils.enableAppEdgeToEdge
26+
import to.bitkit.ui.utils.screenScaleIn
27+
import to.bitkit.ui.utils.screenScaleOut
28+
import to.bitkit.ui.utils.screenSlideIn
29+
import to.bitkit.ui.utils.screenSlideOut
2630
import to.bitkit.viewmodels.ActivityListViewModel
2731
import to.bitkit.viewmodels.AppViewModel
2832
import to.bitkit.viewmodels.BlocktankViewModel
@@ -61,7 +65,12 @@ class MainActivity : ComponentActivity() {
6165
}
6266
)
6367
}
64-
composable<StartupRoutes.Intro> {
68+
composable<StartupRoutes.Intro>(
69+
enterTransition = { screenSlideIn },
70+
exitTransition = { screenScaleOut },
71+
popEnterTransition = { screenScaleIn },
72+
popExitTransition = { screenSlideOut },
73+
) {
6574
IntroScreen(
6675
onStartClick = {
6776
startupNavController.navigate(StartupRoutes.Slides())
@@ -71,7 +80,12 @@ class MainActivity : ComponentActivity() {
7180
},
7281
)
7382
}
74-
composable<StartupRoutes.Slides> { navBackEntry ->
83+
composable<StartupRoutes.Slides>(
84+
enterTransition = { screenSlideIn },
85+
exitTransition = { screenScaleOut },
86+
popEnterTransition = { screenScaleIn },
87+
popExitTransition = { screenSlideOut },
88+
) { navBackEntry ->
7589
val route = navBackEntry.toRoute<StartupRoutes.Slides>()
7690
OnboardingSlidesScreen(
7791
currentTab = route.tab,
@@ -91,7 +105,12 @@ class MainActivity : ComponentActivity() {
91105
onRestoreClick = { startupNavController.navigate(StartupRoutes.Restore) },
92106
)
93107
}
94-
composable<StartupRoutes.Restore> {
108+
composable<StartupRoutes.Restore>(
109+
enterTransition = { screenSlideIn },
110+
exitTransition = { screenScaleOut },
111+
popEnterTransition = { screenScaleIn },
112+
popExitTransition = { screenSlideOut },
113+
) {
95114
RestoreWalletView(
96115
onBackClick = { startupNavController.popBackStack() },
97116
onRestoreClick = { mnemonic, passphrase ->
@@ -109,7 +128,12 @@ class MainActivity : ComponentActivity() {
109128
}
110129
)
111130
}
112-
composable<StartupRoutes.Advanced> {
131+
composable<StartupRoutes.Advanced>(
132+
enterTransition = { screenSlideIn },
133+
exitTransition = { screenScaleOut },
134+
popEnterTransition = { screenScaleIn },
135+
popExitTransition = { screenSlideOut },
136+
) {
113137
CreateWalletWithPassphraseScreen(
114138
onBackClick = { startupNavController.popBackStack() },
115139
onCreateClick = { passphrase ->

app/src/main/java/to/bitkit/ui/onboarding/CreateWalletScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import androidx.compose.foundation.layout.Box
66
import androidx.compose.foundation.layout.Column
77
import androidx.compose.foundation.layout.Row
88
import androidx.compose.foundation.layout.Spacer
9-
import androidx.compose.foundation.layout.fillMaxHeight
109
import androidx.compose.foundation.layout.fillMaxSize
1110
import androidx.compose.foundation.layout.fillMaxWidth
1211
import androidx.compose.foundation.layout.height
@@ -51,7 +50,7 @@ fun CreateWalletScreen(
5150
Column(
5251
modifier = Modifier
5352
.fillMaxWidth()
54-
.height(250.dp)
53+
.height(264.dp)
5554
.align(Alignment.BottomCenter),
5655
) {
5756
Display(text = stringResource(R.string.onboarding__slide4_header).withAccent())
@@ -79,6 +78,7 @@ fun CreateWalletScreen(
7978
modifier = Modifier.weight(1f)
8079
)
8180
}
81+
Spacer(modifier = Modifier.height(16.dp))
8282
}
8383
}
8484
}

app/src/main/java/to/bitkit/ui/onboarding/OnboardingSlidesScreen.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import androidx.compose.foundation.layout.Column
1111
import androidx.compose.foundation.layout.PaddingValues
1212
import androidx.compose.foundation.layout.Row
1313
import androidx.compose.foundation.layout.Spacer
14-
import androidx.compose.foundation.layout.fillMaxHeight
1514
import androidx.compose.foundation.layout.fillMaxSize
1615
import androidx.compose.foundation.layout.fillMaxWidth
1716
import androidx.compose.foundation.layout.height
@@ -22,7 +21,6 @@ import androidx.compose.foundation.layout.systemBarsPadding
2221
import androidx.compose.foundation.pager.HorizontalPager
2322
import androidx.compose.foundation.pager.rememberPagerState
2423
import androidx.compose.foundation.shape.CircleShape
25-
import androidx.compose.foundation.verticalScroll
2624
import androidx.compose.material3.ExperimentalMaterial3Api
2725
import androidx.compose.material3.Text
2826
import androidx.compose.material3.TextButton
@@ -203,7 +201,7 @@ fun OnboardingTab(
203201
Column(
204202
modifier = Modifier
205203
.fillMaxWidth()
206-
.height(250.dp)
204+
.height(264.dp)
207205
.align(Alignment.BottomCenter),
208206
) {
209207
Display(text = title.withAccent(accentColor = titleAccentColor))

0 commit comments

Comments
 (0)