Replace LayoutModifer.foldIn with foldRight
Also updates the docs to clarify the methods intention.
Bug: 390430024
RelNote: LayoutModfier.foldIn is now called foldRight to better reflect its expected behaviour
Change-Id: Idf242cd95d2488992ceefd1527bea8a24a3c58ab
diff --git a/wear/protolayout/protolayout/api/current.txt b/wear/protolayout/protolayout/api/current.txt
index da4e766..d41f32c 100644
--- a/wear/protolayout/protolayout/api/current.txt
+++ b/wear/protolayout/protolayout/api/current.txt
@@ -1564,17 +1564,17 @@
}
public interface LayoutModifier {
- method public <R> R foldIn(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
+ method public <R> R foldRight(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
method public default infix androidx.wear.protolayout.modifiers.LayoutModifier then(androidx.wear.protolayout.modifiers.LayoutModifier other);
field public static final androidx.wear.protolayout.modifiers.LayoutModifier.Companion Companion;
}
public static final class LayoutModifier.Companion implements androidx.wear.protolayout.modifiers.LayoutModifier {
- method public <R> R foldIn(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
+ method public <R> R foldRight(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
}
public static interface LayoutModifier.Element extends androidx.wear.protolayout.modifiers.LayoutModifier {
- method public default <R> R foldIn(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
+ method public default <R> R foldRight(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
}
public final class ModifierAppliersKt {
diff --git a/wear/protolayout/protolayout/api/restricted_current.txt b/wear/protolayout/protolayout/api/restricted_current.txt
index da4e766..d41f32c 100644
--- a/wear/protolayout/protolayout/api/restricted_current.txt
+++ b/wear/protolayout/protolayout/api/restricted_current.txt
@@ -1564,17 +1564,17 @@
}
public interface LayoutModifier {
- method public <R> R foldIn(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
+ method public <R> R foldRight(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
method public default infix androidx.wear.protolayout.modifiers.LayoutModifier then(androidx.wear.protolayout.modifiers.LayoutModifier other);
field public static final androidx.wear.protolayout.modifiers.LayoutModifier.Companion Companion;
}
public static final class LayoutModifier.Companion implements androidx.wear.protolayout.modifiers.LayoutModifier {
- method public <R> R foldIn(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
+ method public <R> R foldRight(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
}
public static interface LayoutModifier.Element extends androidx.wear.protolayout.modifiers.LayoutModifier {
- method public default <R> R foldIn(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
+ method public default <R> R foldRight(R initial, kotlin.jvm.functions.Function2<? super R,? super androidx.wear.protolayout.modifiers.LayoutModifier.Element,? extends R> operation);
}
public final class ModifierAppliersKt {
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Background.kt b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Background.kt
index 322861d..89df3a3 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Background.kt
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Background.kt
@@ -115,7 +115,7 @@
): LayoutModifier = this then BaseCornerElement(bottomRightRadius = cornerRadius(x, y))
internal class BaseBackgroundElement(val color: LayoutColor) : LayoutModifier.Element {
- fun foldIn(initial: Background.Builder?): Background.Builder =
+ fun mergeTo(initial: Background.Builder?): Background.Builder =
(initial ?: Background.Builder()).setColor(color.prop)
}
@@ -127,7 +127,7 @@
@RequiresSchemaVersion(major = 1, minor = 400) val bottomRightRadius: CornerRadius? = null
) : LayoutModifier.Element {
@SuppressLint("ProtoLayoutMinSchema")
- fun foldIn(initial: Corner.Builder?): Corner.Builder =
+ fun mergeTo(initial: Corner.Builder?): Corner.Builder =
(initial ?: Corner.Builder()).apply {
cornerRadiusDp?.let { setRadius(cornerRadiusDp.dp) }
topLeftRadius?.let { setTopLeftRadius(cornerRadius(it.x.value, it.y.value)) }
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Border.kt b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Border.kt
index d3fca75..47e1ec1 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Border.kt
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Border.kt
@@ -33,6 +33,6 @@
internal class BaseBorderElement(@Dimension(DP) val width: Float, val color: LayoutColor) :
LayoutModifier.Element {
- fun foldIn(initial: Border.Builder?): Border.Builder =
+ fun mergeTo(initial: Border.Builder?): Border.Builder =
(initial ?: Border.Builder()).setWidth(width.dp).setColor(color.prop)
}
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Clickable.kt b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Clickable.kt
index da4d74f..a807b15 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Clickable.kt
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Clickable.kt
@@ -122,7 +122,7 @@
@Dimension(DP) val minClickableHeight: Float = Float.NaN,
) : LayoutModifier.Element {
@SuppressLint("ProtoLayoutMinSchema")
- fun foldIn(initial: Clickable.Builder?): Clickable.Builder =
+ fun mergeTo(initial: Clickable.Builder?): Clickable.Builder =
(initial ?: Clickable.Builder()).apply {
if (!id.isNullOrEmpty()) setId(id)
action?.let { setOnClick(it) }
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/LayoutModifier.kt b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/LayoutModifier.kt
index 74657a0..468ef56 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/LayoutModifier.kt
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/LayoutModifier.kt
@@ -16,6 +16,7 @@
package androidx.wear.protolayout.modifiers
+import androidx.wear.protolayout.modifiers.LayoutModifier.Element
import java.util.Objects
/**
@@ -28,14 +29,12 @@
interface LayoutModifier {
/**
* Accumulates a value starting with [initial] and applying [operation] to the current value and
- * each element from outside in.
+ * each element from left to right.
*
- * Elements wrap one another in a chain from left to right; an [Element] that appears to the
- * left of another in a `+` expression or in [operation]'s parameter order affects all of the
- * elements that appear after it. [foldIn] may be used to accumulate a value starting from the
- * parent or head of the modifier chain to the final wrapped child.
+ * [foldRight] may be used to accumulate a value starting from the head of the modifier chain to
+ * the final modifier element.
*/
- fun <R> foldIn(initial: R, operation: (R, Element) -> R): R
+ fun <R> foldRight(initial: R, operation: (R, Element) -> R): R
/**
* Concatenates this modifier with another.
@@ -47,7 +46,7 @@
/** A single element contained within a [LayoutModifier] chain. */
interface Element : LayoutModifier {
- override fun <R> foldIn(initial: R, operation: (R, Element) -> R): R =
+ override fun <R> foldRight(initial: R, operation: (R, Element) -> R): R =
operation(initial, this)
}
@@ -58,7 +57,7 @@
*/
companion object : LayoutModifier {
@Suppress("MissingJvmstatic")
- override fun <R> foldIn(initial: R, operation: (R, Element) -> R): R = initial
+ override fun <R> foldRight(initial: R, operation: (R, Element) -> R): R = initial
@Suppress("MissingJvmstatic")
override infix fun then(other: LayoutModifier): LayoutModifier = other
@@ -68,24 +67,24 @@
}
/**
- * A node in a [LayoutModifier] chain. A CombinedModifier always contains at least two elements; a
- * * Modifier [outer] that wraps around the Modifier [inner].
+ * A node in a [LayoutModifier] chain. A [CombinedLayoutModifier] always contains at least two
+ * elements.
*/
internal class CombinedLayoutModifier(
- private val outer: LayoutModifier,
- private val inner: LayoutModifier
+ private val left: LayoutModifier,
+ private val right: LayoutModifier
) : LayoutModifier {
- override fun <R> foldIn(initial: R, operation: (R, LayoutModifier.Element) -> R): R =
- inner.foldIn(outer.foldIn(initial, operation), operation)
+ override fun <R> foldRight(initial: R, operation: (R, Element) -> R): R =
+ right.foldRight(left.foldRight(initial, operation), operation)
override fun equals(other: Any?): Boolean =
- other is CombinedLayoutModifier && outer == other.outer && inner == other.inner
+ other is CombinedLayoutModifier && left == other.left && right == other.right
- override fun hashCode(): Int = Objects.hash(outer, inner)
+ override fun hashCode(): Int = Objects.hash(left, right)
override fun toString(): String =
"[" +
- foldIn("") { acc, element ->
+ foldRight("") { acc, element ->
if (acc.isEmpty()) element.toString() else "$acc, $element"
} +
"]"
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Metadata.kt b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Metadata.kt
index 9c0f8ca..7fb3fb2 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Metadata.kt
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Metadata.kt
@@ -35,6 +35,6 @@
fun LayoutModifier.tag(tag: String): LayoutModifier = tag(tag.toByteArray())
internal class BaseMetadataElement(val tagData: ByteArray) : LayoutModifier.Element {
- fun foldIn(initial: ElementMetadata.Builder?): ElementMetadata.Builder =
+ fun mergeTo(initial: ElementMetadata.Builder?): ElementMetadata.Builder =
(initial ?: ElementMetadata.Builder()).setTagData(tagData)
}
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/ModifierAppliers.kt b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/ModifierAppliers.kt
index aee3599..af956d0 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/ModifierAppliers.kt
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/ModifierAppliers.kt
@@ -44,17 +44,17 @@
var visible: BoolProp.Builder? = null
var opacity: FloatProp.Builder? = null
- this.foldIn(Unit) { _, e ->
+ this.foldRight(Unit) { _, e ->
when (e) {
- is BaseSemanticElement -> semantics = e.foldIn(semantics)
- is BaseBackgroundElement -> background = e.foldIn(background)
- is BaseCornerElement -> corners = e.foldIn(corners)
- is BaseClickableElement -> clickable = e.foldIn(clickable)
- is BasePaddingElement -> padding = e.foldIn(padding)
- is BaseMetadataElement -> metadata = e.foldIn(metadata)
- is BaseBorderElement -> border = e.foldIn(border)
- is BaseVisibilityElement -> visible = e.foldIn(visible)
- is BaseOpacityElement -> opacity = e.foldIn(opacity)
+ is BaseSemanticElement -> semantics = e.mergeTo(semantics)
+ is BaseBackgroundElement -> background = e.mergeTo(background)
+ is BaseCornerElement -> corners = e.mergeTo(corners)
+ is BaseClickableElement -> clickable = e.mergeTo(clickable)
+ is BasePaddingElement -> padding = e.mergeTo(padding)
+ is BaseMetadataElement -> metadata = e.mergeTo(metadata)
+ is BaseBorderElement -> border = e.mergeTo(border)
+ is BaseVisibilityElement -> visible = e.mergeTo(visible)
+ is BaseOpacityElement -> opacity = e.mergeTo(opacity)
}
}
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Opacity.kt b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Opacity.kt
index eeafb8f9..e8d6f3d 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Opacity.kt
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Opacity.kt
@@ -42,7 +42,7 @@
internal class BaseOpacityElement(val staticValue: Float, val dynamicValue: DynamicFloat? = null) :
LayoutModifier.Element {
@SuppressLint("ProtoLayoutMinSchema")
- fun foldIn(initial: FloatProp.Builder?): FloatProp.Builder =
+ fun mergeTo(initial: FloatProp.Builder?): FloatProp.Builder =
(initial ?: FloatProp.Builder(staticValue)).apply {
dynamicValue?.let { setDynamicValue(it) }
}
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Padding.kt b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Padding.kt
index 050b8ce..af7df74 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Padding.kt
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Padding.kt
@@ -139,7 +139,7 @@
val rtlAware: Boolean = true
) : LayoutModifier.Element {
- fun foldIn(initial: Padding.Builder?): Padding.Builder =
+ fun mergeTo(initial: Padding.Builder?): Padding.Builder =
(initial ?: Padding.Builder()).apply {
if (!start.isNaN()) {
setStart(start.dp)
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Semantics.kt b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Semantics.kt
index d77f5e3..7d1b332 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Semantics.kt
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Semantics.kt
@@ -58,7 +58,7 @@
@SemanticsRole val semanticsRole: Int = SEMANTICS_ROLE_NONE
) : LayoutModifier.Element {
@SuppressLint("ProtoLayoutMinSchema")
- fun foldIn(initial: Semantics.Builder?): Semantics.Builder =
+ fun mergeTo(initial: Semantics.Builder?): Semantics.Builder =
(initial ?: Semantics.Builder()).apply {
contentDescription?.let { setContentDescription(it) }
if (semanticsRole != SEMANTICS_ROLE_NONE) {
diff --git a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Visibility.kt b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Visibility.kt
index b7eabd7..cb1596ab3 100644
--- a/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Visibility.kt
+++ b/wear/protolayout/protolayout/src/main/java/androidx/wear/protolayout/modifiers/Visibility.kt
@@ -46,7 +46,7 @@
val dynamicVisibility: DynamicBool? = null
) : LayoutModifier.Element {
@SuppressLint("ProtoLayoutMinSchema")
- fun foldIn(initial: BoolProp.Builder?): BoolProp.Builder =
+ fun mergeTo(initial: BoolProp.Builder?): BoolProp.Builder =
(initial ?: BoolProp.Builder(visibility)).apply {
dynamicVisibility?.let { setDynamicValue(it) }
}