Skip to content

Commit 3d30e92

Browse files
authored
Merge pull request eu-digital-identity-wallet#436 from niscy-eudiw/feature/ime_padding_adjustments
Feature/ime padding adjustments
2 parents c78e215 + 952c625 commit 3d30e92

File tree

16 files changed

+454
-164
lines changed

16 files changed

+454
-164
lines changed

common-feature/src/main/java/eu/europa/ec/commonfeature/ui/biometric/BiometricScreen.kt

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ import androidx.compose.foundation.layout.PaddingValues
2222
import androidx.compose.foundation.layout.Row
2323
import androidx.compose.foundation.layout.fillMaxSize
2424
import androidx.compose.foundation.layout.fillMaxWidth
25+
import androidx.compose.foundation.layout.navigationBarsPadding
2526
import androidx.compose.foundation.layout.padding
27+
import androidx.compose.foundation.rememberScrollState
28+
import androidx.compose.foundation.verticalScroll
2629
import androidx.compose.material3.MaterialTheme
2730
import androidx.compose.material3.Text
2831
import androidx.compose.runtime.Composable
@@ -46,6 +49,7 @@ import eu.europa.ec.uilogic.component.AppIcons
4649
import eu.europa.ec.uilogic.component.content.ContentHeader
4750
import eu.europa.ec.uilogic.component.content.ContentHeaderConfig
4851
import eu.europa.ec.uilogic.component.content.ContentScreen
52+
import eu.europa.ec.uilogic.component.content.ImePaddingConfig
4953
import eu.europa.ec.uilogic.component.content.ScreenNavigateAction
5054
import eu.europa.ec.uilogic.component.preview.PreviewTheme
5155
import eu.europa.ec.uilogic.component.preview.ThemeModePreviews
@@ -60,6 +64,7 @@ import eu.europa.ec.uilogic.config.FlowCompletion
6064
import eu.europa.ec.uilogic.config.NavigationType
6165
import eu.europa.ec.uilogic.extension.cacheDeepLink
6266
import eu.europa.ec.uilogic.extension.finish
67+
import eu.europa.ec.uilogic.extension.paddingFrom
6368
import eu.europa.ec.uilogic.extension.resetBackStack
6469
import eu.europa.ec.uilogic.extension.setBackStackFlowCancelled
6570
import eu.europa.ec.uilogic.extension.setBackStackFlowSuccess
@@ -89,7 +94,8 @@ fun BiometricScreen(
8994
onBack = {
9095
viewModel.setEvent(Event.OnNavigateBack)
9196
},
92-
contentErrorConfig = state.error
97+
contentErrorConfig = state.error,
98+
imePaddingConfig = ImePaddingConfig.ONLY_CONTENT
9399
) {
94100
Body(
95101
state = state,
@@ -180,28 +186,30 @@ private fun Body(
180186
Column(
181187
Modifier
182188
.fillMaxSize()
183-
.padding(padding),
184-
verticalArrangement = Arrangement.Center
189+
.paddingFrom(padding, bottom = false)
185190
) {
186191
Column(
187192
modifier = Modifier
188193
.fillMaxWidth()
189-
.weight(1f),
194+
.weight(1f)
195+
.verticalScroll(rememberScrollState())
190196
) {
191197
MainContent(
192198
state = state,
193199
onEventSent = onEventSent,
194200
)
195201
}
196202

197-
Row(
198-
modifier = Modifier.fillMaxWidth(),
199-
horizontalArrangement = Arrangement.End,
200-
) {
201-
if (state.userBiometricsAreEnabled) {
203+
if (state.userBiometricsAreEnabled) {
204+
Row(
205+
modifier = Modifier
206+
.fillMaxWidth()
207+
.navigationBarsPadding()
208+
.padding(bottom = 5.dp),
209+
horizontalArrangement = Arrangement.End,
210+
) {
202211
WrapIconButton(
203212
iconData = AppIcons.TouchId,
204-
modifier = Modifier.padding(bottom = 5.dp),
205213
onClick = {
206214
onEventSent(
207215
Event.OnBiometricsClicked(
@@ -213,25 +221,25 @@ private fun Body(
213221
)
214222
}
215223
}
224+
}
216225

217-
LaunchedEffect(Unit) {
218-
effectFlow.onEach { effect ->
219-
when (effect) {
220-
is Effect.Navigation -> {
221-
onNavigationRequested(effect)
222-
}
226+
LaunchedEffect(Unit) {
227+
effectFlow.onEach { effect ->
228+
when (effect) {
229+
is Effect.Navigation -> {
230+
onNavigationRequested(effect)
231+
}
223232

224-
is Effect.InitializeBiometricAuthOnCreate -> {
225-
onEventSent(
226-
Event.OnBiometricsClicked(
227-
context = context,
228-
shouldThrowErrorIfNotAvailable = false,
229-
)
233+
is Effect.InitializeBiometricAuthOnCreate -> {
234+
onEventSent(
235+
Event.OnBiometricsClicked(
236+
context = context,
237+
shouldThrowErrorIfNotAvailable = false,
230238
)
231-
}
239+
)
232240
}
233-
}.collect()
234-
}
241+
}
242+
}.collect()
235243
}
236244
}
237245

common-feature/src/main/java/eu/europa/ec/commonfeature/ui/pin/PinScreen.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import androidx.compose.foundation.layout.PaddingValues
2323
import androidx.compose.foundation.layout.fillMaxSize
2424
import androidx.compose.foundation.layout.fillMaxWidth
2525
import androidx.compose.foundation.layout.padding
26+
import androidx.compose.foundation.rememberScrollState
27+
import androidx.compose.foundation.verticalScroll
2628
import androidx.compose.material3.ExperimentalMaterial3Api
2729
import androidx.compose.material3.MaterialTheme
2830
import androidx.compose.material3.SheetState
@@ -45,6 +47,7 @@ import eu.europa.ec.resourceslogic.R
4547
import eu.europa.ec.uilogic.component.AppIconAndText
4648
import eu.europa.ec.uilogic.component.AppIconAndTextDataUi
4749
import eu.europa.ec.uilogic.component.content.ContentScreen
50+
import eu.europa.ec.uilogic.component.content.ImePaddingConfig
4851
import eu.europa.ec.uilogic.component.preview.PreviewTheme
4952
import eu.europa.ec.uilogic.component.preview.ThemeModePreviews
5053
import eu.europa.ec.uilogic.component.utils.SPACING_LARGE
@@ -80,13 +83,14 @@ fun PinScreen(
8083
val isBottomSheetOpen = state.isBottomSheetOpen
8184
val scope = rememberCoroutineScope()
8285
val bottomSheetState = rememberModalBottomSheetState(
83-
skipPartiallyExpanded = false
86+
skipPartiallyExpanded = true
8487
)
8588

8689
ContentScreen(
8790
isLoading = state.isLoading,
8891
navigatableAction = state.action,
8992
onBack = { viewModel.setEvent(state.onBackEvent) },
93+
imePaddingConfig = ImePaddingConfig.ONLY_CONTENT,
9094
stickyBottom = { paddingValues ->
9195
WrapStickyBottomContent(
9296
modifier = Modifier
@@ -181,6 +185,7 @@ private fun Content(
181185
modifier = Modifier
182186
.fillMaxSize()
183187
.padding(paddingValues)
188+
.verticalScroll(rememberScrollState())
184189
) {
185190
AppIconAndText(
186191
modifier = Modifier

common-feature/src/main/java/eu/europa/ec/commonfeature/ui/request/RequestScreen.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ fun RequestScreen(
9292
val isBottomSheetOpen = state.isBottomSheetOpen
9393
val scope = rememberCoroutineScope()
9494
val bottomSheetState = rememberModalBottomSheetState(
95-
skipPartiallyExpanded = false
95+
skipPartiallyExpanded = true
9696
)
9797

9898
ContentScreen(

dashboard-feature/src/main/java/eu/europa/ec/dashboardfeature/ui/dashboard/DashboardScreen.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ internal fun DashboardScreen(
8686

8787
val scope = rememberCoroutineScope()
8888
val bottomSheetState = rememberModalBottomSheetState(
89-
skipPartiallyExpanded = false
89+
skipPartiallyExpanded = true
9090
)
9191

9292
Scaffold(

dashboard-feature/src/main/java/eu/europa/ec/dashboardfeature/ui/documents/detail/DocumentDetailsScreen.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ fun DocumentDetailsScreen(
118118
val isBottomSheetOpen = state.isBottomSheetOpen
119119
val scope = rememberCoroutineScope()
120120
val bottomSheetState = rememberModalBottomSheetState(
121-
skipPartiallyExpanded = false
121+
skipPartiallyExpanded = true
122122
)
123123

124124
val toolbarConfig = ToolbarConfig(

dashboard-feature/src/main/java/eu/europa/ec/dashboardfeature/ui/documents/list/DocumentsScreen.kt

Lines changed: 45 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ import eu.europa.ec.uilogic.component.DualSelectorButton
6969
import eu.europa.ec.uilogic.component.DualSelectorButtonDataUi
7070
import eu.europa.ec.uilogic.component.DualSelectorButtons
7171
import eu.europa.ec.uilogic.component.FiltersSearchBar
72+
import eu.europa.ec.uilogic.component.InlineSnackbar
7273
import eu.europa.ec.uilogic.component.ListItemDataUi
7374
import eu.europa.ec.uilogic.component.ListItemMainContentDataUi
7475
import eu.europa.ec.uilogic.component.ModalOptionUi
@@ -81,6 +82,7 @@ import eu.europa.ec.uilogic.component.preview.ThemeModePreviews
8182
import eu.europa.ec.uilogic.component.utils.HSpacer
8283
import eu.europa.ec.uilogic.component.utils.LifecycleEffect
8384
import eu.europa.ec.uilogic.component.utils.OneTimeLaunchedEffect
85+
import eu.europa.ec.uilogic.component.utils.SPACING_EXTRA_SMALL
8486
import eu.europa.ec.uilogic.component.utils.SPACING_LARGE
8587
import eu.europa.ec.uilogic.component.utils.SPACING_MEDIUM
8688
import eu.europa.ec.uilogic.component.utils.SPACING_SMALL
@@ -130,7 +132,7 @@ fun DocumentsScreen(
130132
isLoading = state.isLoading,
131133
navigatableAction = ScreenNavigateAction.NONE,
132134
onBack = { context.finish() },
133-
contentErrorConfig = state.error,
135+
contentErrorConfig = null,
134136
topBar = {
135137
TopBar(
136138
onEventSend = { viewModel.setEvent(it) },
@@ -247,44 +249,57 @@ private fun Content(
247249
coroutineScope: CoroutineScope,
248250
modalBottomSheetState: SheetState,
249251
) {
250-
LazyColumn(
252+
Box(
251253
modifier = Modifier
252254
.fillMaxSize()
253-
.paddingFrom(paddingValues, bottom = false),
254-
contentPadding = PaddingValues(bottom = SPACING_MEDIUM.dp),
255+
.paddingFrom(paddingValues, bottom = false)
255256
) {
256-
item {
257-
val searchItemUi =
258-
SearchItemUi(searchLabel = stringResource(R.string.documents_screen_search_label))
259-
FiltersSearchBar(
260-
placeholder = searchItemUi.searchLabel,
261-
onValueChange = { onEventSend(Event.OnSearchQueryChanged(it)) },
262-
onFilterClick = { onEventSend(Event.FiltersPressed) },
263-
onClearClick = { onEventSend(Event.OnSearchQueryChanged("")) },
264-
isFilteringActive = state.isFilteringActive,
265-
text = state.searchText
266-
)
267-
VSpacer.Large()
268-
}
269-
270-
if (state.showNoResultsFound) {
257+
LazyColumn(
258+
modifier = Modifier.fillMaxSize(),
259+
contentPadding = PaddingValues(bottom = SPACING_MEDIUM.dp),
260+
) {
271261
item {
272-
NoResults(modifier = Modifier.fillMaxWidth())
273-
}
274-
} else {
275-
itemsIndexed(items = state.documentsUi) { index, (documentCategory, documents) ->
276-
DocumentCategory(
277-
modifier = Modifier.fillMaxWidth(),
278-
category = documentCategory,
279-
documents = documents,
280-
onEventSend = onEventSend
262+
val searchItemUi =
263+
SearchItemUi(searchLabel = stringResource(R.string.documents_screen_search_label))
264+
FiltersSearchBar(
265+
placeholder = searchItemUi.searchLabel,
266+
onValueChange = { onEventSend(Event.OnSearchQueryChanged(it)) },
267+
onFilterClick = { onEventSend(Event.FiltersPressed) },
268+
onClearClick = { onEventSend(Event.OnSearchQueryChanged("")) },
269+
isFilteringActive = state.isFilteringActive,
270+
text = state.searchText
281271
)
272+
VSpacer.Large()
273+
}
282274

283-
if (index != state.documentsUi.lastIndex) {
284-
VSpacer.ExtraLarge()
275+
if (state.showNoResultsFound) {
276+
item {
277+
NoResults(modifier = Modifier.fillMaxWidth())
278+
}
279+
} else {
280+
itemsIndexed(items = state.documentsUi) { index, (documentCategory, documents) ->
281+
DocumentCategory(
282+
modifier = Modifier.fillMaxWidth(),
283+
category = documentCategory,
284+
documents = documents,
285+
onEventSend = onEventSend
286+
)
287+
288+
if (index != state.documentsUi.lastIndex) {
289+
VSpacer.ExtraLarge()
290+
}
285291
}
286292
}
287293
}
294+
295+
if (state.error != null) {
296+
InlineSnackbar(
297+
error = state.error,
298+
modifier = Modifier
299+
.align(Alignment.BottomCenter)
300+
.padding(bottom = SPACING_EXTRA_SMALL.dp)
301+
)
302+
}
288303
}
289304

290305
LifecycleEffect(

dashboard-feature/src/main/java/eu/europa/ec/dashboardfeature/ui/home/HomeScreen.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ fun HomeScreen(
9696
val isBottomSheetOpen = state.isBottomSheetOpen
9797
val scope = rememberCoroutineScope()
9898
val bottomSheetState = rememberModalBottomSheetState(
99-
skipPartiallyExpanded = false
99+
skipPartiallyExpanded = true
100100
)
101101

102102
ContentScreen(

0 commit comments

Comments
 (0)