Draw Scrim above background content
Fix a bug where Scrim is drawn behind the content.
Fixes: 299506181
Test: Added `modalNavigationDrawer_onOpen_scrimIsDrawnAboveContent` test
Change-Id: I8cdd020234b214988b8f7644e7011a668131e358
diff --git a/tv/integration-tests/playground/src/main/java/androidx/tv/integration/playground/NavigationDrawer.kt b/tv/integration-tests/playground/src/main/java/androidx/tv/integration/playground/NavigationDrawer.kt
index c9d1f31..8d9971c 100644
--- a/tv/integration-tests/playground/src/main/java/androidx/tv/integration/playground/NavigationDrawer.kt
+++ b/tv/integration-tests/playground/src/main/java/androidx/tv/integration/playground/NavigationDrawer.kt
@@ -38,6 +38,7 @@
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.unit.LayoutDirection
@@ -75,7 +76,13 @@
Row(Modifier.fillMaxSize()) {
Box(modifier = Modifier.height(400.dp)) {
androidx.tv.material3.ModalNavigationDrawer(
- drawerContent = { Sidebar(direction = direction) }
+ drawerContent = { Sidebar(direction = direction) },
+ scrimBrush = Brush.verticalGradient(
+ listOf(
+ Color.DarkGray,
+ Color.LightGray
+ )
+ )
) {
CommonBackground()
}
diff --git a/tv/tv-material/src/androidTest/java/androidx/tv/material3/ModalNavigationDrawerTest.kt b/tv/tv-material/src/androidTest/java/androidx/tv/material3/ModalNavigationDrawerTest.kt
index a522dc83..3db7b7c 100644
--- a/tv/tv-material/src/androidTest/java/androidx/tv/material3/ModalNavigationDrawerTest.kt
+++ b/tv/tv-material/src/androidTest/java/androidx/tv/material3/ModalNavigationDrawerTest.kt
@@ -16,6 +16,7 @@
package androidx.tv.material3
+import android.os.Build
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.focusable
@@ -31,6 +32,8 @@
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
+import androidx.compose.testutils.assertContainsColor
+import androidx.compose.testutils.assertDoesNotContainColor
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
@@ -38,6 +41,7 @@
import androidx.compose.ui.focus.onFocusChanged
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.platform.testTag
@@ -50,6 +54,7 @@
import androidx.compose.ui.test.assertIsFocused
import androidx.compose.ui.test.assertIsNotFocused
import androidx.compose.ui.test.assertWidthIsEqualTo
+import androidx.compose.ui.test.captureToImage
import androidx.compose.ui.test.getUnclippedBoundsInRoot
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onAllNodesWithText
@@ -62,6 +67,7 @@
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.toSize
+import androidx.test.filters.SdkSuppress
import androidx.test.platform.app.InstrumentationRegistry
import org.junit.Rule
import org.junit.Test
@@ -356,6 +362,26 @@
rule.onNodeWithTag("box-container").assertIsFocused()
}
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+ @Test
+ fun modalNavigationDrawer_onOpen_scrimIsDrawnAboveContent() {
+ val backgroundContentColor = Color.Blue
+ val scrimColor = Color.Red
+ rule.setContent {
+ ModalNavigationDrawer(
+ drawerState = remember { DrawerState(DrawerValue.Open) },
+ drawerContent = {
+ BasicText(text = if (it == DrawerValue.Open) "Opened" else "Closed")
+ },
+ scrimBrush = SolidColor(scrimColor)
+ ) { Box(Modifier.fillMaxSize().background(backgroundContentColor)) }
+ }
+
+ // the image should show only scrim color and no background content color
+ rule.onRoot().captureToImage().assertContainsColor(scrimColor)
+ rule.onRoot().captureToImage().assertDoesNotContainColor(backgroundContentColor)
+ }
+
private fun SemanticsNodeInteractionCollection.assertAnyAreDisplayed() {
val result = (0 until fetchSemanticsNodes().size).map { get(it) }.any {
try {
diff --git a/tv/tv-material/src/main/java/androidx/tv/material3/NavigationDrawer.kt b/tv/tv-material/src/main/java/androidx/tv/material3/NavigationDrawer.kt
index 320fe9e..5e7abdb 100644
--- a/tv/tv-material/src/main/java/androidx/tv/material3/NavigationDrawer.kt
+++ b/tv/tv-material/src/main/java/androidx/tv/material3/NavigationDrawer.kt
@@ -114,15 +114,15 @@
content = drawerContent
)
+ Box(Modifier.padding(start = closedDrawerWidth.value ?: ClosedDrawerWidth.dp)) {
+ content()
+ }
if (drawerState.currentValue == DrawerValue.Open) {
// Scrim
Canvas(Modifier.fillMaxSize()) {
drawRect(scrimBrush)
}
}
- Box(Modifier.padding(start = closedDrawerWidth.value ?: ClosedDrawerWidth.dp)) {
- content()
- }
}
}