Fix NavigationDrawerItem with large font
The fixed-height constraint is loosened to a min-height
constraint to allow long/large labels to span multiple
lines without getting cut off.
Fixes: b/336381350
Test: added unit test
Change-Id: Id324aaf1266428b323b2b5247212987331a5e79c
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/DrawerSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/DrawerSamples.kt
index 6d07a51..8d8df43 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/DrawerSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/DrawerSamples.kt
@@ -104,7 +104,7 @@
items.forEach { item ->
NavigationDrawerItem(
icon = { Icon(item, contentDescription = null) },
- label = { Text(item.name) },
+ label = { Text(item.name.substringAfterLast(".")) },
selected = item == selectedItem.value,
onClick = {
scope.launch { drawerState.close() }
@@ -167,7 +167,7 @@
items.forEach { item ->
NavigationDrawerItem(
icon = { Icon(item, contentDescription = null) },
- label = { Text(item.name) },
+ label = { Text(item.name.substringAfterLast(".")) },
selected = item == selectedItem.value,
onClick = {
selectedItem.value = item
@@ -229,7 +229,7 @@
items.forEach { item ->
NavigationDrawerItem(
icon = { Icon(item, contentDescription = null) },
- label = { Text(item.name) },
+ label = { Text(item.name.substringAfterLast(".")) },
selected = item == selectedItem.value,
onClick = {
scope.launch { drawerState.close() }
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationDrawerItemTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationDrawerItemTest.kt
index 3ecd26f..af1eb3a 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationDrawerItemTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/NavigationDrawerItemTest.kt
@@ -29,18 +29,20 @@
import androidx.compose.ui.test.SemanticsMatcher
import androidx.compose.ui.test.assert
import androidx.compose.ui.test.assertHasClickAction
-import androidx.compose.ui.test.assertHeightIsAtLeast
+import androidx.compose.ui.test.assertHeightIsEqualTo
import androidx.compose.ui.test.assertIsEqualTo
import androidx.compose.ui.test.assertIsNotSelected
import androidx.compose.ui.test.assertIsSelected
import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo
import androidx.compose.ui.test.assertWidthIsEqualTo
import androidx.compose.ui.test.getBoundsInRoot
+import androidx.compose.ui.test.getUnclippedBoundsInRoot
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.onRoot
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.height
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.MediumTest
import com.google.common.truth.Truth.assertThat
@@ -50,7 +52,6 @@
@MediumTest
@RunWith(AndroidJUnit4::class)
-@OptIn(ExperimentalMaterial3Api::class)
class NavigationDrawerItemTest {
@get:Rule
@@ -74,7 +75,27 @@
rule.onNodeWithTag(DrawerItemTag)
.assertWidthIsEqualTo(264.dp)
- .assertHeightIsAtLeast(NavigationDrawerTokens.ActiveIndicatorHeight)
+ .assertHeightIsEqualTo(NavigationDrawerTokens.ActiveIndicatorHeight)
+ }
+
+ @Test
+ fun navigationDrawerItem_size_withLargeContent() {
+ rule.setMaterialContent(lightColorScheme()) {
+ Column(Modifier.width(264.dp)) {
+ NavigationDrawerItem(
+ icon = {},
+ label = { Text("Multi \nline \nlabel \nis \ntall") },
+ selected = true,
+ onClick = {},
+ modifier = Modifier.testTag(DrawerItemTag)
+ )
+ }
+ }
+
+ rule.onNodeWithTag(DrawerItemTag).assertWidthIsEqualTo(264.dp)
+ rule.onNodeWithTag(DrawerItemTag).getUnclippedBoundsInRoot().let {
+ assertThat(it.height).isGreaterThan(NavigationDrawerTokens.ActiveIndicatorHeight)
+ }
}
@Test
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt
index 88d5dd4..46dba83 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt
@@ -35,7 +35,7 @@
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.only
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.sizeIn
@@ -951,7 +951,7 @@
onClick = onClick,
modifier = modifier
.semantics { role = Role.Tab }
- .height(NavigationDrawerTokens.ActiveIndicatorHeight)
+ .heightIn(min = NavigationDrawerTokens.ActiveIndicatorHeight)
.fillMaxWidth(),
shape = shape,
color = colors.containerColor(selected).value,