Skip to content
This repository was archived by the owner on Aug 21, 2025. It is now read-only.

Commit c36bbb5

Browse files
committed
Implement expanded QR
1 parent 1149565 commit c36bbb5

20 files changed

Lines changed: 375 additions & 34 deletions
101 KB
Loading
1.71 KB
Loading

homeUi/src/main/kotlin/com/gravatar/app/homeUi/navigation/HomeNavigation.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import kotlinx.serialization.Serializable
1414
internal fun HomeNavigation(
1515
navController: NavHostController,
1616
snackbarHostState: SnackbarHostState,
17+
onShouldShowBottomBar: (Boolean) -> Unit,
1718
) {
1819
NavHost(
1920
navController = navController,
@@ -37,7 +38,8 @@ internal fun HomeNavigation(
3738
composable<HomeDestination.Share> {
3839
ShareScreen(
3940
viewModelStoreOwner = navController.getBackStackEntry(HomeRoute::class),
40-
snackbarHostState = snackbarHostState
41+
snackbarHostState = snackbarHostState,
42+
onShouldShowBottomBar = onShouldShowBottomBar,
4143
)
4244
}
4345
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.gravatar.app.homeUi.presentation.home
2+
3+
internal sealed class HomeEvent {
4+
data class ShowBottomBar(val show: Boolean) : HomeEvent()
5+
}

homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/HomeScreen.kt

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ internal fun HomeScreen(
5151
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
5252

5353
HomeScreen(uiState = uiState) { navController, snackbarHostState ->
54-
HomeNavigation(navController, snackbarHostState)
54+
HomeNavigation(navController, snackbarHostState) { showBottomBar ->
55+
viewModel.onEvent(HomeEvent.ShowBottomBar(showBottomBar))
56+
}
5557
}
5658
}
5759

@@ -68,37 +70,39 @@ internal fun HomeScreen(
6870
contentWindowInsets = WindowInsets(0, 0, 0, 0),
6971
snackbarHost = { GravatarSnackbarHost(hostState = snackbarHostState) },
7072
bottomBar = {
71-
NavigationBar {
72-
HomeDestination.allDestinations
73-
.sortedBy { it.position }
74-
.forEach { destination ->
75-
NavigationBarItem(
76-
icon = {
77-
Icon(
78-
painterResource(id = destination.iconRes),
79-
contentDescription = stringResource(destination.labelRes)
80-
)
81-
},
82-
label = { Text(stringResource(destination.labelRes)) },
83-
selected = destination.route == backStackEntry.value?.destination?.route,
84-
onClick = {
85-
if (backStackEntry.value?.destination?.route != destination.route) {
86-
navController.navigate(destination) {
87-
popUpTo(navController.graph.startDestinationId) {
88-
saveState = true
73+
if (uiState.showBottomBar) {
74+
NavigationBar {
75+
HomeDestination.allDestinations
76+
.sortedBy { it.position }
77+
.forEach { destination ->
78+
NavigationBarItem(
79+
icon = {
80+
Icon(
81+
painterResource(id = destination.iconRes),
82+
contentDescription = stringResource(destination.labelRes)
83+
)
84+
},
85+
label = { Text(stringResource(destination.labelRes)) },
86+
selected = destination.route == backStackEntry.value?.destination?.route,
87+
onClick = {
88+
if (backStackEntry.value?.destination?.route != destination.route) {
89+
navController.navigate(destination) {
90+
popUpTo(navController.graph.startDestinationId) {
91+
saveState = true
92+
}
93+
launchSingleTop = true
94+
restoreState = true
8995
}
90-
launchSingleTop = true
91-
restoreState = true
9296
}
93-
}
94-
},
95-
colors = NavigationBarItemDefaults.colors(
96-
selectedIconColor = MaterialTheme.colorScheme.primary,
97-
selectedTextColor = MaterialTheme.colorScheme.primary,
98-
indicatorColor = Color.Transparent,
97+
},
98+
colors = NavigationBarItemDefaults.colors(
99+
selectedIconColor = MaterialTheme.colorScheme.primary,
100+
selectedTextColor = MaterialTheme.colorScheme.primary,
101+
indicatorColor = Color.Transparent,
102+
)
99103
)
100-
)
101-
}
104+
}
105+
}
102106
}
103107
}
104108
) { innerPadding ->
@@ -148,7 +152,7 @@ private fun HomeScreenPreview() {
148152
networkState = null
149153
)
150154
) { navController, snackbarHostState ->
151-
HomeNavigation(navController, snackbarHostState)
155+
HomeNavigation(navController, snackbarHostState) {}
152156
}
153157
}
154158

@@ -160,6 +164,6 @@ private fun HomeScreenNoInternetPreview() {
160164
networkState = NetworkState.DISCONNECTED
161165
)
162166
) { navController, snackbarHostState ->
163-
HomeNavigation(navController, snackbarHostState)
167+
HomeNavigation(navController, snackbarHostState) {}
164168
}
165169
}

homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/HomeUiState.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.gravatar.app.networkmonitor.NetworkState
44

55
internal data class HomeUiState(
66
val networkState: NetworkState? = null,
7+
val showBottomBar: Boolean = true,
78
) {
89

910
val noInternetBannerVisible: Boolean = networkState == NetworkState.DISCONNECTED

homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/HomeViewModel.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,14 @@ internal class HomeViewModel(
2626
}
2727
.launchIn(viewModelScope)
2828
}
29+
30+
fun onEvent(homeEvent: HomeEvent) {
31+
when (homeEvent) {
32+
is HomeEvent.ShowBottomBar -> {
33+
_uiState.update { currentState ->
34+
currentState.copy(showBottomBar = homeEvent.show)
35+
}
36+
}
37+
}
38+
}
2939
}

homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/share/ShareAction.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ import java.io.File
44

55
internal sealed class ShareAction {
66
data class ShareVCard(val vCardFile: File) : ShareAction()
7+
data class ShowBottomBar(val show: Boolean) : ShareAction()
78
}

homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/share/ShareEvent.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,6 @@ internal sealed class ShareEvent {
99
data object OnPrivateInformationClicked : ShareEvent()
1010
data object OnDismissPrivateInformationDialog : ShareEvent()
1111
data object OnShareClick : ShareEvent()
12+
data object OnExpandQrCodeClick : ShareEvent()
13+
data object OnDismissExpandedQrCode : ShareEvent()
1214
}

homeUi/src/main/kotlin/com/gravatar/app/homeUi/presentation/home/share/ShareScreen.kt

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.gravatar.app.homeUi.presentation.home.share
22

33
import android.content.Context
44
import android.content.Intent
5+
import androidx.compose.animation.AnimatedVisibility
56
import androidx.compose.foundation.layout.Column
67
import androidx.compose.foundation.layout.fillMaxSize
78
import androidx.compose.foundation.layout.fillMaxWidth
@@ -26,6 +27,7 @@ import androidx.lifecycle.repeatOnLifecycle
2627
import com.gravatar.app.design.theme.GravatarAppTheme
2728
import com.gravatar.app.homeUi.GravatarFileProvider
2829
import com.gravatar.app.homeUi.presentation.home.components.topbar.components.AboutAppDialog
30+
import com.gravatar.app.homeUi.presentation.home.share.components.ExpandedQrCode
2931
import com.gravatar.app.homeUi.presentation.home.share.components.ItemDivider
3032
import com.gravatar.app.homeUi.presentation.home.share.components.PrivateInformationDialog
3133
import com.gravatar.app.homeUi.presentation.home.share.components.ShareHeader
@@ -42,7 +44,8 @@ import java.io.File
4244
internal fun ShareScreen(
4345
viewModelStoreOwner: ViewModelStoreOwner,
4446
viewModel: ShareViewModel = koinViewModel(viewModelStoreOwner = viewModelStoreOwner),
45-
snackbarHostState: SnackbarHostState
47+
snackbarHostState: SnackbarHostState,
48+
onShouldShowBottomBar: (Boolean) -> Unit,
4649
) {
4750
val context = LocalContext.current
4851
val lifecycle = LocalLifecycleOwner.current
@@ -56,6 +59,10 @@ internal fun ShareScreen(
5659
is ShareAction.ShareVCard -> {
5760
shareVCardFile(action.vCardFile, context)
5861
}
62+
63+
is ShareAction.ShowBottomBar -> {
64+
onShouldShowBottomBar(action.show)
65+
}
5966
}
6067
}
6168
}
@@ -86,6 +93,7 @@ internal fun ShareScreen(uiState: ShareUiState, onEvent: (ShareEvent) -> Unit) {
8693
},
8794
vCardQrCodeData = uiState.vCardQrCodeData.exportToString(withPhoto = false),
8895
onShareClick = { onEvent(ShareEvent.OnShareClick) },
96+
onExpandQrCodeClick = { onEvent(ShareEvent.OnExpandQrCodeClick) },
8997
modifier = Modifier
9098
.fillMaxWidth(),
9199
)
@@ -133,6 +141,16 @@ internal fun ShareScreen(uiState: ShareUiState, onEvent: (ShareEvent) -> Unit) {
133141
}
134142
)
135143
}
144+
145+
AnimatedVisibility(uiState.isQrCodeExpanded) {
146+
ExpandedQrCode(
147+
vCardQrCodeData = uiState.vCardQrCodeData.exportToString(withPhoto = false),
148+
avatarUrl = uiState.avatarUrl.orEmpty(),
149+
onDismissRequest = {
150+
onEvent(ShareEvent.OnDismissExpandedQrCode)
151+
}
152+
)
153+
}
136154
}
137155

138156
private fun shareVCardFile(

0 commit comments

Comments
 (0)