Merge pull request #5003 from element-hq/feature/bma/homeScreenIteration

Home screen iteration
This commit is contained in:
Benoit Marty
2025-07-09 16:06:58 +02:00
committed by GitHub
42 changed files with 145 additions and 118 deletions

View File

@@ -12,6 +12,7 @@ package io.element.android.features.home.impl
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.calculateEndPadding
import androidx.compose.foundation.layout.calculateStartPadding
import androidx.compose.foundation.layout.consumeWindowInsets
@@ -181,6 +182,15 @@ private fun HomeScaffold(
displayFilters = roomListState.displayFilters && state.currentHomeNavigationBarItem == HomeNavigationBarItem.Chats,
filtersState = roomListState.filtersState,
canReportBug = state.canReportBug,
modifier = if (state.isSpaceFeatureEnabled) {
Modifier.hazeEffect(
state = hazeState,
style = HazeMaterials.thick(),
)
} else {
Modifier
.background(ElementTheme.colors.bgCanvasDefault)
}
)
},
bottomBar = {
@@ -190,7 +200,7 @@ private fun HomeScaffold(
modifier = Modifier
.hazeEffect(
state = hazeState,
style = HazeMaterials.regular(),
style = HazeMaterials.thick(),
)
) {
HomeNavigationBarItem.entries.forEach { item ->
@@ -227,15 +237,18 @@ private fun HomeScaffold(
onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick,
onRoomClick = ::onRoomClick,
onCreateRoomClick = onCreateRoomClick,
// FAB height is 56dp, bottom padding is 16dp, we add 8dp as extra margin -> 56+16+8 = 80,
// and include provided bottom padding
contentBottomPadding = 80.dp + padding.calculateBottomPadding(),
contentPadding = PaddingValues(
// FAB height is 56dp, bottom padding is 16dp, we add 8dp as extra margin -> 56+16+8 = 80,
// and include provided bottom padding
bottom = 80.dp + padding.calculateBottomPadding(),
top = padding.calculateTopPadding()
),
modifier = Modifier
.padding(
top = padding.calculateTopPadding(),
bottom = 0.dp,
start = padding.calculateStartPadding(LocalLayoutDirection.current),
end = padding.calculateEndPadding(LocalLayoutDirection.current),
PaddingValues(
start = padding.calculateStartPadding(LocalLayoutDirection.current),
end = padding.calculateEndPadding(LocalLayoutDirection.current),
)
)
.consumeWindowInsets(padding)
.hazeSource(state = hazeState)

View File

@@ -31,7 +31,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
@@ -67,44 +66,53 @@ fun RoomListContentView(
onConfirmRecoveryKeyClick: () -> Unit,
onRoomClick: (RoomListRoomSummary) -> Unit,
onCreateRoomClick: () -> Unit,
contentBottomPadding: Dp,
contentPadding: PaddingValues,
modifier: Modifier = Modifier,
) {
Box(modifier = modifier) {
when (contentState) {
is RoomListContentState.Skeleton -> {
SkeletonView(
count = contentState.count,
)
}
is RoomListContentState.Empty -> {
EmptyView(
state = contentState,
eventSink = eventSink,
onSetUpRecoveryClick = onSetUpRecoveryClick,
onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick,
onCreateRoomClick = onCreateRoomClick,
)
}
is RoomListContentState.Rooms -> {
RoomsView(
state = contentState,
hideInvitesAvatars = hideInvitesAvatars,
filtersState = filtersState,
eventSink = eventSink,
onSetUpRecoveryClick = onSetUpRecoveryClick,
onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick,
onRoomClick = onRoomClick,
contentBottomPadding = contentBottomPadding,
)
}
when (contentState) {
is RoomListContentState.Skeleton -> {
SkeletonView(
modifier = modifier,
count = contentState.count,
contentPadding = contentPadding,
)
}
is RoomListContentState.Empty -> {
EmptyView(
modifier = modifier.padding(contentPadding),
state = contentState,
eventSink = eventSink,
onSetUpRecoveryClick = onSetUpRecoveryClick,
onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick,
onCreateRoomClick = onCreateRoomClick,
)
}
is RoomListContentState.Rooms -> {
RoomsView(
modifier = modifier,
state = contentState,
hideInvitesAvatars = hideInvitesAvatars,
filtersState = filtersState,
eventSink = eventSink,
onSetUpRecoveryClick = onSetUpRecoveryClick,
onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick,
onRoomClick = onRoomClick,
contentPadding = contentPadding,
)
}
}
}
@Composable
private fun SkeletonView(count: Int, modifier: Modifier = Modifier) {
LazyColumn(modifier = modifier) {
private fun SkeletonView(
count: Int,
contentPadding: PaddingValues,
modifier: Modifier = Modifier,
) {
LazyColumn(
modifier = modifier,
contentPadding = contentPadding,
) {
repeat(count) { index ->
item {
RoomSummaryPlaceholderRow()
@@ -167,7 +175,7 @@ private fun RoomsView(
onSetUpRecoveryClick: () -> Unit,
onConfirmRecoveryKeyClick: () -> Unit,
onRoomClick: (RoomListRoomSummary) -> Unit,
contentBottomPadding: Dp,
contentPadding: PaddingValues,
modifier: Modifier = Modifier,
) {
if (state.summaries.isEmpty() && filtersState.hasAnyFilterSelected) {
@@ -183,7 +191,7 @@ private fun RoomsView(
onSetUpRecoveryClick = onSetUpRecoveryClick,
onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick,
onRoomClick = onRoomClick,
contentBottomPadding = contentBottomPadding,
contentPadding = contentPadding,
modifier = modifier.fillMaxSize(),
)
}
@@ -197,7 +205,7 @@ private fun RoomsViewList(
onSetUpRecoveryClick: () -> Unit,
onConfirmRecoveryKeyClick: () -> Unit,
onRoomClick: (RoomListRoomSummary) -> Unit,
contentBottomPadding: Dp,
contentPadding: PaddingValues,
modifier: Modifier = Modifier,
) {
val lazyListState = rememberLazyListState()
@@ -216,7 +224,7 @@ private fun RoomsViewList(
LazyColumn(
state = lazyListState,
modifier = modifier,
contentPadding = PaddingValues(bottom = contentBottomPadding)
contentPadding = contentPadding,
) {
when (state.securityBannerState) {
SecurityBannerState.SetUpRecovery -> {
@@ -329,6 +337,6 @@ internal fun RoomListContentViewPreview(@PreviewParameter(RoomListContentStatePr
onConfirmRecoveryKeyClick = {},
onRoomClick = {},
onCreateRoomClick = {},
contentBottomPadding = 0.dp,
contentPadding = PaddingValues(0.dp),
)
}

View File

@@ -42,6 +42,7 @@ open class RoomListStateProvider : PreviewParameterProvider<RoomListState> {
aRoomListState(searchState = aRoomListSearchState(isSearchActive = true, query = "Test")),
aRoomListState(contentState = aRoomsContentState(securityBannerState = SecurityBannerState.SetUpRecovery)),
aRoomListState(contentState = aRoomsContentState(batteryOptimizationState = aBatteryOptimizationState(shouldDisplayBanner = true))),
aRoomListState(contentState = anEmptyContentState(securityBannerState = SecurityBannerState.RecoveryKeyConfirmation)),
)
}

View File

@@ -37,7 +37,6 @@ fun Modifier.backgroundVerticalGradient(
brush = Brush.verticalGradient(
colorStops = subtleColorStops(isEnterpriseBuild),
),
alpha = 0.75f,
)
}