Address few minor issues in Drawer.
This CL adds parameters requested to allow better Drawer customization, as well as semantics for proper container identification
Fixes: 149274110
Fixes: 154862521
Test: tests updated
Change-Id: I2a3420d18074f82789018087449becd999dfc236
diff --git a/ui/ui-material/api/0.1.0-dev12.txt b/ui/ui-material/api/0.1.0-dev12.txt
index 72f27ad..4f855bb 100644
--- a/ui/ui-material/api/0.1.0-dev12.txt
+++ b/ui/ui-material/api/0.1.0-dev12.txt
@@ -101,9 +101,15 @@
method public static void Divider-5sN9_mQ(androidx.ui.core.Modifier modifier = Modifier, long color = MaterialTheme.colors.onSurface.copy(DividerAlpha), float thickness = 1.dp, float startIndent = 0.dp);
}
+ public final class DrawerConstants {
+ method public float getDefaultElevation();
+ property public final float DefaultElevation;
+ field public static final androidx.ui.material.DrawerConstants! INSTANCE;
+ }
+
public final class DrawerKt {
- method public static void BottomDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
- method public static void ModalDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
+ method public static void BottomDrawerLayout-s-rmCOo(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, androidx.ui.graphics.Shape drawerShape = large, float drawerElevation = DrawerConstants.DefaultElevation, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
+ method public static void ModalDrawerLayout-s-rmCOo(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, androidx.ui.graphics.Shape drawerShape = large, float drawerElevation = DrawerConstants.DefaultElevation, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
}
public enum DrawerState {
diff --git a/ui/ui-material/api/current.txt b/ui/ui-material/api/current.txt
index 72f27ad..4f855bb 100644
--- a/ui/ui-material/api/current.txt
+++ b/ui/ui-material/api/current.txt
@@ -101,9 +101,15 @@
method public static void Divider-5sN9_mQ(androidx.ui.core.Modifier modifier = Modifier, long color = MaterialTheme.colors.onSurface.copy(DividerAlpha), float thickness = 1.dp, float startIndent = 0.dp);
}
+ public final class DrawerConstants {
+ method public float getDefaultElevation();
+ property public final float DefaultElevation;
+ field public static final androidx.ui.material.DrawerConstants! INSTANCE;
+ }
+
public final class DrawerKt {
- method public static void BottomDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
- method public static void ModalDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
+ method public static void BottomDrawerLayout-s-rmCOo(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, androidx.ui.graphics.Shape drawerShape = large, float drawerElevation = DrawerConstants.DefaultElevation, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
+ method public static void ModalDrawerLayout-s-rmCOo(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, androidx.ui.graphics.Shape drawerShape = large, float drawerElevation = DrawerConstants.DefaultElevation, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
}
public enum DrawerState {
diff --git a/ui/ui-material/api/public_plus_experimental_0.1.0-dev12.txt b/ui/ui-material/api/public_plus_experimental_0.1.0-dev12.txt
index 72f27ad..4f855bb 100644
--- a/ui/ui-material/api/public_plus_experimental_0.1.0-dev12.txt
+++ b/ui/ui-material/api/public_plus_experimental_0.1.0-dev12.txt
@@ -101,9 +101,15 @@
method public static void Divider-5sN9_mQ(androidx.ui.core.Modifier modifier = Modifier, long color = MaterialTheme.colors.onSurface.copy(DividerAlpha), float thickness = 1.dp, float startIndent = 0.dp);
}
+ public final class DrawerConstants {
+ method public float getDefaultElevation();
+ property public final float DefaultElevation;
+ field public static final androidx.ui.material.DrawerConstants! INSTANCE;
+ }
+
public final class DrawerKt {
- method public static void BottomDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
- method public static void ModalDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
+ method public static void BottomDrawerLayout-s-rmCOo(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, androidx.ui.graphics.Shape drawerShape = large, float drawerElevation = DrawerConstants.DefaultElevation, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
+ method public static void ModalDrawerLayout-s-rmCOo(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, androidx.ui.graphics.Shape drawerShape = large, float drawerElevation = DrawerConstants.DefaultElevation, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
}
public enum DrawerState {
diff --git a/ui/ui-material/api/public_plus_experimental_current.txt b/ui/ui-material/api/public_plus_experimental_current.txt
index 72f27ad..4f855bb 100644
--- a/ui/ui-material/api/public_plus_experimental_current.txt
+++ b/ui/ui-material/api/public_plus_experimental_current.txt
@@ -101,9 +101,15 @@
method public static void Divider-5sN9_mQ(androidx.ui.core.Modifier modifier = Modifier, long color = MaterialTheme.colors.onSurface.copy(DividerAlpha), float thickness = 1.dp, float startIndent = 0.dp);
}
+ public final class DrawerConstants {
+ method public float getDefaultElevation();
+ property public final float DefaultElevation;
+ field public static final androidx.ui.material.DrawerConstants! INSTANCE;
+ }
+
public final class DrawerKt {
- method public static void BottomDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
- method public static void ModalDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
+ method public static void BottomDrawerLayout-s-rmCOo(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, androidx.ui.graphics.Shape drawerShape = large, float drawerElevation = DrawerConstants.DefaultElevation, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
+ method public static void ModalDrawerLayout-s-rmCOo(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, androidx.ui.graphics.Shape drawerShape = large, float drawerElevation = DrawerConstants.DefaultElevation, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
}
public enum DrawerState {
diff --git a/ui/ui-material/api/restricted_0.1.0-dev12.txt b/ui/ui-material/api/restricted_0.1.0-dev12.txt
index d80870f..1333c42 100644
--- a/ui/ui-material/api/restricted_0.1.0-dev12.txt
+++ b/ui/ui-material/api/restricted_0.1.0-dev12.txt
@@ -102,9 +102,15 @@
method public static void Divider-5sN9_mQ(androidx.ui.core.Modifier modifier = Modifier, long color = MaterialTheme.colors.onSurface.copy(DividerAlpha), float thickness = 1.dp, float startIndent = 0.dp);
}
+ public final class DrawerConstants {
+ method public float getDefaultElevation();
+ property public final float DefaultElevation;
+ field public static final androidx.ui.material.DrawerConstants! INSTANCE;
+ }
+
public final class DrawerKt {
- method public static void BottomDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
- method public static void ModalDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
+ method public static void BottomDrawerLayout-s-rmCOo(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, androidx.ui.graphics.Shape drawerShape = large, float drawerElevation = DrawerConstants.DefaultElevation, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
+ method public static void ModalDrawerLayout-s-rmCOo(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, androidx.ui.graphics.Shape drawerShape = large, float drawerElevation = DrawerConstants.DefaultElevation, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
}
public enum DrawerState {
diff --git a/ui/ui-material/api/restricted_current.txt b/ui/ui-material/api/restricted_current.txt
index d80870f..1333c42 100644
--- a/ui/ui-material/api/restricted_current.txt
+++ b/ui/ui-material/api/restricted_current.txt
@@ -102,9 +102,15 @@
method public static void Divider-5sN9_mQ(androidx.ui.core.Modifier modifier = Modifier, long color = MaterialTheme.colors.onSurface.copy(DividerAlpha), float thickness = 1.dp, float startIndent = 0.dp);
}
+ public final class DrawerConstants {
+ method public float getDefaultElevation();
+ property public final float DefaultElevation;
+ field public static final androidx.ui.material.DrawerConstants! INSTANCE;
+ }
+
public final class DrawerKt {
- method public static void BottomDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
- method public static void ModalDrawerLayout(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
+ method public static void BottomDrawerLayout-s-rmCOo(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, androidx.ui.graphics.Shape drawerShape = large, float drawerElevation = DrawerConstants.DefaultElevation, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
+ method public static void ModalDrawerLayout-s-rmCOo(androidx.ui.material.DrawerState drawerState, kotlin.jvm.functions.Function1<? super androidx.ui.material.DrawerState,kotlin.Unit> onStateChange, boolean gesturesEnabled = true, androidx.ui.graphics.Shape drawerShape = large, float drawerElevation = DrawerConstants.DefaultElevation, kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, kotlin.jvm.functions.Function0<kotlin.Unit> bodyContent);
}
public enum DrawerState {
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/DrawerTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/DrawerTest.kt
index 613d4e2..841f60a 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/DrawerTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/DrawerTest.kt
@@ -27,7 +27,6 @@
import androidx.ui.foundation.Box
import androidx.ui.foundation.Clickable
import androidx.ui.layout.fillMaxSize
-import androidx.ui.semantics.Semantics
import androidx.ui.test.createComposeRule
import androidx.ui.test.doGesture
import androidx.ui.test.findByTag
@@ -154,27 +153,25 @@
val drawerState = mutableStateOf(DrawerState.Closed)
composeTestRule.setMaterialContent {
TestTag("Drawer") {
- Semantics(container = true) {
- ModalDrawerLayout(drawerState.value, { drawerState.value = it },
- drawerContent = {
- Box(
- Modifier.fillMaxSize().onPositioned { info: LayoutCoordinates ->
- val pos = info.localToGlobal(PxPosition.Origin)
- if (pos.x == 0.px) {
- // If fully opened, mark the openedLatch if present
- openedLatch?.countDown()
- } else if (-pos.x.round() == contentWidth) {
- // If fully closed, mark the closedLatch if present
- closedLatch?.countDown()
- }
+ ModalDrawerLayout(drawerState.value, { drawerState.value = it },
+ drawerContent = {
+ Box(
+ Modifier.fillMaxSize().onPositioned { info: LayoutCoordinates ->
+ val pos = info.localToGlobal(PxPosition.Origin)
+ if (pos.x == 0.px) {
+ // If fully opened, mark the openedLatch if present
+ openedLatch?.countDown()
+ } else if (-pos.x.round() == contentWidth) {
+ // If fully closed, mark the closedLatch if present
+ closedLatch?.countDown()
}
- )
- },
- bodyContent = {
- Box(Modifier.fillMaxSize()
- .onPositioned { contentWidth = it.size.width })
- })
- }
+ }
+ )
+ },
+ bodyContent = {
+ Box(Modifier.fillMaxSize()
+ .onPositioned { contentWidth = it.size.width })
+ })
}
}
// Drawer should start in closed state
@@ -205,19 +202,17 @@
composeTestRule.setMaterialContent {
// emulate click on the screen
TestTag("Drawer") {
- Semantics(container = true) {
- ModalDrawerLayout(drawerState.value, { drawerState.value = it },
- drawerContent = {
- Clickable( drawerClicks += 1 }) {
- Box(Modifier.fillMaxSize(), children = emptyContent())
- }
- },
- bodyContent = {
- Clickable( bodyClicks += 1 }) {
- Box(Modifier.fillMaxSize(), children = emptyContent())
- }
- })
- }
+ ModalDrawerLayout(drawerState.value, { drawerState.value = it },
+ drawerContent = {
+ Clickable( drawerClicks += 1 }) {
+ Box(Modifier.fillMaxSize(), children = emptyContent())
+ }
+ },
+ bodyContent = {
+ Clickable( bodyClicks += 1 }) {
+ Box(Modifier.fillMaxSize(), children = emptyContent())
+ }
+ })
}
}
@@ -255,28 +250,26 @@
val drawerState = mutableStateOf(DrawerState.Closed)
composeTestRule.setMaterialContent {
TestTag("Drawer") {
- Semantics(container = true) {
- BottomDrawerLayout(drawerState.value, { drawerState.value = it },
- drawerContent = {
- Box(Modifier.fillMaxSize().onPositioned { info: LayoutCoordinates ->
- val pos = info.localToGlobal(PxPosition.Origin)
- if (pos.y.round() == openedHeight) {
- // If fully opened, mark the openedLatch if present
- openedLatch?.countDown()
- } else if (pos.y.round() == contentHeight) {
- // If fully closed, mark the closedLatch if present
- closedLatch?.countDown()
- }
- })
- },
- bodyContent = {
- Box(Modifier.fillMaxSize().onPositioned {
- contentHeight = it.size.height
- openedHeight = it.size.height * BottomDrawerOpenFraction
- })
- }
- )
- }
+ BottomDrawerLayout(drawerState.value, { drawerState.value = it },
+ drawerContent = {
+ Box(Modifier.fillMaxSize().onPositioned { info: LayoutCoordinates ->
+ val pos = info.localToGlobal(PxPosition.Origin)
+ if (pos.y.round() == openedHeight) {
+ // If fully opened, mark the openedLatch if present
+ openedLatch?.countDown()
+ } else if (pos.y.round() == contentHeight) {
+ // If fully closed, mark the closedLatch if present
+ closedLatch?.countDown()
+ }
+ })
+ },
+ bodyContent = {
+ Box(Modifier.fillMaxSize().onPositioned {
+ contentHeight = it.size.height
+ openedHeight = it.size.height * BottomDrawerOpenFraction
+ })
+ }
+ )
}
}
// Drawer should start in closed state
@@ -307,19 +300,17 @@
composeTestRule.setMaterialContent {
// emulate click on the screen
TestTag("Drawer") {
- Semantics(container = true) {
- BottomDrawerLayout(drawerState.value, { drawerState.value = it },
- drawerContent = {
- Clickable( drawerClicks += 1 }) {
- Box(Modifier.fillMaxSize(), children = emptyContent())
- }
- },
- bodyContent = {
- Clickable( bodyClicks += 1 }) {
- Box(Modifier.fillMaxSize(), children = emptyContent())
- }
- })
- }
+ BottomDrawerLayout(drawerState.value, { drawerState.value = it },
+ drawerContent = {
+ Clickable( drawerClicks += 1 }) {
+ Box(Modifier.fillMaxSize(), children = emptyContent())
+ }
+ },
+ bodyContent = {
+ Clickable( bodyClicks += 1 }) {
+ Box(Modifier.fillMaxSize(), children = emptyContent())
+ }
+ })
}
}
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/Drawer.kt b/ui/ui-material/src/main/java/androidx/ui/material/Drawer.kt
index 4dfc50c..254f5c0e 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Drawer.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Drawer.kt
@@ -26,15 +26,18 @@
import androidx.ui.core.clipToBounds
import androidx.ui.core.hasBoundedHeight
import androidx.ui.core.hasBoundedWidth
+import androidx.ui.core.semantics.semantics
import androidx.ui.foundation.Box
import androidx.ui.foundation.Canvas
import androidx.ui.foundation.Clickable
import androidx.ui.foundation.gestures.DragDirection
+import androidx.ui.graphics.Shape
import androidx.ui.layout.DpConstraints
import androidx.ui.layout.Stack
import androidx.ui.layout.fillMaxSize
import androidx.ui.layout.preferredSizeIn
import androidx.ui.material.internal.StateDraggable
+import androidx.ui.unit.Dp
import androidx.ui.unit.IntPx
import androidx.ui.unit.Px
import androidx.ui.unit.dp
@@ -72,6 +75,9 @@
* @param onStateChange lambda to be invoked when the drawer requests to change its state,
* e.g. when the drawer is being swiped to the new state or when the scrim is clicked
* @param gesturesEnabled whether or not drawer can be interacted by gestures
+ * @param drawerShape shape of the drawer sheet
+ * @param drawerElevation drawer sheet elevation. This controls the size of the shadow below the
+ * drawer sheet
* @param drawerContent composable that represents content inside the drawer
* @param bodyContent content of the rest of the UI
*
@@ -82,10 +88,12 @@
drawerState: DrawerState,
onStateChange: (DrawerState) -> Unit,
gesturesEnabled: Boolean = true,
+ drawerShape: Shape = MaterialTheme.shapes.large,
+ drawerElevation: Dp = DrawerConstants.DefaultElevation,
drawerContent: @Composable () -> Unit,
bodyContent: @Composable () -> Unit
) {
- Box(Modifier.fillMaxSize()) {
+ Box(Modifier.fillMaxSize().semantics(container = true)) {
WithConstraints {
// TODO : think about Infinite max bounds case
if (!constraints.hasBoundedWidth) {
@@ -113,7 +121,7 @@
Scrim(drawerState, onStateChange, fraction = {
calculateFraction(minValue, maxValue, model.value)
})
- DrawerContent(model, dpConstraints, drawerContent)
+ DrawerContent(model, dpConstraints, drawerShape, drawerElevation, drawerContent)
}
}
}
@@ -138,6 +146,9 @@
* @param onStateChange lambda to be invoked when the drawer requests to change its state,
* e.g. when the drawer is being swiped to the new state or when the scrim is clicked
* @param gesturesEnabled whether or not drawer can be interacted by gestures
+ * @param drawerShape shape of the drawer sheet
+ * @param drawerElevation drawer sheet elevation. This controls the size of the shadow below the
+ * drawer sheet
* @param drawerContent composable that represents content inside the drawer
* @param bodyContent content of the rest of the UI
*
@@ -148,10 +159,12 @@
drawerState: DrawerState,
onStateChange: (DrawerState) -> Unit,
gesturesEnabled: Boolean = true,
+ drawerShape: Shape = MaterialTheme.shapes.large,
+ drawerElevation: Dp = DrawerConstants.DefaultElevation,
drawerContent: @Composable () -> Unit,
bodyContent: @Composable () -> Unit
) {
- Box(Modifier.fillMaxSize()) {
+ Box(Modifier.fillMaxSize().semantics(container = true)) {
WithConstraints {
// TODO : think about Infinite max bounds case
if (!constraints.hasBoundedHeight) {
@@ -196,17 +209,32 @@
// as we scroll "from height to 0" , need to reverse fraction
1 - calculateFraction(openedValue, maxValue, model.value)
})
- BottomDrawerContent(model, dpConstraints, drawerContent)
+ BottomDrawerContent(
+ model, dpConstraints, drawerShape, drawerElevation, drawerContent
+ )
}
}
}
}
}
+/**
+ * Object to hold default values for [ModalDrawerLayout] and [BottomDrawerLayout]
+ */
+object DrawerConstants {
+
+ /**
+ * Default Elevation for drawer sheet as specified in material specs
+ */
+ val DefaultElevation = 16.dp
+}
+
@Composable
private fun DrawerContent(
xOffset: AnimatedFloat,
constraints: DpConstraints,
+ shape: Shape,
+ elevation: Dp,
content: @Composable () -> Unit
) {
WithOffset(xOffset = xOffset) {
@@ -220,7 +248,7 @@
paddingEnd = VerticalDrawerPadding
) {
// remove Container when we will support multiply children
- Surface {
+ Surface(shape = shape, elevation = elevation) {
Box(Modifier.fillMaxSize(), children = content)
}
}
@@ -231,6 +259,8 @@
private fun BottomDrawerContent(
yOffset: AnimatedFloat,
constraints: DpConstraints,
+ shape: Shape,
+ elevation: Dp,
content: @Composable () -> Unit
) {
WithOffset(yOffset = yOffset) {
@@ -243,7 +273,7 @@
)
) {
// remove Container when we will support multiply children
- Surface {
+ Surface(shape = shape, elevation = elevation) {
Box(Modifier.fillMaxSize(), children = content)
}
}
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/Shapes.kt b/ui/ui-material/src/main/java/androidx/ui/material/Shapes.kt
index 82b25db..f4980ae 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Shapes.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Shapes.kt
@@ -44,7 +44,7 @@
*/
val medium: CornerBasedShape = RoundedCornerShape(4.dp),
/**
- * Shape used by large components.
+ * Shape used by large components like [ModalDrawerLayout] or [BottomDrawerLayout].
*/
val large: CornerBasedShape = RoundedCornerShape(0.dp)
)