Add breakpoint helper and expand device previews.

Co-authored-by: jeffrey-signal <jeffrey@signal.org>
This commit is contained in:
Alex Hart
2026-04-06 13:18:35 -03:00
committed by Greyson Parrelli
parent a7bb2831f8
commit 264447a6d9
4 changed files with 173 additions and 24 deletions

View File

@@ -12,9 +12,12 @@ import androidx.compose.runtime.Immutable
import androidx.compose.runtime.remember
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.platform.LocalResources
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.window.core.layout.WindowSizeClass
import org.signal.core.ui.WindowBreakpoint
import org.signal.core.ui.getWindowBreakpoint
import org.signal.core.ui.isSplitPane
private val MEDIUM_CONTENT_CORNERS = 18.dp
@@ -70,25 +73,27 @@ data class MainContentLayoutData(
@Composable
fun rememberContentLayoutData(mode: MainToolbarMode): MainContentLayoutData {
val windowSizeClass = currentWindowAdaptiveInfo().windowSizeClass
val resources = LocalResources.current
val breakpoint = resources.getWindowBreakpoint()
return remember(windowSizeClass, mode) {
return remember(windowSizeClass, mode, breakpoint) {
val isSplitPane = windowSizeClass.isSplitPane()
val isWidthExpanded = windowSizeClass.isWidthAtLeastBreakpoint(WindowSizeClass.WIDTH_DP_EXPANDED_LOWER_BOUND)
val isLargeWindowSize = breakpoint == WindowBreakpoint.LARGE
MainContentLayoutData(
shape = when {
!isSplitPane -> RectangleShape
isWidthExpanded -> RoundedCornerShape(EXTENDED_CONTENT_CORNERS)
isLargeWindowSize -> RoundedCornerShape(EXTENDED_CONTENT_CORNERS)
else -> RoundedCornerShape(MEDIUM_CONTENT_CORNERS)
},
navigationBarShape = when {
!isSplitPane -> RectangleShape
isWidthExpanded -> RoundedCornerShape(0.dp, 0.dp, EXTENDED_CONTENT_CORNERS, EXTENDED_CONTENT_CORNERS)
isLargeWindowSize -> RoundedCornerShape(0.dp, 0.dp, EXTENDED_CONTENT_CORNERS, EXTENDED_CONTENT_CORNERS)
else -> RoundedCornerShape(0.dp, 0.dp, MEDIUM_CONTENT_CORNERS, MEDIUM_CONTENT_CORNERS)
},
partitionWidth = when {
!isSplitPane -> 0.dp
isWidthExpanded -> 24.dp
isLargeWindowSize -> 24.dp
else -> 13.dp
},
listPaddingStart = when {
@@ -102,7 +107,7 @@ data class MainContentLayoutData(
},
detailPaddingEnd = when {
!isSplitPane -> 0.dp
isWidthExpanded -> 24.dp
isLargeWindowSize -> 24.dp
else -> 12.dp
}
)

View File

@@ -38,12 +38,17 @@ import androidx.compose.ui.draw.drawWithContent
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.layout.layout
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalResources
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.zIndex
import org.signal.core.ui.WindowBreakpoint
import org.signal.core.ui.compose.AllDevicePreviews
import org.signal.core.ui.compose.Previews
import org.signal.core.ui.getWindowBreakpoint
import org.signal.core.ui.isSplitPane
import org.signal.core.ui.isWidthExpanded
import org.thoughtcrime.securesms.main.MainFloatingActionButtonsCallback
import org.thoughtcrime.securesms.main.MainNavigationBar
import org.thoughtcrime.securesms.main.MainNavigationRail
@@ -57,14 +62,21 @@ enum class NavigationType {
companion object {
@Composable
fun rememberNavigationType(): NavigationType {
val windowSizeClass = currentWindowAdaptiveInfo().windowSizeClass
val resources = LocalResources.current
val config = LocalConfiguration.current
val windowBreakpoint = remember(config) { resources.getWindowBreakpoint() }
return remember(windowSizeClass) {
if (windowSizeClass.isSplitPane()) {
RAIL
} else {
BAR
return when (windowBreakpoint) {
WindowBreakpoint.SMALL -> BAR
WindowBreakpoint.MEDIUM -> {
val windowSizeClass = currentWindowAdaptiveInfo().windowSizeClass
if (windowSizeClass.isWidthExpanded) {
RAIL
} else {
BAR
}
}
WindowBreakpoint.LARGE -> RAIL
}
}
}
@@ -265,7 +277,7 @@ private fun AppScaffoldPreview() {
AppScaffold(
navigator = rememberAppScaffoldNavigator(
isSplitPane = windowSizeClass.isSplitPane(),
isSplitPane = windowSizeClass.isSplitPane(false),
defaultPanePreferredWidth = 416.dp,
horizontalPartitionSpacerSize = 16.dp
),