Update ButtonGroup following API feedback
Renamed enlargeOnPress Modifier to animateWidth, updated to accept
InteractionSource, as we don't need to mutate it.
Added public constant ButtonGroupDefaults.DefaultMinWidth, the default
minimum width of buttons on a ButtonGroup.
Relnote: "Renamed enlargeOnPress Modifier to animateWidth, updated to
accept InteractionSource, not MutableInteractionSource as we don't
need to mutate it. Added public constant
ButtonGroupDefaults.DefaultMinWidth, the default minimum width of
buttons on a ButtonGroup."
Test: Refactor - Existing tests pass.
Bug: 370568248
Change-Id: Ie27ec626de18bf944c727f4fb342a5f98024aa7d
diff --git a/wear/compose/compose-material3/api/current.txt b/wear/compose/compose-material3/api/current.txt
index df002aa..1fb47dc 100644
--- a/wear/compose/compose-material3/api/current.txt
+++ b/wear/compose/compose-material3/api/current.txt
@@ -156,8 +156,10 @@
public final class ButtonGroupDefaults {
method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.PaddingValues fullWidthPaddings();
method public float getExpansionWidth();
+ method public float getMinWidth();
method public float getSpacing();
property public final float ExpansionWidth;
+ property public final float MinWidth;
property public final float Spacing;
field public static final androidx.wear.compose.material3.ButtonGroupDefaults INSTANCE;
}
@@ -167,7 +169,7 @@
}
public interface ButtonGroupScope {
- method public androidx.compose.ui.Modifier enlargeOnPress(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+ method public androidx.compose.ui.Modifier animateWidth(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.InteractionSource interactionSource);
method public androidx.compose.ui.Modifier minWidth(androidx.compose.ui.Modifier, optional float minWidth);
method public androidx.compose.ui.Modifier weight(androidx.compose.ui.Modifier, @FloatRange(from=0.0, fromInclusive=false) float weight);
}
diff --git a/wear/compose/compose-material3/api/restricted_current.txt b/wear/compose/compose-material3/api/restricted_current.txt
index df002aa..1fb47dc 100644
--- a/wear/compose/compose-material3/api/restricted_current.txt
+++ b/wear/compose/compose-material3/api/restricted_current.txt
@@ -156,8 +156,10 @@
public final class ButtonGroupDefaults {
method @androidx.compose.runtime.Composable public androidx.compose.foundation.layout.PaddingValues fullWidthPaddings();
method public float getExpansionWidth();
+ method public float getMinWidth();
method public float getSpacing();
property public final float ExpansionWidth;
+ property public final float MinWidth;
property public final float Spacing;
field public static final androidx.wear.compose.material3.ButtonGroupDefaults INSTANCE;
}
@@ -167,7 +169,7 @@
}
public interface ButtonGroupScope {
- method public androidx.compose.ui.Modifier enlargeOnPress(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+ method public androidx.compose.ui.Modifier animateWidth(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.InteractionSource interactionSource);
method public androidx.compose.ui.Modifier minWidth(androidx.compose.ui.Modifier, optional float minWidth);
method public androidx.compose.ui.Modifier weight(androidx.compose.ui.Modifier, @FloatRange(from=0.0, fromInclusive=false) float weight);
}
diff --git a/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/ButtonGroupDemo.kt b/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/ButtonGroupDemo.kt
index 76c8ba5..2832ea1 100644
--- a/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/ButtonGroupDemo.kt
+++ b/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/ButtonGroupDemo.kt
@@ -59,14 +59,14 @@
ButtonGroup(Modifier.fillMaxWidth()) {
Button(
onClick = {},
- Modifier.enlargeOnPress(interactionSource1),
+ Modifier.animateWidth(interactionSource1),
interactionSource = interactionSource1
) {
Text("<", modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center)
}
FilledIconButton(
onClick = {},
- Modifier.enlargeOnPress(interactionSource2),
+ Modifier.animateWidth(interactionSource2),
interactionSource = interactionSource2
) {
Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
@@ -79,7 +79,7 @@
}
Button(
onClick = {},
- Modifier.enlargeOnPress(interactionSource3),
+ Modifier.animateWidth(interactionSource3),
interactionSource = interactionSource3
) {
Text(">", modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center)
@@ -145,7 +145,7 @@
modifier
.height(IconToggleButtonDefaults.SmallButtonSize)
.fillMaxWidth()
- .enlargeOnPress(interactionSource),
+ .animateWidth(interactionSource),
onCheckedChange = { checked = !checked },
shapes = shapes,
interactionSource = interactionSource
@@ -168,7 +168,7 @@
modifier
.height(TextToggleButtonDefaults.DefaultButtonSize)
.fillMaxWidth()
- .enlargeOnPress(interactionSource),
+ .animateWidth(interactionSource),
onCheckedChange = { checked = !checked },
shapes = shapes,
interactionSource = interactionSource
diff --git a/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/TransformingLazyColumnDemo.kt b/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/TransformingLazyColumnDemo.kt
index 4b6646b..7fd48eb 100644
--- a/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/TransformingLazyColumnDemo.kt
+++ b/wear/compose/compose-material3/integration-tests/src/main/java/androidx/wear/compose/material3/demos/TransformingLazyColumnDemo.kt
@@ -159,7 +159,7 @@
ButtonGroup(Modifier.scrollTransform(this@item)) {
Button(
onClick = {},
- Modifier.enlargeOnPress(interactionSource1),
+ Modifier.animateWidth(interactionSource1),
interactionSource = interactionSource1
) {
Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
@@ -168,7 +168,7 @@
}
Button(
onClick = {},
- Modifier.enlargeOnPress(interactionSource2),
+ Modifier.animateWidth(interactionSource2),
interactionSource = interactionSource2
) {
Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
diff --git a/wear/compose/compose-material3/samples/src/main/java/androidx/wear/compose/material3/samples/ButtonGroupSample.kt b/wear/compose/compose-material3/samples/src/main/java/androidx/wear/compose/material3/samples/ButtonGroupSample.kt
index 9b6d145..19240bb 100644
--- a/wear/compose/compose-material3/samples/src/main/java/androidx/wear/compose/material3/samples/ButtonGroupSample.kt
+++ b/wear/compose/compose-material3/samples/src/main/java/androidx/wear/compose/material3/samples/ButtonGroupSample.kt
@@ -19,7 +19,6 @@
import androidx.annotation.Sampled
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.size
import androidx.compose.runtime.Composable
@@ -41,17 +40,17 @@
ButtonGroup(Modifier.fillMaxWidth()) {
Button(
onClick = {},
- modifier = Modifier.enlargeOnPress(interactionSource1),
+ modifier = Modifier.animateWidth(interactionSource1),
interactionSource = interactionSource1
) {
- Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { Text("L") }
+ Box(Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) { Text("L") }
}
Button(
onClick = {},
- modifier = Modifier.enlargeOnPress(interactionSource2),
+ modifier = Modifier.animateWidth(interactionSource2),
interactionSource = interactionSource2
) {
- Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { Text("R") }
+ Box(Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) { Text("R") }
}
}
}
@@ -68,24 +67,24 @@
ButtonGroup(Modifier.fillMaxWidth()) {
Button(
onClick = {},
- modifier = Modifier.enlargeOnPress(interactionSource1),
+ modifier = Modifier.animateWidth(interactionSource1),
interactionSource = interactionSource1
) {
- Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { Text("A") }
+ Box(Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) { Text("A") }
}
Button(
onClick = {},
- modifier = Modifier.weight(1.5f).enlargeOnPress(interactionSource2),
+ modifier = Modifier.weight(1.5f).animateWidth(interactionSource2),
interactionSource = interactionSource2
) {
- Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { Text("B") }
+ Box(Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) { Text("B") }
}
Button(
onClick = {},
- modifier = Modifier.enlargeOnPress(interactionSource3),
+ modifier = Modifier.animateWidth(interactionSource3),
interactionSource = interactionSource3
) {
- Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { Text("C") }
+ Box(Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) { Text("C") }
}
}
}
diff --git a/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/ButtonGroup.kt b/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/ButtonGroup.kt
index ebfc393f..d42dcc10 100644
--- a/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/ButtonGroup.kt
+++ b/wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/ButtonGroup.kt
@@ -21,7 +21,7 @@
import androidx.compose.animation.core.Animatable
import androidx.compose.animation.core.AnimationSpec
import androidx.compose.animation.core.AnimationVector1D
-import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.interaction.InteractionSource
import androidx.compose.foundation.interaction.PressInteraction
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.padding
@@ -101,7 +101,7 @@
return this.then(ButtonGroupElement(minWidth = minWidth))
}
- override fun Modifier.enlargeOnPress(interactionSource: MutableInteractionSource) =
+ override fun Modifier.animateWidth(interactionSource: InteractionSource) =
this.then(
EnlargeOnPressElement(
interactionSource = interactionSource,
@@ -206,13 +206,13 @@
* @param minWidth the minimum width. If none is specified, minimumInteractiveComponentSize is
* used.
*/
- public fun Modifier.minWidth(minWidth: Dp = minimumInteractiveComponentSize): Modifier
+ public fun Modifier.minWidth(minWidth: Dp = ButtonGroupDefaults.MinWidth): Modifier
/**
* Specifies the interaction source to use with this item. This is used to listen to events and
- * grow/shrink the buttons in reaction.
+ * animate growing the pressed button and shrink the neighbor(s).
*/
- public fun Modifier.enlargeOnPress(interactionSource: MutableInteractionSource): Modifier
+ public fun Modifier.animateWidth(interactionSource: InteractionSource): Modifier
}
/** Contains the default values used by [ButtonGroup] */
@@ -236,6 +236,9 @@
/** Spacing between buttons. */
public val Spacing: Dp = 4.dp
+ /** Default for the minimum width of buttons in a ButtonGroup */
+ public val MinWidth: Dp = minimumInteractiveComponentSize
+
/** Padding at each side of the [ButtonGroup], as a percentage of the available space. */
private const val FullWidthHorizontalPaddingPercentage: Float = 5.2f
}
@@ -303,7 +306,7 @@
}
internal class EnlargeOnPressElement(
- val interactionSource: MutableInteractionSource,
+ val interactionSource: InteractionSource,
val downAnimSpec: AnimationSpec<Float>,
val upAnimSpec: AnimationSpec<Float>,
) : ModifierNodeElement<EnlargeOnPressNode>() {
@@ -341,7 +344,7 @@
}
internal class EnlargeOnPressNode(
- var interactionSource: MutableInteractionSource,
+ var interactionSource: InteractionSource,
var downAnimSpec: AnimationSpec<Float>,
var upAnimSpec: AnimationSpec<Float>,
) : ParentDataModifierNode, Modifier.Node() {