Consume correct window insets for search bar
Fixes: b/340667001
Test: added unit test
Change-Id: Ifbdaa66b109dce8bed7491a66fef23875207f336
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SearchBarTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SearchBarTest.kt
index f9d8102..1e5e20c 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SearchBarTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SearchBarTest.kt
@@ -20,8 +20,11 @@
import androidx.compose.foundation.focusable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.onConsumedWindowInsetsChanged
import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.MoreVert
import androidx.compose.runtime.getValue
@@ -31,8 +34,11 @@
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.layout.onGloballyPositioned
+import androidx.compose.ui.layout.positionInRoot
import androidx.compose.ui.node.Ref
+import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.test.assertHeightIsEqualTo
import androidx.compose.ui.test.assertIsDisplayed
@@ -44,11 +50,13 @@
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performImeAction
+import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.MediumTest
import com.google.common.truth.Truth.assertThat
+import kotlin.math.roundToInt
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -241,6 +249,45 @@
}
@Test
+ fun searchBar_usesAndConsumesWindowInsets() {
+ val parentTopInset = 10
+ val searchBarTopInset = 25
+
+ val position = Ref<Offset>()
+ lateinit var density: Density
+ lateinit var childConsumedInsets: WindowInsets
+
+ rule.setMaterialContent(lightColorScheme()) {
+ density = LocalDensity.current
+ Box(Modifier.windowInsetsPadding(WindowInsets(top = parentTopInset))) {
+ SearchBar(
+ modifier = Modifier.onGloballyPositioned {
+ position.value = it.positionInRoot()
+ },
+ windowInsets = WindowInsets(top = searchBarTopInset),
+ inputField = {
+ SearchBarDefaults.InputField(
+ query = "",
+ onQueryChange = {},
+ onSearch = {},
+ expanded = true,
+ onExpandedChange = {},
+ placeholder = { Text("Hint") },
+ )
+ },
+ expanded = true,
+ onExpandedChange = {},
+ ) {
+ Box(Modifier.onConsumedWindowInsetsChanged { childConsumedInsets = it })
+ }
+ }
+ }
+
+ assertThat(position.value!!.y.roundToInt()).isEqualTo(parentTopInset)
+ assertThat(childConsumedInsets.getTop(density)).isEqualTo(searchBarTopInset)
+ }
+
+ @Test
fun searchBar_clickingIconButton_doesNotExpandSearchBarItself() {
var iconClicked = false
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/SearchBar.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/SearchBar.android.kt
index fb08255..41750ae 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/SearchBar.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/SearchBar.android.kt
@@ -907,7 +907,7 @@
.onConsumedWindowInsetsChanged { consumedInsets ->
unconsumedInsets.insets = windowInsets.exclude(consumedInsets)
}
- .consumeWindowInsets(unconsumedInsets),
+ .consumeWindowInsets(windowInsets),
content = {
Box(Modifier.layoutId(LayoutIdSurface), propagateMinConstraints = true) {
surface()