Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 46db4793 authored by Chaohui Wang's avatar Chaohui Wang Committed by Android (Google) Code Review
Browse files

Merge "Align AppBar top margin with current Settings"

parents a228a73a 7a186a08
Loading
Loading
Loading
Loading
+25 −13
Original line number Diff line number Diff line
@@ -50,6 +50,8 @@ import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.SideEffect
import androidx.compose.runtime.Stable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@@ -61,6 +63,7 @@ import androidx.compose.ui.layout.AlignmentLine
import androidx.compose.ui.layout.LastBaseline
import androidx.compose.ui.layout.Layout
import androidx.compose.ui.layout.layoutId
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.semantics.clearAndSetSemantics
import androidx.compose.ui.text.TextStyle
@@ -116,7 +119,7 @@ internal fun CustomizedLargeTopAppBar(
        actions = actions,
        colors = topAppBarColors(),
        windowInsets = TopAppBarDefaults.windowInsets,
        maxHeight = 176.dp,
        maxHeightWithoutTitle = 120.dp,
        pinnedHeight = ContainerHeight,
        scrollBehavior = scrollBehavior,
    )
@@ -258,8 +261,8 @@ private fun SingleRowTopAppBar(
 * A two-rows top app bar that is designed to be called by the Large and Medium top app bar
 * composables.
 *
 * @throws [IllegalArgumentException] if the given [maxHeight] is equal or smaller than the
 * [pinnedHeight]
 * @throws [IllegalArgumentException] if the given [maxHeightWithoutTitle] is equal or smaller than
 * the [pinnedHeight]
 */
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -274,29 +277,31 @@ private fun TwoRowsTopAppBar(
    actions: @Composable RowScope.() -> Unit,
    windowInsets: WindowInsets,
    colors: TopAppBarColors,
    maxHeight: Dp,
    maxHeightWithoutTitle: Dp,
    pinnedHeight: Dp,
    scrollBehavior: TopAppBarScrollBehavior?
) {
    if (maxHeight <= pinnedHeight) {
    if (maxHeightWithoutTitle <= pinnedHeight) {
        throw IllegalArgumentException(
            "A TwoRowsTopAppBar max height should be greater than its pinned height"
        )
    }
    val pinnedHeightPx: Float
    val maxHeightPx: Float
    val density = LocalDensity.current
    val maxHeightPx = density.run {
        remember { mutableStateOf((maxHeightWithoutTitle + pinnedHeight).toPx()) }
    }
    val titleBottomPaddingPx: Int
    LocalDensity.current.run {
    density.run {
        pinnedHeightPx = pinnedHeight.toPx()
        maxHeightPx = maxHeight.toPx()
        titleBottomPaddingPx = titleBottomPadding.roundToPx()
    }

    // Sets the app bar's height offset limit to hide just the bottom title area and keep top title
    // visible when collapsed.
    SideEffect {
        if (scrollBehavior?.state?.heightOffsetLimit != pinnedHeightPx - maxHeightPx) {
            scrollBehavior?.state?.heightOffsetLimit = pinnedHeightPx - maxHeightPx
        if (scrollBehavior?.state?.heightOffsetLimit != pinnedHeightPx - maxHeightPx.value) {
            scrollBehavior?.state?.heightOffsetLimit = pinnedHeightPx - maxHeightPx.value
        }
    }

@@ -366,12 +371,19 @@ private fun TwoRowsTopAppBar(
            )
            TopAppBarLayout(
                modifier = Modifier.clipToBounds(),
                heightPx = maxHeightPx - pinnedHeightPx + (scrollBehavior?.state?.heightOffset
                    ?: 0f),
                heightPx = maxHeightPx.value - pinnedHeightPx +
                    (scrollBehavior?.state?.heightOffset ?: 0f),
                navigationIconContentColor = colors.navigationIconContentColor,
                titleContentColor = colors.titleContentColor,
                actionIconContentColor = colors.actionIconContentColor,
                title = title,
                title = {
                    Box(modifier = Modifier.onGloballyPositioned { coordinates ->
                        density.run {
                            maxHeightPx.value =
                                maxHeightWithoutTitle.toPx() + coordinates.size.height.toFloat()
                        }
                    }) { title() }
                },
                titleTextStyle = titleTextStyle,
                titleAlpha = bottomTitleAlpha,
                titleVerticalArrangement = Arrangement.Bottom,