From d35ae01633557a9ddeb63e3dbd36b6f8e73f3fba Mon Sep 17 00:00:00 2001 From: LossyDragon Date: Sun, 16 Feb 2025 19:33:21 -0600 Subject: [PATCH 1/2] Implement a proper fix for library list content padding. This usually affected devices with a display cutout. Fix library items not filling width when in landscape. Fix previews --- .../Pluvia/ui/screen/library/LibraryScreen.kt | 4 ++ .../screen/library/components/LibraryList.kt | 5 ++- .../library/components/LibraryListPane.kt | 42 +++++++++---------- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/OxGames/Pluvia/ui/screen/library/LibraryScreen.kt b/app/src/main/java/com/OxGames/Pluvia/ui/screen/library/LibraryScreen.kt index ade885a..4834341 100644 --- a/app/src/main/java/com/OxGames/Pluvia/ui/screen/library/LibraryScreen.kt +++ b/app/src/main/java/com/OxGames/Pluvia/ui/screen/library/LibraryScreen.kt @@ -20,9 +20,11 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.OxGames.Pluvia.PrefManager import com.OxGames.Pluvia.data.LibraryItem import com.OxGames.Pluvia.service.SteamService import com.OxGames.Pluvia.ui.data.LibraryState @@ -137,6 +139,8 @@ private fun LibraryScreenContent( @Composable private fun Preview_LibraryScreenContent() { val sheetState = rememberModalBottomSheetState() + val context = LocalContext.current + PrefManager.init(context) var state by remember { mutableStateOf( LibraryState( diff --git a/app/src/main/java/com/OxGames/Pluvia/ui/screen/library/components/LibraryList.kt b/app/src/main/java/com/OxGames/Pluvia/ui/screen/library/components/LibraryList.kt index d1bf41f..e95c680 100644 --- a/app/src/main/java/com/OxGames/Pluvia/ui/screen/library/components/LibraryList.kt +++ b/app/src/main/java/com/OxGames/Pluvia/ui/screen/library/components/LibraryList.kt @@ -20,6 +20,7 @@ import com.OxGames.Pluvia.data.LibraryItem @Composable internal fun LibraryList( + modifier: Modifier = Modifier, contentPaddingValues: PaddingValues, listState: LazyListState, list: List, @@ -27,7 +28,7 @@ internal fun LibraryList( ) { if (list.isEmpty()) { Box( - modifier = Modifier.fillMaxSize(), + modifier = modifier.fillMaxSize(), contentAlignment = Alignment.Center, ) { Surface( @@ -44,7 +45,7 @@ internal fun LibraryList( } } else { LazyColumn( - modifier = Modifier.fillMaxSize(), + modifier = modifier.fillMaxSize(), state = listState, contentPadding = contentPaddingValues, ) { diff --git a/app/src/main/java/com/OxGames/Pluvia/ui/screen/library/components/LibraryListPane.kt b/app/src/main/java/com/OxGames/Pluvia/ui/screen/library/components/LibraryListPane.kt index a8c9b2b..2c6e546 100644 --- a/app/src/main/java/com/OxGames/Pluvia/ui/screen/library/components/LibraryListPane.kt +++ b/app/src/main/java/com/OxGames/Pluvia/ui/screen/library/components/LibraryListPane.kt @@ -1,5 +1,6 @@ package com.OxGames.Pluvia.ui.screen.library.components +import android.content.res.Configuration import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut @@ -7,13 +8,8 @@ import androidx.compose.animation.scaleIn import androidx.compose.animation.scaleOut import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.asPaddingValues -import androidx.compose.foundation.layout.calculateEndPadding -import androidx.compose.foundation.layout.calculateStartPadding import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.statusBars +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.icons.Icons @@ -36,9 +32,11 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp +import com.OxGames.Pluvia.PrefManager import com.OxGames.Pluvia.data.LibraryItem import com.OxGames.Pluvia.ui.data.LibraryState import com.OxGames.Pluvia.ui.enums.AppFilter @@ -62,7 +60,14 @@ internal fun LibraryListPane( val expandedFab by remember { derivedStateOf { listState.firstVisibleItemIndex == 0 } } val snackBarHost = remember { SnackbarHostState() } + // Determine the orientation to add additional scaffold padding. + val configuration = LocalConfiguration.current + val isPortrait = remember(configuration) { + configuration.orientation == Configuration.ORIENTATION_PORTRAIT + } + Scaffold( + modifier = if (isPortrait) Modifier else Modifier.statusBarsPadding(), snackbarHost = { SnackbarHost(snackBarHost) }, topBar = { val searchListState = rememberLazyListState() @@ -91,25 +96,14 @@ internal fun LibraryListPane( } }, ) { paddingValues -> - val statusBarPadding = WindowInsets.statusBars.asPaddingValues().calculateTopPadding() Box( - modifier = Modifier - .fillMaxSize() - .padding( - PaddingValues( - start = paddingValues.calculateStartPadding(LayoutDirection.Ltr), - end = paddingValues.calculateEndPadding(LayoutDirection.Ltr), - top = statusBarPadding, - bottom = paddingValues.calculateBottomPadding(), - ), - ), + modifier = Modifier.fillMaxSize(), ) { LibraryList( list = state.appInfoList, listState = listState, contentPaddingValues = PaddingValues( - // TODO this fixes a `Top padding must be non-negative` crash on P9PXL, but I don't fully know why. - top = maxOf(0.dp, paddingValues.calculateTopPadding().minus(statusBarPadding)), + top = paddingValues.calculateTopPadding(), bottom = 72.dp, ), onItemClick = onNavigate, @@ -135,15 +129,17 @@ internal fun LibraryListPane( ***********/ @OptIn(ExperimentalMaterial3Api::class) -@Preview(uiMode = android.content.res.Configuration.UI_MODE_NIGHT_YES or android.content.res.Configuration.UI_MODE_TYPE_NORMAL) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES or Configuration.UI_MODE_TYPE_NORMAL) @Preview @Composable private fun Preview_LibraryListPane() { + val context = LocalContext.current + PrefManager.init(context) val sheetState = rememberModalBottomSheetState() var state by remember { mutableStateOf( LibraryState( - appInfoList = List(15) { idx -> + appInfoList = List(20) { idx -> val item = fakeAppInfo(idx) LibraryItem( index = idx, @@ -158,7 +154,7 @@ private fun Preview_LibraryListPane() { PluviaTheme { Surface { LibraryListPane( - listState = rememberLazyListState(), + listState = LazyListState(2, 64), state = state, sheetState = sheetState, onFilterChanged = { }, From 1c71418187543be06115e5798352af25146eb1ce Mon Sep 17 00:00:00 2001 From: LossyDragon Date: Sun, 16 Feb 2025 19:39:54 -0600 Subject: [PATCH 2/2] Fix friend list items not filling width when in landscape. --- .../Pluvia/ui/screen/friends/FriendStickyHeader.kt | 10 ++++++++-- .../OxGames/Pluvia/ui/screen/friends/FriendsScreen.kt | 7 +++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/OxGames/Pluvia/ui/screen/friends/FriendStickyHeader.kt b/app/src/main/java/com/OxGames/Pluvia/ui/screen/friends/FriendStickyHeader.kt index dbad246..3e921ca 100644 --- a/app/src/main/java/com/OxGames/Pluvia/ui/screen/friends/FriendStickyHeader.kt +++ b/app/src/main/java/com/OxGames/Pluvia/ui/screen/friends/FriendStickyHeader.kt @@ -18,9 +18,15 @@ import com.OxGames.Pluvia.ui.theme.PluviaTheme import `in`.dragonbra.javasteam.enums.EPersonaState @Composable -fun StickyHeaderItem(isCollapsed: Boolean, header: String, count: Int, onHeaderAction: () -> Unit) { +fun StickyHeaderItem( + modifier: Modifier = Modifier, + isCollapsed: Boolean, + header: String, + count: Int, + onHeaderAction: () -> Unit, +) { ListItem( - modifier = Modifier.clickable(onClick = onHeaderAction), + modifier = modifier.clickable(onClick = onHeaderAction), headlineContent = { Text(text = "$header ($count)") }, trailingContent = { val button = when (isCollapsed) { diff --git a/app/src/main/java/com/OxGames/Pluvia/ui/screen/friends/FriendsScreen.kt b/app/src/main/java/com/OxGames/Pluvia/ui/screen/friends/FriendsScreen.kt index 2987c7d..794faf1 100644 --- a/app/src/main/java/com/OxGames/Pluvia/ui/screen/friends/FriendsScreen.kt +++ b/app/src/main/java/com/OxGames/Pluvia/ui/screen/friends/FriendsScreen.kt @@ -256,10 +256,13 @@ private fun FriendsListPane( ) { paddingValues -> LazyColumn( modifier = Modifier - .padding(paddingValues) + .padding( + top = paddingValues.calculateTopPadding(), + bottom = paddingValues.calculateBottomPadding(), + ) .fillMaxSize(), state = listState, - contentPadding = PaddingValues(bottom = 72.dp), // Extra space for fab + contentPadding = PaddingValues(bottom = 72.dp), ) { state.friendsList.forEach { (key, value) -> stickyHeader {