Removes baselined ListIterator issues
The majority of these issues have been fixed by migrating to using the corresponding fast* API
A few have been suppressed where there are missing utils / it requires bigger changes to the logic
Test: lintDebug
Change-Id: I13204f11a87cb2930bb3b09d2b762feeec36bbf9
diff --git a/compose/animation/animation-core/lint-baseline.xml b/compose/animation/animation-core/lint-baseline.xml
index 8e853fd..6302da6 100644
--- a/compose/animation/animation-core/lint-baseline.xml
+++ b/compose/animation/animation-core/lint-baseline.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
+<issues format="6" by="lint 8.2.0-alpha14" type="baseline" client="cli" dependencies="false" name="AGP (8.2.0-alpha14)" variant="all" version="8.2.0-alpha14">
<issue
id="BanSuppressTag"
@@ -83,87 +83,6 @@
</issue>
<issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" _animations.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" _transitions.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" _animations.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" _transitions.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" _transitions.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" _animations.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" _animations.forEach { it.resetAnimation() }"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" return animations.fold("Transition animation values: ") { acc, anim -> "$acc$anim, " }"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" _animations.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt"/>
- </issue>
-
- <issue
id="PrimitiveInLambda"
message="Use a functional interface instead of lambda syntax for lambdas with primitive values in method animateFloatAsState has parameter 'finishedListener' with type Function1<? super Float, Unit>."
errorLine1=" finishedListener: ((Float) -> Unit)? = null"
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt
index cae02e2..963abe7 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt
@@ -40,6 +40,8 @@
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.util.fastFold
+import androidx.compose.ui.util.fastForEach
import kotlin.math.max
import kotlin.math.roundToLong
@@ -460,10 +462,10 @@
*/
val totalDurationNanos: Long by derivedStateOf {
var maxDurationNanos = 0L
- _animations.forEach {
+ _animations.fastForEach {
maxDurationNanos = max(maxDurationNanos, it.durationNanos)
}
- _transitions.forEach {
+ _transitions.fastForEach {
maxDurationNanos = max(
maxDurationNanos,
it.totalDurationNanos
@@ -483,7 +485,7 @@
playTimeNanos = frameTimeNanos - startTimeNanos
var allFinished = true
// Pulse new playtime
- _animations.forEach {
+ _animations.fastForEach {
if (!it.isFinished) {
it.onPlayTimeChanged(playTimeNanos, durationScale)
}
@@ -492,7 +494,7 @@
allFinished = false
}
}
- _transitions.forEach {
+ _transitions.fastForEach {
if (it.targetState != it.currentState) {
it.onFrame(playTimeNanos, durationScale)
}
@@ -563,7 +565,7 @@
segment = SegmentImpl(initialState, targetState)
}
- _transitions.forEach {
+ _transitions.fastForEach {
@Suppress("UNCHECKED_CAST")
(it as Transition<Any>).let {
if (it.isSeeking) {
@@ -576,7 +578,7 @@
}
}
- _animations.forEach {
+ _animations.fastForEach {
it.seekTo(playTimeNanos)
}
lastSeekedTimeNanos = playTimeNanos
@@ -621,7 +623,7 @@
// If target state is changed, reset all the animations to be re-created in the
// next frame w/ their new target value. Child animations target values are updated in
// the side effect that may not have happened when this function in invoked.
- _animations.forEach { it.resetAnimation() }
+ _animations.fastForEach { it.resetAnimation() }
}
}
}
@@ -655,7 +657,7 @@
}
override fun toString(): String {
- return animations.fold("Transition animation values: ") { acc, anim -> "$acc$anim, " }
+ return animations.fastFold("Transition animation values: ") { acc, anim -> "$acc$anim, " }
}
@OptIn(InternalAnimationApi::class)
@@ -664,7 +666,7 @@
if (isSeeking) {
// Update total duration
var maxDurationNanos = 0L
- _animations.forEach {
+ _animations.fastForEach {
maxDurationNanos = max(maxDurationNanos, it.durationNanos)
it.seekTo(lastSeekedTimeNanos)
}
diff --git a/compose/animation/animation-graphics/lint-baseline.xml b/compose/animation/animation-graphics/lint-baseline.xml
index 6f66ed4..f4264ea 100644
--- a/compose/animation/animation-graphics/lint-baseline.xml
+++ b/compose/animation/animation-graphics/lint-baseline.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
+<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="cli" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
<issue
id="RestrictedApi"
@@ -10,58 +10,4 @@
file="src/androidMain/kotlin/androidx/compose/animation/graphics/vector/compat/XmlAnimatorParser.android.kt"/>
</issue>
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" for (target in animatedImageVector.targets) {"
- errorLine2=" ~~">
- <location
- file="src/androidMain/kotlin/androidx/compose/animation/graphics/res/AnimatedVectorPainterResources.android.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val spec = combined(timestamps.map { timestamp ->"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/graphics/vector/Animator.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" for (keyframe in animatorKeyframes) {"
- errorLine2=" ~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/graphics/vector/Animator.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" for (keyframe in animatorKeyframes) {"
- errorLine2=" ~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/graphics/vector/Animator.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" return start.zip(stop) { a, b -> lerp(a, b, fraction) }"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/graphics/vector/Animator.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" specs.map { (timeMillis, spec) ->"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/graphics/vector/AnimatorAnimationSpecs.kt"/>
- </issue>
-
</issues>
diff --git a/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/res/AnimatedVectorPainterResources.android.kt b/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/res/AnimatedVectorPainterResources.android.kt
index 58544fd..0cd641d 100644
--- a/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/res/AnimatedVectorPainterResources.android.kt
+++ b/compose/animation/animation-graphics/src/androidMain/kotlin/androidx/compose/animation/graphics/res/AnimatedVectorPainterResources.android.kt
@@ -28,6 +28,7 @@
import androidx.compose.ui.graphics.vector.VectorConfig
import androidx.compose.ui.graphics.vector.VectorGroup
import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.util.fastForEach
/**
* Creates and remembers a [Painter] to render an [AnimatedImageVector]. It renders the image
@@ -69,7 +70,7 @@
) { _, _ ->
val transition = updateTransition(atEnd, label = animatedImageVector.imageVector.name)
val map = mutableMapOf<String, StateVectorConfig>()
- for (target in animatedImageVector.targets) {
+ animatedImageVector.targets.fastForEach { target ->
val config = target.animator.createVectorConfig(
transition,
animatedImageVector.totalDuration
diff --git a/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/Animator.kt b/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/Animator.kt
index 37fa401..d4ffb83 100644
--- a/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/Animator.kt
+++ b/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/Animator.kt
@@ -37,8 +37,10 @@
import androidx.compose.ui.graphics.vector.VectorConfig
import androidx.compose.ui.graphics.vector.VectorProperty
import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastMap
import androidx.compose.ui.util.fastMaxBy
import androidx.compose.ui.util.fastSumBy
+import androidx.compose.ui.util.fastZip
import androidx.compose.ui.util.lerp
internal const val RepeatCountInfinite = -1
@@ -146,7 +148,7 @@
): @Composable Transition.Segment<Boolean>.() -> FiniteAnimationSpec<T> {
return {
@Suppress("UNCHECKED_CAST")
- val spec = combined(timestamps.map { timestamp ->
+ val spec = combined(timestamps.fastMap { timestamp ->
timestamp.timeMillis to timestamp.asAnimationSpec()
})
if (targetState) spec else spec.reversed(overallDuration)
@@ -381,7 +383,7 @@
fun asKeyframeSpec(duration: Int): KeyframesSpec<Float> {
return keyframes {
durationMillis = duration
- for (keyframe in animatorKeyframes) {
+ animatorKeyframes.fastForEach { keyframe ->
keyframe.value at (duration * keyframe.fraction).toInt() with keyframe.interpolator
}
}
@@ -401,7 +403,7 @@
fun asKeyframeSpec(duration: Int): KeyframesSpec<Color> {
return keyframes {
durationMillis = duration
- for (keyframe in animatorKeyframes) {
+ animatorKeyframes.fastForEach { keyframe ->
keyframe.value at (duration * keyframe.fraction).toInt() with keyframe.interpolator
}
}
@@ -507,7 +509,7 @@
}
private fun lerp(start: List<PathNode>, stop: List<PathNode>, fraction: Float): List<PathNode> {
- return start.zip(stop) { a, b -> lerp(a, b, fraction) }
+ return start.fastZip(stop) { a, b -> lerp(a, b, fraction) }
}
private const val DifferentStartAndStopPathNodes = "start and stop path nodes have different types"
diff --git a/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/AnimatorAnimationSpecs.kt b/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/AnimatorAnimationSpecs.kt
index 3709bbc..7d9ef65 100644
--- a/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/AnimatorAnimationSpecs.kt
+++ b/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/AnimatorAnimationSpecs.kt
@@ -24,6 +24,7 @@
import androidx.compose.animation.core.FiniteAnimationSpec
import androidx.compose.animation.core.TwoWayConverter
import androidx.compose.animation.core.VectorizedFiniteAnimationSpec
+import androidx.compose.ui.util.fastMap
private const val MillisToNanos = 1_000_000L
@@ -101,7 +102,7 @@
converter: TwoWayConverter<T, V>
): VectorizedFiniteAnimationSpec<V> {
return VectorizedCombinedSpec(
- specs.map { (timeMillis, spec) ->
+ specs.fastMap { (timeMillis, spec) ->
timeMillis * MillisToNanos to spec.vectorize(converter)
}
)
diff --git a/compose/animation/animation/lint-baseline.xml b/compose/animation/animation/lint-baseline.xml
index d6cc720..76c606a 100644
--- a/compose/animation/animation/lint-baseline.xml
+++ b/compose/animation/animation/lint-baseline.xml
@@ -1,95 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" currentlyVisible.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/AnimatedContent.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" ) = measurables.asSequence().map { it.minIntrinsicWidth(height) }.maxOrNull() ?: 0"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/AnimatedContent.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" ) = measurables.asSequence().map { it.minIntrinsicHeight(width) }.maxOrNull() ?: 0"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/AnimatedContent.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" ) = measurables.asSequence().map { it.maxIntrinsicWidth(height) }.maxOrNull() ?: 0"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/AnimatedContent.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" ) = measurables.asSequence().map { it.maxIntrinsicHeight(width) }.maxOrNull() ?: 0"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/AnimatedContent.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val placeables = measurables.map { it.measure(constraints) }"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/AnimatedVisibility.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" ) = measurables.asSequence().map { it.minIntrinsicWidth(height) }.maxOrNull() ?: 0"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/AnimatedVisibility.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" ) = measurables.asSequence().map { it.minIntrinsicHeight(width) }.maxOrNull() ?: 0"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/AnimatedVisibility.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" ) = measurables.asSequence().map { it.maxIntrinsicWidth(height) }.maxOrNull() ?: 0"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/AnimatedVisibility.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" ) = measurables.asSequence().map { it.maxIntrinsicHeight(width) }.maxOrNull() ?: 0"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/animation/AnimatedVisibility.kt"/>
- </issue>
+<issues format="6" by="lint 8.2.0-alpha14" type="baseline" client="cli" dependencies="false" name="AGP (8.2.0-alpha14)" variant="all" version="8.2.0-alpha14">
<issue
id="PrimitiveInLambda"
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedContent.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedContent.kt
index 94f9f66..b82c044 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedContent.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedContent.kt
@@ -79,6 +79,7 @@
import androidx.compose.ui.unit.toSize
import androidx.compose.ui.util.fastForEach
import androidx.compose.ui.util.fastForEachIndexed
+import androidx.compose.ui.util.fastMaxOfOrNull
import kotlin.math.roundToInt
import kotlinx.coroutines.CoroutineScope
@@ -849,7 +850,7 @@
}
.then(sizeModifier),
content = {
- currentlyVisible.forEach {
+ currentlyVisible.fastForEach {
key(contentKey(it)) { contentMap[it]?.invoke() }
}
},
@@ -1044,22 +1045,22 @@
override fun IntrinsicMeasureScope.minIntrinsicWidth(
measurables: List<IntrinsicMeasurable>,
height: Int
- ) = measurables.asSequence().map { it.minIntrinsicWidth(height) }.maxOrNull() ?: 0
+ ) = measurables.fastMaxOfOrNull { it.minIntrinsicWidth(height) } ?: 0
override fun IntrinsicMeasureScope.minIntrinsicHeight(
measurables: List<IntrinsicMeasurable>,
width: Int
- ) = measurables.asSequence().map { it.minIntrinsicHeight(width) }.maxOrNull() ?: 0
+ ) = measurables.fastMaxOfOrNull { it.minIntrinsicHeight(width) } ?: 0
override fun IntrinsicMeasureScope.maxIntrinsicWidth(
measurables: List<IntrinsicMeasurable>,
height: Int
- ) = measurables.asSequence().map { it.maxIntrinsicWidth(height) }.maxOrNull() ?: 0
+ ) = measurables.fastMaxOfOrNull { it.maxIntrinsicWidth(height) } ?: 0
override fun IntrinsicMeasureScope.maxIntrinsicHeight(
measurables: List<IntrinsicMeasurable>,
width: Int
- ) = measurables.asSequence().map { it.maxIntrinsicHeight(width) }.maxOrNull() ?: 0
+ ) = measurables.fastMaxOfOrNull { it.maxIntrinsicHeight(width) } ?: 0
}
private class SizeModifierInLookaheadNode<S>(
diff --git a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedVisibility.kt b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedVisibility.kt
index 367c85b..c6459b7 100644
--- a/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedVisibility.kt
+++ b/compose/animation/animation/src/commonMain/kotlin/androidx/compose/animation/AnimatedVisibility.kt
@@ -54,7 +54,9 @@
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastMap
import androidx.compose.ui.util.fastMaxBy
+import androidx.compose.ui.util.fastMaxOfOrNull
/**
* [AnimatedVisibility] composable animates the appearance and disappearance of its content, as
@@ -846,7 +848,7 @@
measurables: List<Measurable>,
constraints: Constraints
): MeasureResult {
- val placeables = measurables.map { it.measure(constraints) }
+ val placeables = measurables.fastMap { it.measure(constraints) }
val maxWidth: Int = placeables.fastMaxBy { it.width }?.width ?: 0
val maxHeight = placeables.fastMaxBy { it.height }?.height ?: 0
// Position the children.
@@ -861,22 +863,22 @@
override fun IntrinsicMeasureScope.minIntrinsicWidth(
measurables: List<IntrinsicMeasurable>,
height: Int
- ) = measurables.asSequence().map { it.minIntrinsicWidth(height) }.maxOrNull() ?: 0
+ ) = measurables.fastMaxOfOrNull { it.minIntrinsicWidth(height) } ?: 0
override fun IntrinsicMeasureScope.minIntrinsicHeight(
measurables: List<IntrinsicMeasurable>,
width: Int
- ) = measurables.asSequence().map { it.minIntrinsicHeight(width) }.maxOrNull() ?: 0
+ ) = measurables.fastMaxOfOrNull { it.minIntrinsicHeight(width) } ?: 0
override fun IntrinsicMeasureScope.maxIntrinsicWidth(
measurables: List<IntrinsicMeasurable>,
height: Int
- ) = measurables.asSequence().map { it.maxIntrinsicWidth(height) }.maxOrNull() ?: 0
+ ) = measurables.fastMaxOfOrNull { it.maxIntrinsicWidth(height) } ?: 0
override fun IntrinsicMeasureScope.maxIntrinsicHeight(
measurables: List<IntrinsicMeasurable>,
width: Int
- ) = measurables.asSequence().map { it.maxIntrinsicHeight(width) }.maxOrNull() ?: 0
+ ) = measurables.fastMaxOfOrNull { it.maxIntrinsicHeight(width) } ?: 0
}
// This converts Boolean visible to EnterExitState
diff --git a/compose/foundation/foundation/lint-baseline.xml b/compose/foundation/foundation/lint-baseline.xml
index 4fa6762..21f098b 100644
--- a/compose/foundation/foundation/lint-baseline.xml
+++ b/compose/foundation/foundation/lint-baseline.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
+<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="cli" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
<issue
id="NewApi"
@@ -1470,6 +1470,42 @@
<issue
id="PrimitiveInLambda"
+ message="Use a functional interface instead of lambda syntax for lambdas with primitive values in method HorizontalPager has parameter 'key' with type Function1<? super Integer, ? extends Object>."
+ errorLine1=" key: ((index: Int) -> Any)? = null,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/commonMain/kotlin/androidx/compose/foundation/pager/Pager.kt"/>
+ </issue>
+
+ <issue
+ id="PrimitiveInLambda"
+ message="Use a functional interface instead of lambda syntax for lambdas with primitive values in method HorizontalPager has parameter 'pageContent' with type Function2<? super PagerScope, ? super Integer, Unit>."
+ errorLine1=" pageContent: @Composable PagerScope.(page: Int) -> Unit"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/commonMain/kotlin/androidx/compose/foundation/pager/Pager.kt"/>
+ </issue>
+
+ <issue
+ id="PrimitiveInLambda"
+ message="Use a functional interface instead of lambda syntax for lambdas with primitive values in method VerticalPager has parameter 'key' with type Function1<? super Integer, ? extends Object>."
+ errorLine1=" key: ((index: Int) -> Any)? = null,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/commonMain/kotlin/androidx/compose/foundation/pager/Pager.kt"/>
+ </issue>
+
+ <issue
+ id="PrimitiveInLambda"
+ message="Use a functional interface instead of lambda syntax for lambdas with primitive values in method VerticalPager has parameter 'pageContent' with type Function2<? super PagerScope, ? super Integer, Unit>."
+ errorLine1=" pageContent: @Composable PagerScope.(page: Int) -> Unit"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/commonMain/kotlin/androidx/compose/foundation/pager/Pager.kt"/>
+ </issue>
+
+ <issue
+ id="PrimitiveInLambda"
message="Use a functional interface instead of lambda syntax for lambdas with primitive values in method VerticalPager has parameter 'key' with type Function1<? super Integer, ? extends Object>."
errorLine1=" key: ((index: Int) -> Any)? = null,"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/AndroidOverscroll.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/AndroidOverscroll.kt
index 2da447e..7c67818 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/AndroidOverscroll.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/AndroidOverscroll.kt
@@ -55,6 +55,7 @@
import androidx.compose.ui.unit.Velocity
import androidx.compose.ui.unit.toSize
import androidx.compose.ui.util.fastAny
+import androidx.compose.ui.util.fastFilter
import androidx.compose.ui.util.fastFirstOrNull
import androidx.compose.ui.util.fastForEach
import kotlin.math.roundToInt
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/gestures/AndroidScrollable.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/gestures/AndroidScrollable.android.kt
index c047b0d..938d5f0 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/gestures/AndroidScrollable.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/gestures/AndroidScrollable.android.kt
@@ -16,13 +16,13 @@
package androidx.compose.foundation.gestures
-import androidx.compose.foundation.fastFold
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.input.pointer.PointerEvent
import androidx.compose.ui.node.CompositionLocalConsumerModifierNode
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastFold
internal actual fun CompositionLocalConsumerModifierNode.platformScrollConfig(): ScrollConfig =
AndroidConfig
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/LazyGridSnapLayoutInfoProvider.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/LazyGridSnapLayoutInfoProvider.kt
index 995e2b7..236c03f 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/LazyGridSnapLayoutInfoProvider.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/snapping/LazyGridSnapLayoutInfoProvider.kt
@@ -20,12 +20,12 @@
import androidx.compose.animation.core.calculateTargetValue
import androidx.compose.animation.splineBasedDecay
import androidx.compose.foundation.ExperimentalFoundationApi
-import androidx.compose.foundation.fastFilter
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.foundation.lazy.grid.LazyGridItemInfo
import androidx.compose.foundation.lazy.grid.LazyGridLayoutInfo
import androidx.compose.foundation.lazy.grid.LazyGridState
import androidx.compose.ui.unit.Density
+import androidx.compose.ui.util.fastFilter
import androidx.compose.ui.util.fastForEach
import androidx.compose.ui.util.fastSumBy
import kotlin.math.absoluteValue
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
index 6402fc2..0f08e81 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
@@ -17,7 +17,6 @@
package androidx.compose.foundation.lazy
import androidx.compose.foundation.ExperimentalFoundationApi
-import androidx.compose.foundation.fastFilter
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.ui.layout.MeasureResult
@@ -28,6 +27,7 @@
import androidx.compose.ui.unit.constrainHeight
import androidx.compose.ui.unit.constrainWidth
import androidx.compose.ui.util.fastAny
+import androidx.compose.ui.util.fastFilter
import androidx.compose.ui.util.fastFirstOrNull
import androidx.compose.ui.util.fastForEach
import kotlin.math.abs
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasure.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasure.kt
index 07c9edb..997dcd6 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasure.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridMeasure.kt
@@ -17,7 +17,6 @@
package androidx.compose.foundation.lazy.grid
import androidx.compose.foundation.ExperimentalFoundationApi
-import androidx.compose.foundation.fastFilter
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.ui.layout.MeasureResult
@@ -27,6 +26,7 @@
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.constrainHeight
import androidx.compose.ui.unit.constrainWidth
+import androidx.compose.ui.util.fastFilter
import androidx.compose.ui.util.fastForEach
import androidx.compose.ui.util.fastSumBy
import kotlin.math.abs
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasure.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasure.kt
index 5765b23..cacee1b 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasure.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasure.kt
@@ -17,7 +17,6 @@
package androidx.compose.foundation.lazy.staggeredgrid
import androidx.compose.foundation.ExperimentalFoundationApi
-import androidx.compose.foundation.fastMaxOfOrNull
import androidx.compose.foundation.lazy.layout.LazyLayoutKeyIndexMap
import androidx.compose.foundation.lazy.layout.LazyLayoutMeasureScope
import androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridLaneInfo.Companion.FullSpan
@@ -31,6 +30,7 @@
import androidx.compose.ui.unit.constrainWidth
import androidx.compose.ui.util.fastForEach
import androidx.compose.ui.util.fastForEachIndexed
+import androidx.compose.ui.util.fastMaxOfOrNull
import androidx.compose.ui.util.packInts
import androidx.compose.ui.util.unpackInt1
import androidx.compose.ui.util.unpackInt2
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerMeasure.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerMeasure.kt
index 4a89200..4838339 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerMeasure.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerMeasure.kt
@@ -17,7 +17,6 @@
package androidx.compose.foundation.pager
import androidx.compose.foundation.ExperimentalFoundationApi
-import androidx.compose.foundation.fastFilter
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.foundation.layout.Arrangement.Absolute.spacedBy
import androidx.compose.foundation.lazy.layout.LazyLayoutMeasureScope
@@ -30,6 +29,7 @@
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.constrainHeight
import androidx.compose.ui.unit.constrainWidth
+import androidx.compose.ui.util.fastFilter
import androidx.compose.ui.util.fastForEach
import kotlin.math.abs
import kotlin.math.roundToInt
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicText.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicText.kt
index 45409ef..95bc432 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicText.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicText.kt
@@ -16,7 +16,6 @@
package androidx.compose.foundation.text
-import androidx.compose.foundation.fastMapIndexedNotNull
import androidx.compose.foundation.text.modifiers.SelectableTextAnnotatedStringElement
import androidx.compose.foundation.text.modifiers.SelectionController
import androidx.compose.foundation.text.modifiers.TextAnnotatedStringElement
@@ -50,6 +49,7 @@
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastMapIndexedNotNull
import kotlin.math.floor
import kotlin.math.roundToInt
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.kt
index 62e6c4b..2e1e17d 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SelectionManager.kt
@@ -16,7 +16,6 @@
package androidx.compose.foundation.text.selection
-import androidx.compose.foundation.fastFold
import androidx.compose.foundation.focusable
import androidx.compose.foundation.gestures.awaitEachGesture
import androidx.compose.foundation.gestures.waitForUpOrCancellation
@@ -49,6 +48,7 @@
import androidx.compose.ui.platform.TextToolbarStatus
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.util.fastFold
import androidx.compose.ui.util.fastForEach
import kotlin.math.absoluteValue
import kotlin.math.max
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SimpleLayout.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SimpleLayout.kt
index 5d19876..ba1865c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SimpleLayout.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/selection/SimpleLayout.kt
@@ -16,10 +16,10 @@
package androidx.compose.foundation.text.selection
-import androidx.compose.foundation.fastFold
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.Layout
+import androidx.compose.ui.util.fastFold
import androidx.compose.ui.util.fastForEach
import androidx.compose.ui.util.fastMap
import kotlin.math.max
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/DesktopScrollable.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/DesktopScrollable.desktop.kt
index ba28512..e57ca9b 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/DesktopScrollable.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/DesktopScrollable.desktop.kt
@@ -17,7 +17,6 @@
package androidx.compose.foundation.gestures
import androidx.compose.foundation.DesktopPlatform
-import androidx.compose.foundation.fastFold
import androidx.compose.runtime.compositionLocalOf
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.input.pointer.PointerEvent
@@ -26,6 +25,7 @@
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastFold
import java.awt.event.MouseWheelEvent
import kotlin.math.sqrt
diff --git a/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt b/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt
index 0d918c1..8a0761c 100644
--- a/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt
+++ b/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt
@@ -53,6 +53,7 @@
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastFold
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
diff --git a/compose/material/material/lint-baseline.xml b/compose/material/material/lint-baseline.xml
index 564dcc8..c8e0bc4 100644
--- a/compose/material/material/lint-baseline.xml
+++ b/compose/material/material/lint-baseline.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
+<issues format="6" by="lint 8.1.0-beta05" type="baseline" client="gradle" dependencies="false" name="AGP (8.1.0-beta05)" variant="all" version="8.1.0-beta05">
<issue
id="BanThreadSleep"
@@ -137,654 +137,6 @@
</issue>
<issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val titlePlaceable = measurables.firstOrNull { it.layoutId == "title" }?.measure("
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/AlertDialog.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val textPlaceable = measurables.firstOrNull { it.layoutId == "text" }?.measure("
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/AlertDialog.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" sequences.add(0, currentSequence.toList())"
- errorLine2=" ~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/AlertDialog.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" for (measurable in measurables) {"
- errorLine2=" ~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/AlertDialog.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val badgePlaceable = measurables.first { it.layoutId == "badge" }.measure("
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/Badge.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val anchorPlaceable = measurables.first { it.layoutId == "anchor" }.measure(constraints)"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/Badge.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val iconPlaceable = measurables.first { it.layoutId == "icon" }.measure(constraints)"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/BottomNavigation.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.first { it.layoutId == "label" }.measure("
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/BottomNavigation.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" }.map { it.measure(looseConstraints) }"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .map { it.measure(looseConstraints) }"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" }.map { it.measure(bodyConstraints) }"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" subcompose(BottomSheetScaffoldLayoutSlot.Fab, fab).map { it.measure(looseConstraints) }"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .map { it.measure(looseConstraints) }"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val placeables = measurables.map { it.measure(childConstraints) }"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/ListItem.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val containerWidth = placeables.fold(0) { maxWidth, placeable ->"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/ListItem.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val iconPlaceable = measurables.first { it.layoutId == "icon" }.measure(constraints)"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/NavigationRail.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.first { it.layoutId == "label" }.measure("
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/NavigationRail.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val leadingPlaceable = measurables.find {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val trailingPlaceable = measurables.find { it.layoutId == TrailingId }"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.find { it.layoutId == LabelId }?.measure(labelConstraints)"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.first { it.layoutId == TextFieldId }.measure(textConstraints)"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.find { it.layoutId == PlaceholderId }?.measure(placeholderConstraints)"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val borderPlaceable = measurables.first { it.layoutId == BorderId }.measure("
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" intrinsicMeasurer(measurables.first { it.layoutId == TextFieldId }, height)"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val labelWidth = measurables.find { it.layoutId == LabelId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val trailingWidth = measurables.find { it.layoutId == TrailingId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val leadingWidth = measurables.find { it.layoutId == LeadingId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val placeholderWidth = measurables.find { it.layoutId == PlaceholderId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val leadingHeight = measurables.find { it.layoutId == LeadingId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val trailingHeight = measurables.find { it.layoutId == TrailingId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val labelHeight = measurables.find { it.layoutId == LabelId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" intrinsicMeasurer(measurables.first { it.layoutId == TextFieldId }, remainingWidth)"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val placeholderHeight = measurables.find { it.layoutId == PlaceholderId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val snackbarPlaceables = subcompose(ScaffoldLayoutContent.Snackbar, snackbar).map {"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/Scaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" tickFractions.groupBy { it > positionFractionEnd || it < positionFractionStart }"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/Slider.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" list.map {"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/Slider.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .minByOrNull { abs(lerp(minPx, maxPx, it) - current) }"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/Slider.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val buttonPlaceable = measurables.first { it.layoutId == actionTag }.measure(constraints)"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/Snackbar.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val textPlaceable = measurables.first { it.layoutId == textTag }.measure("
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/Snackbar.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val keys = state.items.map { it.key }.toMutableList()"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/SnackbarHost.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" keys.filterNotNull().mapTo(state.items) { key ->"
- errorLine2=" ~~~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/SnackbarHost.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" keys.filterNotNull().mapTo(state.items) { key ->"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/SnackbarHost.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val animationDelay = if (isVisible && keys.filterNotNull().size != 1) delay else 0"
- errorLine2=" ~~~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/SnackbarHost.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val a = anchors.filter { it <= offset + 0.001 }.maxOrNull()"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/Swipeable.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val b = anchors.filter { it >= offset - 0.001 }.minOrNull()"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/Swipeable.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.first { it.layoutId == "text" }.measure("
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/Tab.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.first { it.layoutId == "icon" }.measure(constraints)"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/Tab.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val tabPlaceables = tabMeasurables.map {"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val tabRowHeight = tabPlaceables.maxByOrNull { it.height }?.height ?: 0"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" tabPlaceables.forEachIndexed { index, placeable ->"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" subcompose(TabSlots.Divider, divider).forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" }.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .map { it.measure(tabConstraints) }"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" tabPlaceables.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" tabPlaceables.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" subcompose(TabSlots.Divider, divider).forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" }.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.find { it.layoutId == LeadingId }?.measure(looseConstraints)"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val trailingPlaceable = measurables.find { it.layoutId == TrailingId }"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.find { it.layoutId == LabelId }?.measure(labelConstraints)"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .first { it.layoutId == TextFieldId }"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .find { it.layoutId == PlaceholderId }"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" intrinsicMeasurer(measurables.first { it.layoutId == TextFieldId }, height)"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val labelWidth = measurables.find { it.layoutId == LabelId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val trailingWidth = measurables.find { it.layoutId == TrailingId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val leadingWidth = measurables.find { it.layoutId == LeadingId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val placeholderWidth = measurables.find { it.layoutId == PlaceholderId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val leadingHeight = measurables.find { it.layoutId == LeadingId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val trailingHeight = measurables.find { it.layoutId == TrailingId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val labelHeight = measurables.find { it.layoutId == LabelId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" intrinsicMeasurer(measurables.first { it.layoutId == TextFieldId }, remainingWidth)"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val placeholderHeight = measurables.find { it.layoutId == PlaceholderId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material/TextField.kt"/>
- </issue>
-
- <issue
id="PrimitiveInLambda"
message="Use a functional interface instead of lambda syntax for lambdas with primitive values in constructor AnchoredDraggableState has parameter 'positionalThreshold' with type Function1<? super Float, Float>."
errorLine1=" internal val positionalThreshold: (totalDistance: Float) -> Float,"
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AlertDialog.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AlertDialog.kt
index a469837..e131384 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AlertDialog.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/AlertDialog.kt
@@ -37,6 +37,8 @@
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
+import androidx.compose.ui.util.fastFirstOrNull
+import androidx.compose.ui.util.fastForEach
import androidx.compose.ui.util.fastForEachIndexed
import kotlin.math.max
@@ -111,10 +113,10 @@
) { measurables, constraints ->
// Measure with loose constraints for height as we don't want the text to take up more
// space than it needs
- val titlePlaceable = measurables.firstOrNull { it.layoutId == "title" }?.measure(
+ val titlePlaceable = measurables.fastFirstOrNull { it.layoutId == "title" }?.measure(
constraints.copy(minHeight = 0)
)
- val textPlaceable = measurables.firstOrNull { it.layoutId == "text" }?.measure(
+ val textPlaceable = measurables.fastFirstOrNull { it.layoutId == "text" }?.measure(
constraints.copy(minHeight = 0)
)
@@ -215,6 +217,7 @@
crossAxisSpace += crossAxisSpacing.roundToPx()
}
// Ensures that confirming actions appear above dismissive actions.
+ @Suppress("ListIterator")
sequences.add(0, currentSequence.toList())
crossAxisSizes += currentCrossAxisSize
crossAxisPositions += crossAxisSpace
@@ -227,7 +230,7 @@
currentCrossAxisSize = 0
}
- for (measurable in measurables) {
+ measurables.fastForEach { measurable ->
// Ask the child for its preferred size.
val placeable = measurable.measure(childConstraints)
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Badge.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Badge.kt
index 2e753d5..a8eb298 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Badge.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Badge.kt
@@ -37,6 +37,7 @@
import androidx.compose.ui.layout.layoutId
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
+import androidx.compose.ui.util.fastFirst
/**
* A BadgeBox is used to decorate [content] with a [badge] that can contain dynamic information,
@@ -76,13 +77,13 @@
modifier = modifier
) { measurables, constraints ->
- val badgePlaceable = measurables.first { it.layoutId == "badge" }.measure(
+ val badgePlaceable = measurables.fastFirst { it.layoutId == "badge" }.measure(
// Measure with loose constraints for height as we don't want the text to take up more
// space than it needs.
constraints.copy(minHeight = 0)
)
- val anchorPlaceable = measurables.first { it.layoutId == "anchor" }.measure(constraints)
+ val anchorPlaceable = measurables.fastFirst { it.layoutId == "anchor" }.measure(constraints)
val firstBaseline = anchorPlaceable[FirstBaseline]
val lastBaseline = anchorPlaceable[LastBaseline]
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomNavigation.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomNavigation.kt
index fb53a4d..c7cf7ba 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomNavigation.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomNavigation.kt
@@ -57,6 +57,7 @@
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastFirst
import kotlin.math.max
import kotlin.math.roundToInt
@@ -329,10 +330,10 @@
}
}
) { measurables, constraints ->
- val iconPlaceable = measurables.first { it.layoutId == "icon" }.measure(constraints)
+ val iconPlaceable = measurables.fastFirst { it.layoutId == "icon" }.measure(constraints)
val labelPlaceable = label?.let {
- measurables.first { it.layoutId == "label" }.measure(
+ measurables.fastFirst { it.layoutId == "label" }.measure(
// Measure with loose constraints for height as we don't want the label to take up more
// space than it needs
constraints.copy(minHeight = 0)
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt
index c579b53..c3d1131 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/BottomSheetScaffold.kt
@@ -52,6 +52,7 @@
import androidx.compose.ui.unit.Velocity
import androidx.compose.ui.unit.dp
import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastMap
import androidx.compose.ui.util.fastMaxBy
import kotlin.math.roundToInt
import kotlinx.coroutines.CancellationException
@@ -608,27 +609,29 @@
val sheetPlaceables = subcompose(BottomSheetScaffoldLayoutSlot.Sheet) {
bottomSheet(layoutHeight)
- }.map { it.measure(looseConstraints) }
+ }.fastMap { it.measure(looseConstraints) }
val topBarPlaceables = topBar?.let {
subcompose(BottomSheetScaffoldLayoutSlot.TopBar, topBar)
- .map { it.measure(looseConstraints) }
+ .fastMap { it.measure(looseConstraints) }
}
val topBarHeight = topBarPlaceables?.fastMaxBy { it.height }?.height ?: 0
val bodyConstraints = looseConstraints.copy(maxHeight = layoutHeight - topBarHeight)
val bodyPlaceables = subcompose(BottomSheetScaffoldLayoutSlot.Body) {
body(PaddingValues(bottom = sheetPeekHeight))
- }.map { it.measure(bodyConstraints) }
+ }.fastMap { it.measure(bodyConstraints) }
val fabPlaceable = floatingActionButton?.let { fab ->
- subcompose(BottomSheetScaffoldLayoutSlot.Fab, fab).map { it.measure(looseConstraints) }
+ subcompose(BottomSheetScaffoldLayoutSlot.Fab, fab).fastMap {
+ it.measure(looseConstraints)
+ }
}
val fabWidth = fabPlaceable?.fastMaxBy { it.width }?.width ?: 0
val fabHeight = fabPlaceable?.fastMaxBy { it.height }?.height ?: 0
val snackbarPlaceables = subcompose(BottomSheetScaffoldLayoutSlot.Snackbar, snackbarHost)
- .map { it.measure(looseConstraints) }
+ .fastMap { it.measure(looseConstraints) }
val snackbarWidth = snackbarPlaceables.fastMaxBy { it.width }?.width ?: 0
val snackbarHeight = snackbarPlaceables.fastMaxBy { it.height }?.height ?: 0
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ListItem.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ListItem.kt
index 4d8e6aa..2a24638 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ListItem.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ListItem.kt
@@ -37,7 +37,9 @@
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastFold
import androidx.compose.ui.util.fastForEachIndexed
+import androidx.compose.ui.util.fastMap
import kotlin.math.max
/**
@@ -353,9 +355,9 @@
) {
Layout(content, modifier) { measurables, constraints ->
val childConstraints = constraints.copy(minHeight = 0, maxHeight = Constraints.Infinity)
- val placeables = measurables.map { it.measure(childConstraints) }
+ val placeables = measurables.fastMap { it.measure(childConstraints) }
- val containerWidth = placeables.fold(0) { maxWidth, placeable ->
+ val containerWidth = placeables.fastFold(0) { maxWidth, placeable ->
max(maxWidth, placeable.width)
}
val y = Array(placeables.size) { 0 }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/NavigationRail.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/NavigationRail.kt
index 49943de..bf876d0 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/NavigationRail.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/NavigationRail.kt
@@ -58,6 +58,7 @@
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastFirst
import kotlin.math.max
import kotlin.math.roundToInt
@@ -339,10 +340,10 @@
}
}
) { measurables, constraints ->
- val iconPlaceable = measurables.first { it.layoutId == "icon" }.measure(constraints)
+ val iconPlaceable = measurables.fastFirst { it.layoutId == "icon" }.measure(constraints)
val labelPlaceable = label?.let {
- measurables.first { it.layoutId == "label" }.measure(
+ measurables.fastFirst { it.layoutId == "label" }.measure(
// Measure with loose constraints for height as we don't want the label to take up more
// space than it needs
constraints.copy(minHeight = 0)
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt
index 51876ef..fb7fb64 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt
@@ -61,6 +61,8 @@
import androidx.compose.ui.unit.coerceAtLeast
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.offset
+import androidx.compose.ui.util.fastFirst
+import androidx.compose.ui.util.fastFirstOrNull
import androidx.compose.ui.util.lerp
import kotlin.math.max
import kotlin.math.roundToInt
@@ -576,7 +578,7 @@
// measure leading icon
val relaxedConstraints = constraints.copy(minWidth = 0, minHeight = 0)
- val leadingPlaceable = measurables.find {
+ val leadingPlaceable = measurables.fastFirstOrNull {
it.layoutId == LeadingId
}?.measure(relaxedConstraints)
occupiedSpaceHorizontally += widthOrZero(
@@ -584,7 +586,7 @@
)
// measure trailing icon
- val trailingPlaceable = measurables.find { it.layoutId == TrailingId }
+ val trailingPlaceable = measurables.fastFirstOrNull { it.layoutId == TrailingId }
?.measure(relaxedConstraints.offset(horizontal = -occupiedSpaceHorizontally))
occupiedSpaceHorizontally += widthOrZero(
trailingPlaceable
@@ -603,7 +605,7 @@
vertical = -bottomPadding
)
val labelPlaceable =
- measurables.find { it.layoutId == LabelId }?.measure(labelConstraints)
+ measurables.fastFirstOrNull { it.layoutId == LabelId }?.measure(labelConstraints)
labelPlaceable?.let {
onLabelMeasured(Size(it.width.toFloat(), it.height.toFloat()))
}
@@ -620,12 +622,12 @@
vertical = -bottomPadding - topPadding
).copy(minHeight = 0)
val textFieldPlaceable =
- measurables.first { it.layoutId == TextFieldId }.measure(textConstraints)
+ measurables.fastFirst { it.layoutId == TextFieldId }.measure(textConstraints)
// measure placeholder
val placeholderConstraints = textConstraints.copy(minWidth = 0)
- val placeholderPlaceable =
- measurables.find { it.layoutId == PlaceholderId }?.measure(placeholderConstraints)
+ val placeholderPlaceable = measurables.fastFirstOrNull { it.layoutId == PlaceholderId }
+ ?.measure(placeholderConstraints)
val width =
calculateWidth(
@@ -652,7 +654,7 @@
paddingValues = paddingValues,
)
- val borderPlaceable = measurables.first { it.layoutId == BorderId }.measure(
+ val borderPlaceable = measurables.fastFirst { it.layoutId == BorderId }.measure(
Constraints(
minWidth = if (width != Constraints.Infinity) width else 0,
maxWidth = width,
@@ -721,17 +723,17 @@
intrinsicMeasurer: (IntrinsicMeasurable, Int) -> Int
): Int {
val textFieldWidth =
- intrinsicMeasurer(measurables.first { it.layoutId == TextFieldId }, height)
- val labelWidth = measurables.find { it.layoutId == LabelId }?.let {
+ intrinsicMeasurer(measurables.fastFirst { it.layoutId == TextFieldId }, height)
+ val labelWidth = measurables.fastFirstOrNull { it.layoutId == LabelId }?.let {
intrinsicMeasurer(it, height)
} ?: 0
- val trailingWidth = measurables.find { it.layoutId == TrailingId }?.let {
+ val trailingWidth = measurables.fastFirstOrNull { it.layoutId == TrailingId }?.let {
intrinsicMeasurer(it, height)
} ?: 0
- val leadingWidth = measurables.find { it.layoutId == LeadingId }?.let {
+ val leadingWidth = measurables.fastFirstOrNull { it.layoutId == LeadingId }?.let {
intrinsicMeasurer(it, height)
} ?: 0
- val placeholderWidth = measurables.find { it.layoutId == PlaceholderId }?.let {
+ val placeholderWidth = measurables.fastFirstOrNull { it.layoutId == PlaceholderId }?.let {
intrinsicMeasurer(it, height)
} ?: 0
return calculateWidth(
@@ -753,22 +755,22 @@
intrinsicMeasurer: (IntrinsicMeasurable, Int) -> Int
): Int {
var remainingWidth = width
- val leadingHeight = measurables.find { it.layoutId == LeadingId }?.let {
+ val leadingHeight = measurables.fastFirstOrNull { it.layoutId == LeadingId }?.let {
remainingWidth -= it.maxIntrinsicWidth(Constraints.Infinity)
intrinsicMeasurer(it, width)
} ?: 0
- val trailingHeight = measurables.find { it.layoutId == TrailingId }?.let {
+ val trailingHeight = measurables.fastFirstOrNull { it.layoutId == TrailingId }?.let {
remainingWidth -= it.maxIntrinsicWidth(Constraints.Infinity)
intrinsicMeasurer(it, width)
} ?: 0
- val labelHeight = measurables.find { it.layoutId == LabelId }?.let {
+ val labelHeight = measurables.fastFirstOrNull { it.layoutId == LabelId }?.let {
intrinsicMeasurer(it, lerp(remainingWidth, width, animationProgress))
} ?: 0
val textFieldHeight =
- intrinsicMeasurer(measurables.first { it.layoutId == TextFieldId }, remainingWidth)
- val placeholderHeight = measurables.find { it.layoutId == PlaceholderId }?.let {
+ intrinsicMeasurer(measurables.fastFirst { it.layoutId == TextFieldId }, remainingWidth)
+ val placeholderHeight = measurables.fastFirstOrNull { it.layoutId == PlaceholderId }?.let {
intrinsicMeasurer(it, remainingWidth)
} ?: 0
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Scaffold.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Scaffold.kt
index f5acb86..106f8ad 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Scaffold.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Scaffold.kt
@@ -400,7 +400,7 @@
val topBarHeight = topBarPlaceables.fastMaxBy { it.height }?.height ?: 0
- val snackbarPlaceables = subcompose(ScaffoldLayoutContent.Snackbar, snackbar).map {
+ val snackbarPlaceables = subcompose(ScaffoldLayoutContent.Snackbar, snackbar).fastMap {
// respect only bottom and horizontal for snackbar and fab
val leftInset = contentWindowInsets
.getLeft(this@SubcomposeLayout, layoutDirection)
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Slider.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Slider.kt
index aa3bd62..31e5a89 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Slider.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Slider.kt
@@ -93,6 +93,8 @@
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastMap
+import androidx.compose.ui.util.fastMinByOrNull
import androidx.compose.ui.util.lerp
import kotlin.math.abs
import kotlin.math.floor
@@ -773,10 +775,11 @@
trackStrokeWidth,
StrokeCap.Round
)
+ @Suppress("ListIterator")
tickFractions.groupBy { it > positionFractionEnd || it < positionFractionStart }
.forEach { (outsideFraction, list) ->
drawPoints(
- list.map {
+ list.fastMap {
Offset(lerp(sliderStart, sliderEnd, it).x, center.y)
},
PointMode.Points,
@@ -796,7 +799,7 @@
): Float {
// target is a closest anchor to the `current`, if exists
return tickFractions
- .minByOrNull { abs(lerp(minPx, maxPx, it) - current) }
+ .fastMinByOrNull { abs(lerp(minPx, maxPx, it) - current) }
?.run { lerp(minPx, maxPx, this) }
?: current
}
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Snackbar.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Snackbar.kt
index 04bb5c5..29673c2 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Snackbar.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Snackbar.kt
@@ -35,6 +35,7 @@
import androidx.compose.ui.layout.layoutId
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastFirst
import kotlin.math.max
/**
@@ -305,11 +306,12 @@
end = HorizontalSpacingButtonSide
)
) { measurables, constraints ->
- val buttonPlaceable = measurables.first { it.layoutId == actionTag }.measure(constraints)
+ val buttonPlaceable = measurables.fastFirst { it.layoutId == actionTag }
+ .measure(constraints)
val textMaxWidth =
(constraints.maxWidth - buttonPlaceable.width - TextEndExtraSpacing.roundToPx())
.coerceAtLeast(constraints.minWidth)
- val textPlaceable = measurables.first { it.layoutId == textTag }.measure(
+ val textPlaceable = measurables.fastFirst { it.layoutId == textTag }.measure(
constraints.copy(minHeight = 0, maxWidth = textMaxWidth)
)
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/SnackbarHost.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/SnackbarHost.kt
index e03647a..f6e201e 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/SnackbarHost.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/SnackbarHost.kt
@@ -41,7 +41,10 @@
import androidx.compose.ui.semantics.dismiss
import androidx.compose.ui.semantics.liveRegion
import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.util.fastFilterNotNull
import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastMap
+import androidx.compose.ui.util.fastMapTo
import kotlin.coroutines.resume
import kotlinx.coroutines.CancellableContinuation
import kotlinx.coroutines.delay
@@ -262,17 +265,21 @@
val state = remember { FadeInFadeOutState<SnackbarData?>() }
if (current != state.current) {
state.current = current
- val keys = state.items.map { it.key }.toMutableList()
+ val keys = state.items.fastMap { it.key }.toMutableList()
if (!keys.contains(current)) {
keys.add(current)
}
state.items.clear()
- keys.filterNotNull().mapTo(state.items) { key ->
+ keys.fastFilterNotNull().fastMapTo(state.items) { key ->
FadeInFadeOutAnimationItem(key) { children ->
val isVisible = key == current
val duration = if (isVisible) SnackbarFadeInMillis else SnackbarFadeOutMillis
val delay = SnackbarFadeOutMillis + SnackbarInBetweenDelayMillis
- val animationDelay = if (isVisible && keys.filterNotNull().size != 1) delay else 0
+ val animationDelay = if (isVisible && keys.fastFilterNotNull().size != 1) {
+ delay
+ } else {
+ 0
+ }
val opacity = animatedOpacity(
animation = tween(
easing = LinearEasing,
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Swipeable.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Swipeable.kt
index fe11c44c..afacdfd 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Swipeable.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Swipeable.kt
@@ -54,6 +54,8 @@
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.Velocity
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastMaxBy
+import androidx.compose.ui.util.fastMinByOrNull
import androidx.compose.ui.util.lerp
import kotlin.math.PI
import kotlin.math.abs
@@ -747,8 +749,8 @@
anchors: Set<Float>
): List<Float> {
// Find the anchors the target lies between with a little bit of rounding error.
- val a = anchors.filter { it <= offset + 0.001 }.maxOrNull()
- val b = anchors.filter { it >= offset - 0.001 }.minOrNull()
+ val a = anchors.filter { it <= offset + 0.001 }.fastMaxBy { it }
+ val b = anchors.filter { it >= offset - 0.001 }.fastMinByOrNull { it }
return when {
a == null ->
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Tab.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Tab.kt
index db4e223..c41b10f 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Tab.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Tab.kt
@@ -51,6 +51,7 @@
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
+import androidx.compose.ui.util.fastFirst
import kotlin.math.max
/**
@@ -315,7 +316,7 @@
}
) { measurables, constraints ->
val textPlaceable = text?.let {
- measurables.first { it.layoutId == "text" }.measure(
+ measurables.fastFirst { it.layoutId == "text" }.measure(
// Measure with loose constraints for height as we don't want the text to take up more
// space than it needs
constraints.copy(minHeight = 0)
@@ -323,7 +324,7 @@
}
val iconPlaceable = icon?.let {
- measurables.first { it.layoutId == "icon" }.measure(constraints)
+ measurables.fastFirst { it.layoutId == "icon" }.measure(constraints)
}
val tabWidth = max(textPlaceable?.width ?: 0, iconPlaceable?.width ?: 0)
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TabRow.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TabRow.kt
index 78112ad2..8c83d9b 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TabRow.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TabRow.kt
@@ -49,6 +49,10 @@
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastForEachIndexed
+import androidx.compose.ui.util.fastMap
+import androidx.compose.ui.util.fastMaxBy
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
@@ -153,29 +157,29 @@
val tabMeasurables = subcompose(TabSlots.Tabs, tabs)
val tabCount = tabMeasurables.size
val tabWidth = (tabRowWidth / tabCount)
- val tabPlaceables = tabMeasurables.map {
+ val tabPlaceables = tabMeasurables.fastMap {
it.measure(constraints.copy(minWidth = tabWidth, maxWidth = tabWidth))
}
- val tabRowHeight = tabPlaceables.maxByOrNull { it.height }?.height ?: 0
+ val tabRowHeight = tabPlaceables.fastMaxBy { it.height }?.height ?: 0
val tabPositions = List(tabCount) { index ->
TabPosition(tabWidth.toDp() * index, tabWidth.toDp())
}
layout(tabRowWidth, tabRowHeight) {
- tabPlaceables.forEachIndexed { index, placeable ->
+ tabPlaceables.fastForEachIndexed { index, placeable ->
placeable.placeRelative(index * tabWidth, 0)
}
- subcompose(TabSlots.Divider, divider).forEach {
+ subcompose(TabSlots.Divider, divider).fastForEach {
val placeable = it.measure(constraints.copy(minHeight = 0))
placeable.placeRelative(0, tabRowHeight - placeable.height)
}
subcompose(TabSlots.Indicator) {
indicator(tabPositions)
- }.forEach {
+ }.fastForEach {
it.measure(Constraints.fixed(tabRowWidth, tabRowHeight)).placeRelative(0, 0)
}
}
@@ -263,11 +267,11 @@
val tabConstraints = constraints.copy(minWidth = minTabWidth)
val tabPlaceables = subcompose(TabSlots.Tabs, tabs)
- .map { it.measure(tabConstraints) }
+ .fastMap { it.measure(tabConstraints) }
var layoutWidth = padding * 2
var layoutHeight = 0
- tabPlaceables.forEach {
+ tabPlaceables.fastForEach {
layoutWidth += it.width
layoutHeight = maxOf(layoutHeight, it.height)
}
@@ -277,7 +281,7 @@
// Place the tabs
val tabPositions = mutableListOf<TabPosition>()
var left = padding
- tabPlaceables.forEach {
+ tabPlaceables.fastForEach {
it.placeRelative(left, 0)
tabPositions.add(TabPosition(left = left.toDp(), width = it.width.toDp()))
left += it.width
@@ -285,7 +289,7 @@
// The divider is measured with its own height, and width equal to the total width
// of the tab row, and then placed on top of the tabs.
- subcompose(TabSlots.Divider, divider).forEach {
+ subcompose(TabSlots.Divider, divider).fastForEach {
val placeable = it.measure(
constraints.copy(
minHeight = 0,
@@ -300,7 +304,7 @@
// row, and then placed on top of the divider.
subcompose(TabSlots.Indicator) {
indicator(tabPositions)
- }.forEach {
+ }.fastForEach {
it.measure(Constraints.fixed(layoutWidth, layoutHeight)).placeRelative(0, 0)
}
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt
index 473442e..a650cde 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt
@@ -62,6 +62,8 @@
import androidx.compose.ui.unit.coerceAtLeast
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.offset
+import androidx.compose.ui.util.fastFirst
+import androidx.compose.ui.util.fastFirstOrNull
import kotlin.math.max
import kotlin.math.roundToInt
@@ -559,13 +561,13 @@
// measure leading icon
val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
val leadingPlaceable =
- measurables.find { it.layoutId == LeadingId }?.measure(looseConstraints)
+ measurables.fastFirstOrNull { it.layoutId == LeadingId }?.measure(looseConstraints)
occupiedSpaceHorizontally += widthOrZero(
leadingPlaceable
)
// measure trailing icon
- val trailingPlaceable = measurables.find { it.layoutId == TrailingId }
+ val trailingPlaceable = measurables.fastFirstOrNull { it.layoutId == TrailingId }
?.measure(looseConstraints.offset(horizontal = -occupiedSpaceHorizontally))
occupiedSpaceHorizontally += widthOrZero(
trailingPlaceable
@@ -578,7 +580,7 @@
horizontal = -occupiedSpaceHorizontally
)
val labelPlaceable =
- measurables.find { it.layoutId == LabelId }?.measure(labelConstraints)
+ measurables.fastFirstOrNull { it.layoutId == LabelId }?.measure(labelConstraints)
val lastBaseline = labelPlaceable?.get(LastBaseline)?.let {
if (it != AlignmentLine.Unspecified) it else labelPlaceable.height
} ?: 0
@@ -598,13 +600,13 @@
horizontal = -occupiedSpaceHorizontally
)
val textFieldPlaceable = measurables
- .first { it.layoutId == TextFieldId }
+ .fastFirst { it.layoutId == TextFieldId }
.measure(textFieldConstraints)
// measure placeholder
val placeholderConstraints = textFieldConstraints.copy(minWidth = 0)
val placeholderPlaceable = measurables
- .find { it.layoutId == PlaceholderId }
+ .fastFirstOrNull { it.layoutId == PlaceholderId }
?.measure(placeholderConstraints)
val width = calculateWidth(
@@ -703,17 +705,17 @@
intrinsicMeasurer: (IntrinsicMeasurable, Int) -> Int
): Int {
val textFieldWidth =
- intrinsicMeasurer(measurables.first { it.layoutId == TextFieldId }, height)
- val labelWidth = measurables.find { it.layoutId == LabelId }?.let {
+ intrinsicMeasurer(measurables.fastFirst { it.layoutId == TextFieldId }, height)
+ val labelWidth = measurables.fastFirstOrNull { it.layoutId == LabelId }?.let {
intrinsicMeasurer(it, height)
} ?: 0
- val trailingWidth = measurables.find { it.layoutId == TrailingId }?.let {
+ val trailingWidth = measurables.fastFirstOrNull { it.layoutId == TrailingId }?.let {
intrinsicMeasurer(it, height)
} ?: 0
- val leadingWidth = measurables.find { it.layoutId == LeadingId }?.let {
+ val leadingWidth = measurables.fastFirstOrNull { it.layoutId == LeadingId }?.let {
intrinsicMeasurer(it, height)
} ?: 0
- val placeholderWidth = measurables.find { it.layoutId == PlaceholderId }?.let {
+ val placeholderWidth = measurables.fastFirstOrNull { it.layoutId == PlaceholderId }?.let {
intrinsicMeasurer(it, height)
} ?: 0
return calculateWidth(
@@ -732,22 +734,22 @@
intrinsicMeasurer: (IntrinsicMeasurable, Int) -> Int
): Int {
var remainingWidth = width
- val leadingHeight = measurables.find { it.layoutId == LeadingId }?.let {
+ val leadingHeight = measurables.fastFirstOrNull { it.layoutId == LeadingId }?.let {
remainingWidth -= it.maxIntrinsicWidth(Constraints.Infinity)
intrinsicMeasurer(it, width)
} ?: 0
- val trailingHeight = measurables.find { it.layoutId == TrailingId }?.let {
+ val trailingHeight = measurables.fastFirstOrNull { it.layoutId == TrailingId }?.let {
remainingWidth -= it.maxIntrinsicWidth(Constraints.Infinity)
intrinsicMeasurer(it, width)
} ?: 0
- val labelHeight = measurables.find { it.layoutId == LabelId }?.let {
+ val labelHeight = measurables.fastFirstOrNull { it.layoutId == LabelId }?.let {
intrinsicMeasurer(it, remainingWidth)
} ?: 0
val textFieldHeight =
- intrinsicMeasurer(measurables.first { it.layoutId == TextFieldId }, remainingWidth)
- val placeholderHeight = measurables.find { it.layoutId == PlaceholderId }?.let {
+ intrinsicMeasurer(measurables.fastFirst { it.layoutId == TextFieldId }, remainingWidth)
+ val placeholderHeight = measurables.fastFirstOrNull { it.layoutId == PlaceholderId }?.let {
intrinsicMeasurer(it, remainingWidth)
} ?: 0
diff --git a/compose/material3/material3-adaptive/lint-baseline.xml b/compose/material3/material3-adaptive/lint-baseline.xml
deleted file mode 100644
index 5820cd6..0000000
--- a/compose/material3/material3-adaptive/lint-baseline.xml
+++ /dev/null
@@ -1,220 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" foldingFeatures.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/androidMain/kotlin/androidx/compose/material3/adaptive/AndroidPosture.android.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val navigationPlaceables = navigationMeasurables.map { it.measure(constraints) }"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" }.filterNotNull()"
- errorLine2=" ~~~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" if (alignments.all { alignments[0] != it }) {"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val contentPlaceables = contentMeasurables.map { it.measure("
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" minHeight = layoutHeight - navigationPlaceables.maxOf { it.height },"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" maxHeight = layoutHeight - navigationPlaceables.maxOf { it.height }"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" minWidth = layoutWidth - navigationPlaceables.maxOf { it.width },"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" maxWidth = layoutWidth - navigationPlaceables.maxOf { it.width }"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" navigationPlaceables.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" contentPlaceables.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" it.placeRelative(navigationPlaceables.maxOf { it.width }, 0)"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" navigationPlaceables.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" layoutWidth - navigationPlaceables.maxOf { it.width },"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" contentPlaceables.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" navigationPlaceables.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" contentPlaceables.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" it.placeRelative(0, navigationPlaceables.maxOf { it.height })"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" contentPlaceables.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" navigationPlaceables.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" layoutHeight - navigationPlaceables.maxOf { it.height })"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" paneMeasurables.forEachIndexed { index, paneMeasurable ->"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffold.kt"/>
- </issue>
-
-</issues>
diff --git a/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/AndroidPosture.android.kt b/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/AndroidPosture.android.kt
index 4a461e2..629d238 100644
--- a/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/AndroidPosture.android.kt
+++ b/compose/material3/material3-adaptive/src/androidMain/kotlin/androidx/compose/material3/adaptive/AndroidPosture.android.kt
@@ -18,6 +18,7 @@
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.graphics.toComposeRect
+import androidx.compose.ui.util.fastForEach
import androidx.window.layout.FoldingFeature
/**
@@ -32,7 +33,7 @@
val separatingHingeBounds = mutableListOf<Rect>()
val occludingHingeBounds = mutableListOf<Rect>()
val allHingeBounds = mutableListOf<Rect>()
- foldingFeatures.forEach {
+ foldingFeatures.fastForEach {
if (it.orientation == FoldingFeature.Orientation.VERTICAL) {
hasVerticalHinge = true
}
diff --git a/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt b/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt
index 71a31c5..0629248 100644
--- a/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt
+++ b/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/NavigationSuiteScaffold.kt
@@ -59,7 +59,11 @@
import androidx.compose.ui.node.ParentDataModifierNode
import androidx.compose.ui.platform.InspectorInfo
import androidx.compose.ui.unit.Density
+import androidx.compose.ui.util.fastAll
+import androidx.compose.ui.util.fastFilterNotNull
+import androidx.compose.ui.util.fastForEach
import androidx.compose.ui.util.fastMap
+import androidx.compose.ui.util.fastMaxOfOrNull
/**
* The Navigation Suite Scaffold wraps the provided content and places the adequate provided
@@ -113,28 +117,28 @@
Layout(
contents = listOf({ NavigationSuiteScaffoldScopeImpl.navigationSuite() }, content)
) { (navigationMeasurables, contentMeasurables), constraints ->
- val navigationPlaceables = navigationMeasurables.map { it.measure(constraints) }
+ val navigationPlaceables = navigationMeasurables.fastMap { it.measure(constraints) }
val alignments = navigationPlaceables.fastMap {
(it.parentData as NavigationSuiteParentData).alignment
- }.filterNotNull()
- if (alignments.all { alignments[0] != it }) {
+ }.fastFilterNotNull()
+ if (alignments.fastAll { alignments[0] != it }) {
throw IllegalArgumentException("There should be only one NavigationSuiteAlignment.")
}
val alignment = alignments.firstOrNull() ?: NavigationSuiteAlignment.StartVertical
val layoutHeight = constraints.maxHeight
val layoutWidth = constraints.maxWidth
- val contentPlaceables = contentMeasurables.map { it.measure(
+ val contentPlaceables = contentMeasurables.fastMap { it.measure(
if (alignment == NavigationSuiteAlignment.TopHorizontal ||
alignment == NavigationSuiteAlignment.BottomHorizontal
) {
constraints.copy(
- minHeight = layoutHeight - navigationPlaceables.maxOf { it.height },
- maxHeight = layoutHeight - navigationPlaceables.maxOf { it.height }
+ minHeight = layoutHeight - navigationPlaceables.fastMaxOfOrNull { it.height }!!,
+ maxHeight = layoutHeight - navigationPlaceables.fastMaxOfOrNull { it.height }!!
)
} else {
constraints.copy(
- minWidth = layoutWidth - navigationPlaceables.maxOf { it.width },
- maxWidth = layoutWidth - navigationPlaceables.maxOf { it.width }
+ minWidth = layoutWidth - navigationPlaceables.fastMaxOfOrNull { it.width }!!,
+ maxWidth = layoutWidth - navigationPlaceables.fastMaxOfOrNull { it.width }!!
)
}
) }
@@ -143,50 +147,50 @@
when (alignment) {
NavigationSuiteAlignment.StartVertical -> {
// Place the navigation component at the start of the screen.
- navigationPlaceables.forEach {
+ navigationPlaceables.fastForEach {
it.placeRelative(0, 0)
}
// Place content to the side of the navigation component.
- contentPlaceables.forEach {
- it.placeRelative(navigationPlaceables.maxOf { it.width }, 0)
+ contentPlaceables.fastForEach {
+ it.placeRelative(navigationPlaceables.fastMaxOfOrNull { it.width }!!, 0)
}
}
NavigationSuiteAlignment.EndVertical -> {
// Place the navigation component at the end of the screen.
- navigationPlaceables.forEach {
+ navigationPlaceables.fastForEach {
it.placeRelative(
- layoutWidth - navigationPlaceables.maxOf { it.width },
+ layoutWidth - navigationPlaceables.fastMaxOfOrNull { it.width }!!,
0
)
}
// Place content at the start of the screen.
- contentPlaceables.forEach {
+ contentPlaceables.fastForEach {
it.placeRelative(0, 0)
}
}
NavigationSuiteAlignment.TopHorizontal -> {
// Place the navigation component at the start of the screen.
- navigationPlaceables.forEach {
+ navigationPlaceables.fastForEach {
it.placeRelative(0, 0)
}
// Place content below the navigation component.
- contentPlaceables.forEach {
- it.placeRelative(0, navigationPlaceables.maxOf { it.height })
+ contentPlaceables.fastForEach {
+ it.placeRelative(0, navigationPlaceables.fastMaxOfOrNull { it.height }!!)
}
}
NavigationSuiteAlignment.BottomHorizontal -> {
// Place content above the navigation component.
- contentPlaceables.forEach {
+ contentPlaceables.fastForEach {
it.placeRelative(0, 0)
}
// Place the navigation component at the bottom of the screen.
- navigationPlaceables.forEach {
+ navigationPlaceables.fastForEach {
it.placeRelative(
0,
- layoutHeight - navigationPlaceables.maxOf { it.height })
+ layoutHeight - navigationPlaceables.fastMaxOfOrNull { it.height }!!)
}
}
}
diff --git a/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffold.kt b/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffold.kt
index a75073e..3dcc396 100644
--- a/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffold.kt
+++ b/compose/material3/material3-adaptive/src/commonMain/kotlin/androidx/compose/material3/adaptive/ThreePaneScaffold.kt
@@ -29,6 +29,7 @@
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.roundToIntRect
import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastForEachIndexed
import kotlin.math.max
import kotlin.math.min
@@ -171,7 +172,7 @@
}
} else {
// Layout each pane in a physical partition
- paneMeasurables.forEachIndexed { index, paneMeasurable ->
+ paneMeasurables.fastForEachIndexed { index, paneMeasurable ->
measureAndPlacePane(layoutPhysicalPartitions[index], paneMeasurable)
}
}
@@ -252,12 +253,12 @@
} else if (allocatableWidth < totalPreferredWidth) {
// Scale down all panes to fit in the available space.
val scale = allocatableWidth.toFloat() / totalPreferredWidth
- measurables.forEach {
+ measurables.fastForEach {
it.measuredWidth = (it.measuredWidth * scale).toInt()
}
}
var positionX = partitionBounds.left
- measurables.forEach {
+ measurables.fastForEach {
it.measure(Constraints.fixed(it.measuredWidth, partitionBounds.height))
.place(positionX, partitionBounds.top)
positionX += it.measuredWidth + spacerSize
diff --git a/compose/material3/material3-window-size-class/build.gradle b/compose/material3/material3-window-size-class/build.gradle
index 76cbc23..ae8d2cd 100644
--- a/compose/material3/material3-window-size-class/build.gradle
+++ b/compose/material3/material3-window-size-class/build.gradle
@@ -37,6 +37,7 @@
commonMain {
dependencies {
implementation(libs.kotlinStdlibCommon)
+ implementation(project(":compose:ui:ui-util"))
api(project(":compose:runtime:runtime"))
api(project(":compose:ui:ui"))
api(project(":compose:ui:ui-unit"))
@@ -61,6 +62,7 @@
dependsOn(commonMain)
dependencies {
// Because dependencies are pinned in the android/common code.
+ implementation(project(":compose:ui:ui-util"))
api(project(":compose:runtime:runtime"))
api(project(":compose:ui:ui"))
api(project(":compose:ui:ui-unit"))
diff --git a/compose/material3/material3-window-size-class/lint-baseline.xml b/compose/material3/material3-window-size-class/lint-baseline.xml
deleted file mode 100644
index 6b8f7eb..0000000
--- a/compose/material3/material3-window-size-class/lint-baseline.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" sortedSizeClasses.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClass.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" sortedSizeClasses.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClass.kt"/>
- </issue>
-
-</issues>
diff --git a/compose/material3/material3-window-size-class/src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClass.kt b/compose/material3/material3-window-size-class/src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClass.kt
index 883916f..c6c3ef0 100644
--- a/compose/material3/material3-window-size-class/src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClass.kt
+++ b/compose/material3/material3-window-size-class/src/commonMain/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClass.kt
@@ -22,6 +22,7 @@
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastForEach
/**
* Window size classes are a set of opinionated viewport breakpoints to design, develop, and test
@@ -199,7 +200,7 @@
require(supportedSizeClasses.isNotEmpty()) { "Must support at least one size class" }
val sortedSizeClasses = supportedSizeClasses.sortedDescending()
// Find the largest supported size class that matches the width
- sortedSizeClasses.forEach {
+ sortedSizeClasses.fastForEach {
if (width >= with(density) { it.breakpoint().toPx() }) {
return it
}
@@ -297,7 +298,7 @@
require(supportedSizeClasses.isNotEmpty()) { "Must support at least one size class" }
val sortedSizeClasses = supportedSizeClasses.sortedDescending()
// Find the largest supported size class that matches the width
- sortedSizeClasses.forEach {
+ sortedSizeClasses.fastForEach {
if (height >= with(density) { it.breakpoint().toPx() }) {
return it
}
diff --git a/compose/material3/material3/lint-baseline.xml b/compose/material3/material3/lint-baseline.xml
index a60fd9f..787ecd3 100644
--- a/compose/material3/material3/lint-baseline.xml
+++ b/compose/material3/material3/lint-baseline.xml
@@ -173,1209 +173,12 @@
</issue>
<issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" sequences.add(0, currentSequence.toList())"
- errorLine2=" ~~~~~~">
+ id="ExperimentalPropertyAnnotation"
+ message="This property does not have all required annotations to correctly mark it as experimental."
+ errorLine1=" @ExperimentalMaterial3Api"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
- file="src/commonMain/kotlin/androidx/compose/material3/AlertDialog.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" for (measurable in measurables) {"
- errorLine2=" ~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/AlertDialog.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" sequences.forEachIndexed { i, placeables ->"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/AlertDialog.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" placeables.forEachIndexed { j, placeable ->"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/AlertDialog.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.first { it.layoutId == "navigationIcon" }"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/AppBar.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.first { it.layoutId == "actionIcons" }"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/AppBar.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.first { it.layoutId == "title" }"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/AppBar.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val badgePlaceable = measurables.first { it.layoutId == "badge" }.measure("
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Badge.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val anchorPlaceable = measurables.first { it.layoutId == "anchor" }.measure(constraints)"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Badge.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" dayNames.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/DatePicker.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" weekdays.drop(2).forEachIndexed { index, day ->"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/jvmMain/kotlin/androidx/compose/material3/LegacyCalendarModelImpl.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" ).map {"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/MenuPosition.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val x = xCandidates.firstOrNull {"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/MenuPosition.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" ).map {"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/MenuPosition.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val y = yCandidates.firstOrNull {"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/MenuPosition.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.first { it.layoutId == IconLayoutIdTag }.measure(looseConstraints)"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .first { it.layoutId == IndicatorRippleLayoutIdTag }"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .firstOrNull { it.layoutId == IndicatorLayoutIdTag }"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .first { it.layoutId == LabelLayoutIdTag }"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.first { it.layoutId == IconLayoutIdTag }.measure(looseConstraints)"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .first { it.layoutId == IndicatorRippleLayoutIdTag }"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .firstOrNull { it.layoutId == IndicatorLayoutIdTag }"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .first { it.layoutId == LabelLayoutIdTag }"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val leadingPlaceable = measurables.find {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val trailingPlaceable = measurables.find { it.layoutId == TrailingId }"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val prefixPlaceable = measurables.find { it.layoutId == PrefixId }"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val suffixPlaceable = measurables.find { it.layoutId == SuffixId }"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.find { it.layoutId == LabelId }?.measure(labelConstraints)"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val supportingMeasurable = measurables.find { it.layoutId == SupportingId }"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.first { it.layoutId == TextFieldId }.measure(textConstraints)"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.find { it.layoutId == PlaceholderId }?.measure(placeholderConstraints)"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val containerPlaceable = measurables.first { it.layoutId == ContainerId }.measure("
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" intrinsicMeasurer(measurables.first { it.layoutId == TextFieldId }, height)"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val labelWidth = measurables.find { it.layoutId == LabelId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val trailingWidth = measurables.find { it.layoutId == TrailingId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val leadingWidth = measurables.find { it.layoutId == LeadingId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val prefixWidth = measurables.find { it.layoutId == PrefixId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val suffixWidth = measurables.find { it.layoutId == SuffixId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val placeholderWidth = measurables.find { it.layoutId == PlaceholderId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val leadingHeight = measurables.find { it.layoutId == LeadingId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val trailingHeight = measurables.find { it.layoutId == TrailingId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val labelHeight = measurables.find { it.layoutId == LabelId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val prefixHeight = measurables.find { it.layoutId == PrefixId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val suffixHeight = measurables.find { it.layoutId == SuffixId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" intrinsicMeasurer(measurables.first { it.layoutId == TextFieldId }, remainingWidth)"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val placeholderHeight = measurables.find { it.layoutId == PlaceholderId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val supportingHeight = measurables.find { it.layoutId == SupportingId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val topBarPlaceables = subcompose(ScaffoldLayoutContent.TopBar, topBar).map {"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val topBarHeight = topBarPlaceables.maxByOrNull { it.height }?.height ?: 0"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val snackbarPlaceables = subcompose(ScaffoldLayoutContent.Snackbar, snackbar).map {"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val snackbarHeight = snackbarPlaceables.maxByOrNull { it.height }?.height ?: 0"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val snackbarWidth = snackbarPlaceables.maxByOrNull { it.width }?.width ?: 0"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" subcompose(ScaffoldLayoutContent.Fab, fab).mapNotNull { measurable ->"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val fabWidth = fabPlaceables.maxByOrNull { it.width }!!.width"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val fabHeight = fabPlaceables.maxByOrNull { it.height }!!.height"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" }.map { it.measure(looseConstraints) }"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val bottomBarHeight = bottomBarPlaceables.maxByOrNull { it.height }?.height"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" }.map { it.measure(looseConstraints) }"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" bodyContentPlaceables.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" topBarPlaceables.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" snackbarPlaceables.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" bottomBarPlaceables.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" fabPlaceables.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val iconPlaceables = iconMeasurables.map { it.measure(constraints) }"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/SegmentedButton.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val iconDesiredWidth = iconMeasurables.fold(0) { acc, it ->"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/SegmentedButton.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val contentPlaceables = contentMeasurables.map { it.measure(constraints) }"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/SegmentedButton.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" iconPlaceables.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/SegmentedButton.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" contentPlaceables.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/SegmentedButton.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val thumbPlaceable = measurables.first {"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Slider.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val trackPlaceable = measurables.first {"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Slider.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val startThumbPlaceable = measurables.first {"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Slider.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val endThumbPlaceable = measurables.first {"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Slider.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val trackPlaceable = measurables.first {"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Slider.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" list.map {"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Slider.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" list.map {"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Slider.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.firstOrNull { it.layoutId == actionTag }?.measure(constraints)"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Snackbar.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.firstOrNull { it.layoutId == dismissActionTag }?.measure(constraints)"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Snackbar.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val textPlaceable = measurables.first { it.layoutId == textTag }.measure("
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Snackbar.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val keys = state.items.map { it.key }.toMutableList()"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/SnackbarHost.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" keys.filterNotNull().mapTo(state.items) { key ->"
- errorLine2=" ~~~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/SnackbarHost.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" keys.filterNotNull().mapTo(state.items) { key ->"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/SnackbarHost.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val animationDelay = if (isVisible && keys.filterNotNull().size != 1) delay else 0"
- errorLine2=" ~~~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/SnackbarHost.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" state.items.forEach { (item, opacity) ->"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/SnackbarHost.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val a = anchors.filter { it <= offset + 0.001 }.maxOrNull()"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Swipeable.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val b = anchors.filter { it >= offset - 0.001 }.minOrNull()"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Swipeable.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.first { it.layoutId == "text" }.measure("
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Tab.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.first { it.layoutId == "icon" }.measure(constraints)"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/Tab.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val tabRowHeight = tabMeasurables.fold(initial = 0) { max, curr ->"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val tabPlaceables = tabMeasurables.map {"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" tabPlaceables.forEachIndexed { index, placeable ->"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" subcompose(TabSlots.Divider, divider).forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" }.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val layoutHeight = tabMeasurables.fold(initial = 0) { curr, measurable ->"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" tabMeasurables.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val layoutWidth = tabPlaceables.fold(initial = padding * 2) { curr, measurable ->"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" tabPlaceables.forEachIndexed { index, placeable ->"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" subcompose(TabSlots.Divider, divider).forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" }.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.find { it.layoutId == LeadingId }?.measure(looseConstraints)"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val trailingPlaceable = measurables.find { it.layoutId == TrailingId }"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val prefixPlaceable = measurables.find { it.layoutId == PrefixId }"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val suffixPlaceable = measurables.find { it.layoutId == SuffixId }"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" measurables.find { it.layoutId == LabelId }?.measure(labelConstraints)"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val supportingMeasurable = measurables.find { it.layoutId == SupportingId }"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .first { it.layoutId == TextFieldId }"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .find { it.layoutId == PlaceholderId }"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val containerPlaceable = measurables.first { it.layoutId == ContainerId }.measure("
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" intrinsicMeasurer(measurables.first { it.layoutId == TextFieldId }, height)"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val labelWidth = measurables.find { it.layoutId == LabelId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val trailingWidth = measurables.find { it.layoutId == TrailingId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val prefixWidth = measurables.find { it.layoutId == PrefixId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val suffixWidth = measurables.find { it.layoutId == SuffixId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val leadingWidth = measurables.find { it.layoutId == LeadingId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val placeholderWidth = measurables.find { it.layoutId == PlaceholderId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val leadingHeight = measurables.find { it.layoutId == LeadingId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val trailingHeight = measurables.find { it.layoutId == TrailingId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val labelHeight = measurables.find { it.layoutId == LabelId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val prefixHeight = measurables.find { it.layoutId == PrefixId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val suffixHeight = measurables.find { it.layoutId == SuffixId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" intrinsicMeasurer(measurables.first { it.layoutId == TextFieldId }, remainingWidth)"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val placeholderHeight = measurables.find { it.layoutId == PlaceholderId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val supportingHeight = measurables.find { it.layoutId == SupportingId }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TextField.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val spacer = measurables.first { it.layoutId == "Spacer" }"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val items = measurables.filter { it.layoutId != "Spacer" }.map { item ->"
- errorLine2=" ~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val items = measurables.filter { it.layoutId != "Spacer" }.map { item ->"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val spacer = measurables.first { it.layoutId == "Spacer" }"
- errorLine2=" ~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val items = measurables.filter { it.layoutId != "Spacer" }.map { item ->"
- errorLine2=" ~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val items = measurables.filter { it.layoutId != "Spacer" }.map { item ->"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val placeables = measurables.filter {"
- errorLine2=" ~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" }.map { measurable -> measurable.measure(itemConstraints) }"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val selectorMeasurable = measurables.find { it.layoutId == LayoutId.Selector }"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val innerMeasurable = measurables.find { it.layoutId == LayoutId.InnerCircle }"
- errorLine2=" ~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" placeables.forEachIndexed { i, it ->"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1="private val ExtraHours = Hours.map { (it % 12 + 12) }"
- errorLine2=" ~~~">
- <location
- file="src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt"/>
+ file="src/commonMain/kotlin/androidx/compose/material3/SwipeableV2.kt"/>
</issue>
<issue
@@ -1398,6 +201,15 @@
<issue
id="PrimitiveInLambda"
+ message="Use a functional interface instead of lambda syntax for lambdas with primitive values in method BottomSheetScaffoldAnchorChangeHandler has parameter 'animateTo' with type Function2<? super SheetValue, ? super Float, Unit>."
+ errorLine1=" animateTo: (target: SheetValue, velocity: Float) -> Unit,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/commonMain/kotlin/androidx/compose/material3/BottomSheetScaffold.kt"/>
+ </issue>
+
+ <issue
+ id="PrimitiveInLambda"
message="Use a functional interface instead of lambda syntax for lambdas with primitive values in method DateInputContent has parameter 'onDateSelectionChange' with type Function1<? super Long, Unit>."
errorLine1=" onDateSelectionChange: (dateInMillis: Long?) -> Unit,"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -1605,6 +417,24 @@
<issue
id="PrimitiveInLambda"
+ message="Use a functional interface instead of lambda syntax for lambdas with primitive values in method modalBottomSheetSwipeable has parameter 'onDragStopped' with type Function2<? super CoroutineScope, ? super Float, Unit>."
+ errorLine1=" onDragStopped: CoroutineScope.(velocity: Float) -> Unit,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/androidMain/kotlin/androidx/compose/material3/ModalBottomSheet.android.kt"/>
+ </issue>
+
+ <issue
+ id="PrimitiveInLambda"
+ message="Use a functional interface instead of lambda syntax for lambdas with primitive values in method ModalBottomSheetAnchorChangeHandler has parameter 'animateTo' with type Function2<? super SheetValue, ? super Float, Unit>."
+ errorLine1=" animateTo: (target: SheetValue, velocity: Float) -> Unit,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/androidMain/kotlin/androidx/compose/material3/ModalBottomSheet.android.kt"/>
+ </issue>
+
+ <issue
+ id="PrimitiveInLambda"
message="Use a functional interface instead of lambda syntax for lambdas with primitive values in method Scrim has parameter 'fraction' with type Function0<Float>."
errorLine1=" fraction: () -> Float,"
errorLine2=" ~~~~~~~~~~~">
@@ -1848,6 +678,15 @@
<issue
id="PrimitiveInLambda"
+ message="Use a functional interface instead of lambda syntax for lambdas with primitive values in method swipeAnchors has parameter 'calculateAnchor' with type Function2<? super T, ? super IntSize, Float>."
+ errorLine1=" calculateAnchor: (value: T, layoutSize: IntSize) -> Float?,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/commonMain/kotlin/androidx/compose/material3/SwipeableV2.kt"/>
+ </issue>
+
+ <issue
+ id="PrimitiveInLambda"
message="Use a functional interface instead of lambda syntax for lambdas with primitive values in variable 'valueToOffset' with type Function1<? super Boolean, ? extends Float>."
errorLine1=" val valueToOffset = remember<(Boolean) -> Float>(minBound, maxBound) {"
errorLine2=" ^">
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AlertDialog.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AlertDialog.kt
index 62a0006..d1f7e33 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AlertDialog.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AlertDialog.kt
@@ -32,6 +32,8 @@
import androidx.compose.ui.layout.Placeable
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastForEachIndexed
import kotlin.math.max
@Composable
@@ -150,6 +152,7 @@
crossAxisSpace += crossAxisSpacing.roundToPx()
}
// Ensures that confirming actions appear above dismissive actions.
+ @Suppress("ListIterator")
sequences.add(0, currentSequence.toList())
crossAxisSizes += currentCrossAxisSize
crossAxisPositions += crossAxisSpace
@@ -162,7 +165,7 @@
currentCrossAxisSize = 0
}
- for (measurable in measurables) {
+ measurables.fastForEach { measurable ->
// Ask the child for its preferred size.
val placeable = measurable.measure(constraints)
@@ -189,7 +192,7 @@
val layoutHeight = crossAxisLayoutSize
layout(layoutWidth, layoutHeight) {
- sequences.forEachIndexed { i, placeables ->
+ sequences.fastForEachIndexed { i, placeables ->
val childrenMainAxisSizes = IntArray(placeables.size) { j ->
placeables[j].width +
if (j < placeables.lastIndex) mainAxisSpacing.roundToPx() else 0
@@ -200,7 +203,7 @@
arrange(mainAxisLayoutSize, childrenMainAxisSizes,
layoutDirection, mainAxisPositions)
}
- placeables.forEachIndexed { j, placeable ->
+ placeables.fastForEachIndexed { j, placeable ->
placeable.place(
x = mainAxisPositions[j],
y = crossAxisPositions[i]
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt
index c63eeb4..cd79a42 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt
@@ -81,6 +81,7 @@
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.Velocity
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastFirst
import kotlin.math.abs
import kotlin.math.max
import kotlin.math.roundToInt
@@ -1346,10 +1347,10 @@
modifier = modifier
) { measurables, constraints ->
val navigationIconPlaceable =
- measurables.first { it.layoutId == "navigationIcon" }
+ measurables.fastFirst { it.layoutId == "navigationIcon" }
.measure(constraints.copy(minWidth = 0))
val actionIconsPlaceable =
- measurables.first { it.layoutId == "actionIcons" }
+ measurables.fastFirst { it.layoutId == "actionIcons" }
.measure(constraints.copy(minWidth = 0))
val maxTitleWidth = if (constraints.maxWidth == Constraints.Infinity) {
@@ -1359,7 +1360,7 @@
.coerceAtLeast(0)
}
val titlePlaceable =
- measurables.first { it.layoutId == "title" }
+ measurables.fastFirst { it.layoutId == "title" }
.measure(constraints.copy(minWidth = 0, maxWidth = maxTitleWidth))
// Locate the title's baseline.
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Badge.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Badge.kt
index bc2ff8e..81f545c 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Badge.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Badge.kt
@@ -42,6 +42,7 @@
import androidx.compose.ui.layout.layoutId
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastFirst
import kotlin.math.roundToInt
/**
@@ -103,13 +104,13 @@
}
) { measurables, constraints ->
- val badgePlaceable = measurables.first { it.layoutId == "badge" }.measure(
+ val badgePlaceable = measurables.fastFirst { it.layoutId == "badge" }.measure(
// Measure with loose constraints for height as we don't want the text to take up more
// space than it needs.
constraints.copy(minHeight = 0)
)
- val anchorPlaceable = measurables.first { it.layoutId == "anchor" }.measure(constraints)
+ val anchorPlaceable = measurables.fastFirst { it.layoutId == "anchor" }.measure(constraints)
val firstBaseline = anchorPlaceable[FirstBaseline]
val lastBaseline = anchorPlaceable[LastBaseline]
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DatePicker.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DatePicker.kt
index 00c2306..a2f3885 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DatePicker.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/DatePicker.kt
@@ -110,6 +110,7 @@
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastForEach
import kotlin.math.max
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
@@ -1568,7 +1569,7 @@
horizontalArrangement = Arrangement.SpaceEvenly,
verticalAlignment = Alignment.CenterVertically
) {
- for (it in dayNames) {
+ dayNames.fastForEach {
Box(
modifier = Modifier
.clearAndSetSemantics { contentDescription = it.first }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/MenuPosition.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/MenuPosition.kt
index 7167832..5853b39 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/MenuPosition.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/MenuPosition.kt
@@ -26,6 +26,8 @@
import androidx.compose.ui.unit.IntRect
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.util.fastFirstOrNull
+import androidx.compose.ui.util.fastMap
import androidx.compose.ui.window.PopupPositionProvider
/**
@@ -366,7 +368,7 @@
} else {
rightToWindowRight
}
- ).map {
+ ).fastMap {
it.position(
anchorBounds = anchorBounds,
windowSize = windowSize,
@@ -374,7 +376,7 @@
layoutDirection = layoutDirection
)
}
- val x = xCandidates.firstOrNull {
+ val x = xCandidates.fastFirstOrNull {
it >= 0 && it + popupContentSize.width <= windowSize.width
} ?: xCandidates.last()
@@ -387,14 +389,14 @@
} else {
bottomToWindowBottom
}
- ).map {
+ ).fastMap {
it.position(
anchorBounds = anchorBounds,
windowSize = windowSize,
menuHeight = popupContentSize.height
)
}
- val y = yCandidates.firstOrNull {
+ val y = yCandidates.fastFirstOrNull {
it >= verticalMargin &&
it + popupContentSize.height <= windowSize.height - verticalMargin
} ?: yCandidates.last()
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
index a6c347d..169f74d 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
@@ -65,6 +65,8 @@
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.constrainHeight
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastFirst
+import androidx.compose.ui.util.fastFirstOrNull
import kotlin.math.roundToInt
/**
@@ -468,14 +470,14 @@
}) { measurables, constraints ->
val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
val iconPlaceable =
- measurables.first { it.layoutId == IconLayoutIdTag }.measure(looseConstraints)
+ measurables.fastFirst { it.layoutId == IconLayoutIdTag }.measure(looseConstraints)
val totalIndicatorWidth = iconPlaceable.width + (IndicatorHorizontalPadding * 2).roundToPx()
val animatedIndicatorWidth = (totalIndicatorWidth * animationProgress).roundToInt()
val indicatorHeight = iconPlaceable.height + (IndicatorVerticalPadding * 2).roundToPx()
val indicatorRipplePlaceable =
measurables
- .first { it.layoutId == IndicatorRippleLayoutIdTag }
+ .fastFirst { it.layoutId == IndicatorRippleLayoutIdTag }
.measure(
Constraints.fixed(
width = totalIndicatorWidth,
@@ -484,7 +486,7 @@
)
val indicatorPlaceable =
measurables
- .firstOrNull { it.layoutId == IndicatorLayoutIdTag }
+ .fastFirstOrNull { it.layoutId == IndicatorLayoutIdTag }
?.measure(
Constraints.fixed(
width = animatedIndicatorWidth,
@@ -495,7 +497,7 @@
val labelPlaceable =
label?.let {
measurables
- .first { it.layoutId == LabelLayoutIdTag }
+ .fastFirst { it.layoutId == LabelLayoutIdTag }
.measure(looseConstraints)
}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt
index d5caf4e..dff1aad 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt
@@ -66,6 +66,8 @@
import androidx.compose.ui.unit.constrainHeight
import androidx.compose.ui.unit.constrainWidth
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastFirst
+import androidx.compose.ui.util.fastFirstOrNull
import kotlin.math.roundToInt
/**
@@ -465,7 +467,7 @@
}) { measurables, constraints ->
val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
val iconPlaceable =
- measurables.first { it.layoutId == IconLayoutIdTag }.measure(looseConstraints)
+ measurables.fastFirst { it.layoutId == IconLayoutIdTag }.measure(looseConstraints)
val totalIndicatorWidth = iconPlaceable.width + (IndicatorHorizontalPadding * 2).roundToPx()
val animatedIndicatorWidth = (totalIndicatorWidth * animationProgress).roundToInt()
@@ -478,7 +480,7 @@
val indicatorRipplePlaceable =
measurables
- .first { it.layoutId == IndicatorRippleLayoutIdTag }
+ .fastFirst { it.layoutId == IndicatorRippleLayoutIdTag }
.measure(
Constraints.fixed(
width = totalIndicatorWidth,
@@ -487,7 +489,7 @@
)
val indicatorPlaceable =
measurables
- .firstOrNull { it.layoutId == IndicatorLayoutIdTag }
+ .fastFirstOrNull { it.layoutId == IndicatorLayoutIdTag }
?.measure(
Constraints.fixed(
width = animatedIndicatorWidth,
@@ -498,7 +500,7 @@
val labelPlaceable =
label?.let {
measurables
- .first { it.layoutId == LabelLayoutIdTag }
+ .fastFirst { it.layoutId == LabelLayoutIdTag }
.measure(looseConstraints)
}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt
index 9dfb9eac..25b024d 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/OutlinedTextField.kt
@@ -65,6 +65,8 @@
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.lerp
import androidx.compose.ui.unit.offset
+import androidx.compose.ui.util.fastFirst
+import androidx.compose.ui.util.fastFirstOrNull
import androidx.compose.ui.util.lerp
import kotlin.math.max
import kotlin.math.roundToInt
@@ -648,26 +650,26 @@
val relaxedConstraints = constraints.copy(minWidth = 0, minHeight = 0)
// measure leading icon
- val leadingPlaceable = measurables.find {
+ val leadingPlaceable = measurables.fastFirstOrNull {
it.layoutId == LeadingId
}?.measure(relaxedConstraints)
occupiedSpaceHorizontally += widthOrZero(leadingPlaceable)
occupiedSpaceVertically = max(occupiedSpaceVertically, heightOrZero(leadingPlaceable))
// measure trailing icon
- val trailingPlaceable = measurables.find { it.layoutId == TrailingId }
+ val trailingPlaceable = measurables.fastFirstOrNull { it.layoutId == TrailingId }
?.measure(relaxedConstraints.offset(horizontal = -occupiedSpaceHorizontally))
occupiedSpaceHorizontally += widthOrZero(trailingPlaceable)
occupiedSpaceVertically = max(occupiedSpaceVertically, heightOrZero(trailingPlaceable))
// measure prefix
- val prefixPlaceable = measurables.find { it.layoutId == PrefixId }
+ val prefixPlaceable = measurables.fastFirstOrNull { it.layoutId == PrefixId }
?.measure(relaxedConstraints.offset(horizontal = -occupiedSpaceHorizontally))
occupiedSpaceHorizontally += widthOrZero(prefixPlaceable)
occupiedSpaceVertically = max(occupiedSpaceVertically, heightOrZero(prefixPlaceable))
// measure suffix
- val suffixPlaceable = measurables.find { it.layoutId == SuffixId }
+ val suffixPlaceable = measurables.fastFirstOrNull { it.layoutId == SuffixId }
?.measure(relaxedConstraints.offset(horizontal = -occupiedSpaceHorizontally))
occupiedSpaceHorizontally += widthOrZero(suffixPlaceable)
occupiedSpaceVertically = max(occupiedSpaceVertically, heightOrZero(suffixPlaceable))
@@ -685,14 +687,14 @@
vertical = -bottomPadding
)
val labelPlaceable =
- measurables.find { it.layoutId == LabelId }?.measure(labelConstraints)
+ measurables.fastFirstOrNull { it.layoutId == LabelId }?.measure(labelConstraints)
labelPlaceable?.let {
onLabelMeasured(Size(it.width.toFloat(), it.height.toFloat()))
}
// supporting text must be measured after other elements, but we
// reserve space for it using its intrinsic height as a heuristic
- val supportingMeasurable = measurables.find { it.layoutId == SupportingId }
+ val supportingMeasurable = measurables.fastFirstOrNull { it.layoutId == SupportingId }
val supportingIntrinsicHeight =
supportingMeasurable?.minIntrinsicHeight(constraints.minWidth) ?: 0
@@ -706,12 +708,12 @@
vertical = -bottomPadding - topPadding - supportingIntrinsicHeight
).copy(minHeight = 0)
val textFieldPlaceable =
- measurables.first { it.layoutId == TextFieldId }.measure(textConstraints)
+ measurables.fastFirst { it.layoutId == TextFieldId }.measure(textConstraints)
// measure placeholder
val placeholderConstraints = textConstraints.copy(minWidth = 0)
- val placeholderPlaceable =
- measurables.find { it.layoutId == PlaceholderId }?.measure(placeholderConstraints)
+ val placeholderPlaceable = measurables.fastFirstOrNull { it.layoutId == PlaceholderId }
+ ?.measure(placeholderConstraints)
occupiedSpaceVertically = max(
occupiedSpaceVertically,
@@ -758,7 +760,7 @@
)
val height = totalHeight - supportingHeight
- val containerPlaceable = measurables.first { it.layoutId == ContainerId }.measure(
+ val containerPlaceable = measurables.fastFirst { it.layoutId == ContainerId }.measure(
Constraints(
minWidth = if (width != Constraints.Infinity) width else 0,
maxWidth = width,
@@ -830,23 +832,23 @@
intrinsicMeasurer: (IntrinsicMeasurable, Int) -> Int
): Int {
val textFieldWidth =
- intrinsicMeasurer(measurables.first { it.layoutId == TextFieldId }, height)
- val labelWidth = measurables.find { it.layoutId == LabelId }?.let {
+ intrinsicMeasurer(measurables.fastFirst { it.layoutId == TextFieldId }, height)
+ val labelWidth = measurables.fastFirstOrNull { it.layoutId == LabelId }?.let {
intrinsicMeasurer(it, height)
} ?: 0
- val trailingWidth = measurables.find { it.layoutId == TrailingId }?.let {
+ val trailingWidth = measurables.fastFirstOrNull { it.layoutId == TrailingId }?.let {
intrinsicMeasurer(it, height)
} ?: 0
- val leadingWidth = measurables.find { it.layoutId == LeadingId }?.let {
+ val leadingWidth = measurables.fastFirstOrNull { it.layoutId == LeadingId }?.let {
intrinsicMeasurer(it, height)
} ?: 0
- val prefixWidth = measurables.find { it.layoutId == PrefixId }?.let {
+ val prefixWidth = measurables.fastFirstOrNull { it.layoutId == PrefixId }?.let {
intrinsicMeasurer(it, height)
} ?: 0
- val suffixWidth = measurables.find { it.layoutId == SuffixId }?.let {
+ val suffixWidth = measurables.fastFirstOrNull { it.layoutId == SuffixId }?.let {
intrinsicMeasurer(it, height)
} ?: 0
- val placeholderWidth = measurables.find { it.layoutId == PlaceholderId }?.let {
+ val placeholderWidth = measurables.fastFirstOrNull { it.layoutId == PlaceholderId }?.let {
intrinsicMeasurer(it, height)
} ?: 0
return calculateWidth(
@@ -870,38 +872,38 @@
intrinsicMeasurer: (IntrinsicMeasurable, Int) -> Int
): Int {
var remainingWidth = width
- val leadingHeight = measurables.find { it.layoutId == LeadingId }?.let {
+ val leadingHeight = measurables.fastFirstOrNull { it.layoutId == LeadingId }?.let {
remainingWidth -= it.maxIntrinsicWidth(Constraints.Infinity)
intrinsicMeasurer(it, width)
} ?: 0
- val trailingHeight = measurables.find { it.layoutId == TrailingId }?.let {
+ val trailingHeight = measurables.fastFirstOrNull { it.layoutId == TrailingId }?.let {
remainingWidth -= it.maxIntrinsicWidth(Constraints.Infinity)
intrinsicMeasurer(it, width)
} ?: 0
- val labelHeight = measurables.find { it.layoutId == LabelId }?.let {
+ val labelHeight = measurables.fastFirstOrNull { it.layoutId == LabelId }?.let {
intrinsicMeasurer(it, lerp(remainingWidth, width, animationProgress))
} ?: 0
- val prefixHeight = measurables.find { it.layoutId == PrefixId }?.let {
+ val prefixHeight = measurables.fastFirstOrNull { it.layoutId == PrefixId }?.let {
val height = intrinsicMeasurer(it, remainingWidth)
remainingWidth -= it.maxIntrinsicWidth(Constraints.Infinity)
height
} ?: 0
- val suffixHeight = measurables.find { it.layoutId == SuffixId }?.let {
+ val suffixHeight = measurables.fastFirstOrNull { it.layoutId == SuffixId }?.let {
val height = intrinsicMeasurer(it, remainingWidth)
remainingWidth -= it.maxIntrinsicWidth(Constraints.Infinity)
height
} ?: 0
val textFieldHeight =
- intrinsicMeasurer(measurables.first { it.layoutId == TextFieldId }, remainingWidth)
+ intrinsicMeasurer(measurables.fastFirst { it.layoutId == TextFieldId }, remainingWidth)
- val placeholderHeight = measurables.find { it.layoutId == PlaceholderId }?.let {
+ val placeholderHeight = measurables.fastFirstOrNull { it.layoutId == PlaceholderId }?.let {
intrinsicMeasurer(it, remainingWidth)
} ?: 0
- val supportingHeight = measurables.find { it.layoutId == SupportingId }?.let {
+ val supportingHeight = measurables.fastFirstOrNull { it.layoutId == SupportingId }?.let {
intrinsicMeasurer(it, width)
} ?: 0
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
index 355aae6..b346d44 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
@@ -35,6 +35,10 @@
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.offset
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastMap
+import androidx.compose.ui.util.fastMapNotNull
+import androidx.compose.ui.util.fastMaxBy
/**
* <a href="https://material.io/design/layout/understanding-layout.html" class="external" target="_blank">Material Design layout</a>.
@@ -139,13 +143,13 @@
val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
- val topBarPlaceables = subcompose(ScaffoldLayoutContent.TopBar, topBar).map {
+ val topBarPlaceables = subcompose(ScaffoldLayoutContent.TopBar, topBar).fastMap {
it.measure(looseConstraints)
}
- val topBarHeight = topBarPlaceables.maxByOrNull { it.height }?.height ?: 0
+ val topBarHeight = topBarPlaceables.fastMaxBy { it.height }?.height ?: 0
- val snackbarPlaceables = subcompose(ScaffoldLayoutContent.Snackbar, snackbar).map {
+ val snackbarPlaceables = subcompose(ScaffoldLayoutContent.Snackbar, snackbar).fastMap {
// respect only bottom and horizontal for snackbar and fab
val leftInset = contentWindowInsets
.getLeft(this@SubcomposeLayout, layoutDirection)
@@ -161,11 +165,11 @@
)
}
- val snackbarHeight = snackbarPlaceables.maxByOrNull { it.height }?.height ?: 0
- val snackbarWidth = snackbarPlaceables.maxByOrNull { it.width }?.width ?: 0
+ val snackbarHeight = snackbarPlaceables.fastMaxBy { it.height }?.height ?: 0
+ val snackbarWidth = snackbarPlaceables.fastMaxBy { it.width }?.width ?: 0
val fabPlaceables =
- subcompose(ScaffoldLayoutContent.Fab, fab).mapNotNull { measurable ->
+ subcompose(ScaffoldLayoutContent.Fab, fab).fastMapNotNull { measurable ->
// respect only bottom and horizontal for snackbar and fab
val leftInset =
contentWindowInsets.getLeft(this@SubcomposeLayout, layoutDirection)
@@ -182,8 +186,8 @@
}
val fabPlacement = if (fabPlaceables.isNotEmpty()) {
- val fabWidth = fabPlaceables.maxByOrNull { it.width }!!.width
- val fabHeight = fabPlaceables.maxByOrNull { it.height }!!.height
+ val fabWidth = fabPlaceables.fastMaxBy { it.width }!!.width
+ val fabHeight = fabPlaceables.fastMaxBy { it.height }!!.height
// FAB distance from the left of the layout, taking into account LTR / RTL
val fabLeftOffset = when (fabPosition) {
FabPosition.Start -> {
@@ -217,9 +221,9 @@
LocalFabPlacement provides fabPlacement,
content = bottomBar
)
- }.map { it.measure(looseConstraints) }
+ }.fastMap { it.measure(looseConstraints) }
- val bottomBarHeight = bottomBarPlaceables.maxByOrNull { it.height }?.height
+ val bottomBarHeight = bottomBarPlaceables.fastMaxBy { it.height }?.height
val fabOffsetFromBottom = fabPlacement?.let {
if (bottomBarHeight == null) {
it.height + FabSpacing.roundToPx() +
@@ -258,18 +262,18 @@
end = insets.calculateEndPadding((this@SubcomposeLayout).layoutDirection)
)
content(innerPadding)
- }.map { it.measure(looseConstraints) }
+ }.fastMap { it.measure(looseConstraints) }
layout(layoutWidth, layoutHeight) {
// Placing to control drawing order to match default elevation of each placeable
- bodyContentPlaceables.forEach {
+ bodyContentPlaceables.fastForEach {
it.place(0, 0)
}
- topBarPlaceables.forEach {
+ topBarPlaceables.fastForEach {
it.place(0, 0)
}
- snackbarPlaceables.forEach {
+ snackbarPlaceables.fastForEach {
it.place(
(layoutWidth - snackbarWidth) / 2 +
contentWindowInsets.getLeft(this@SubcomposeLayout, layoutDirection),
@@ -277,12 +281,12 @@
)
}
// The bottom bar is always at the bottom of the layout
- bottomBarPlaceables.forEach {
+ bottomBarPlaceables.fastForEach {
it.place(0, layoutHeight - (bottomBarHeight ?: 0))
}
// Explicitly not using placeRelative here as `leftOffset` already accounts for RTL
fabPlacement?.let { placement ->
- fabPlaceables.forEach {
+ fabPlaceables.fastForEach {
it.place(placement.left, layoutHeight - fabOffsetFromBottom!!)
}
}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SegmentedButton.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SegmentedButton.kt
index 8c6bb95..860b1a8 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SegmentedButton.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SegmentedButton.kt
@@ -79,6 +79,9 @@
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastFold
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastMap
import androidx.compose.ui.util.fastMaxBy
import kotlinx.coroutines.launch
@@ -323,12 +326,12 @@
val scope = rememberCoroutineScope()
Layout(listOf(icon, content)) { (iconMeasurables, contentMeasurables), constraints ->
- val iconPlaceables = iconMeasurables.map { it.measure(constraints) }
- val iconDesiredWidth = iconMeasurables.fold(0) { acc, it ->
+ val iconPlaceables = iconMeasurables.fastMap { it.measure(constraints) }
+ val iconDesiredWidth = iconMeasurables.fastFold(0) { acc, it ->
maxOf(acc, it.maxIntrinsicWidth(Constraints.Infinity))
}
val iconWidth = iconPlaceables.fastMaxBy { it.width }?.width ?: 0
- val contentPlaceables = contentMeasurables.map { it.measure(constraints) }
+ val contentPlaceables = contentMeasurables.fastMap { it.measure(constraints) }
val contentWidth = contentPlaceables.fastMaxBy { it.width }?.width
val width = maxOf(SegmentedButtonDefaults.IconSize.roundToPx(), iconDesiredWidth) +
IconSpacing.roundToPx() +
@@ -350,14 +353,14 @@
}
layout(width, constraints.maxHeight) {
- iconPlaceables.forEach {
+ iconPlaceables.fastForEach {
it.place(0, (constraints.maxHeight - it.height) / 2)
}
val contentOffsetX = SegmentedButtonDefaults.IconSize.roundToPx() +
IconSpacing.roundToPx() + anim.value
- contentPlaceables.forEach {
+ contentPlaceables.fastForEach {
it.place(contentOffsetX, (constraints.maxHeight - it.height) / 2)
}
}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Slider.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Slider.kt
index 8f3afa4..5aa3895 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Slider.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Slider.kt
@@ -86,6 +86,8 @@
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.offset
+import androidx.compose.ui.util.fastFirst
+import androidx.compose.ui.util.fastMap
import androidx.compose.ui.util.lerp
import androidx.compose.ui.util.packFloats
import androidx.compose.ui.util.unpackFloat1
@@ -712,11 +714,11 @@
.then(drag)
) { measurables, constraints ->
- val thumbPlaceable = measurables.first {
+ val thumbPlaceable = measurables.fastFirst {
it.layoutId == SliderComponents.THUMB
}.measure(constraints)
- val trackPlaceable = measurables.first {
+ val trackPlaceable = measurables.fastFirst {
it.layoutId == SliderComponents.TRACK
}.measure(
constraints.offset(
@@ -807,19 +809,19 @@
)
.then(pressDrag)
) { measurables, constraints ->
- val startThumbPlaceable = measurables.first {
+ val startThumbPlaceable = measurables.fastFirst {
it.layoutId == RangeSliderComponents.STARTTHUMB
}.measure(
constraints
)
- val endThumbPlaceable = measurables.first {
+ val endThumbPlaceable = measurables.fastFirst {
it.layoutId == RangeSliderComponents.ENDTHUMB
}.measure(
constraints
)
- val trackPlaceable = measurables.first {
+ val trackPlaceable = measurables.fastFirst {
it.layoutId == RangeSliderComponents.TRACK
}.measure(
constraints.offset(
@@ -1072,7 +1074,7 @@
it < sliderPositions.activeRange.start
}.forEach { (outsideFraction, list) ->
drawPoints(
- list.map {
+ list.fastMap {
Offset(lerp(sliderStart, sliderEnd, it).x, center.y)
},
PointMode.Points,
@@ -1211,7 +1213,7 @@
it < activeRangeStart
}.forEach { (outsideFraction, list) ->
drawPoints(
- list.map {
+ list.fastMap {
Offset(lerp(sliderStart, sliderEnd, it).x, center.y)
},
PointMode.Points,
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Snackbar.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Snackbar.kt
index fa89582..771613c 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Snackbar.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Snackbar.kt
@@ -39,6 +39,8 @@
import androidx.compose.ui.layout.layoutId
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastFirst
+import androidx.compose.ui.util.fastFirstOrNull
import kotlin.math.max
import kotlin.math.min
@@ -333,9 +335,9 @@
) { measurables, constraints ->
val containerWidth = min(constraints.maxWidth, ContainerMaxWidth.roundToPx())
val actionButtonPlaceable =
- measurables.firstOrNull { it.layoutId == actionTag }?.measure(constraints)
+ measurables.fastFirstOrNull { it.layoutId == actionTag }?.measure(constraints)
val dismissButtonPlaceable =
- measurables.firstOrNull { it.layoutId == dismissActionTag }?.measure(constraints)
+ measurables.fastFirstOrNull { it.layoutId == dismissActionTag }?.measure(constraints)
val actionButtonWidth = actionButtonPlaceable?.width ?: 0
val actionButtonHeight = actionButtonPlaceable?.height ?: 0
val dismissButtonWidth = dismissButtonPlaceable?.width ?: 0
@@ -344,7 +346,7 @@
val textMaxWidth =
(containerWidth - actionButtonWidth - dismissButtonWidth - extraSpacingWidth)
.coerceAtLeast(constraints.minWidth)
- val textPlaceable = measurables.first { it.layoutId == textTag }.measure(
+ val textPlaceable = measurables.fastFirst { it.layoutId == textTag }.measure(
constraints.copy(minHeight = 0, maxWidth = textMaxWidth)
)
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SnackbarHost.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SnackbarHost.kt
index dce3b38..dfd2279 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SnackbarHost.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SnackbarHost.kt
@@ -41,6 +41,10 @@
import androidx.compose.ui.semantics.dismiss
import androidx.compose.ui.semantics.liveRegion
import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.util.fastFilterNotNull
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastMap
+import androidx.compose.ui.util.fastMapTo
import kotlin.coroutines.resume
import kotlinx.coroutines.CancellableContinuation
import kotlinx.coroutines.delay
@@ -344,17 +348,21 @@
val state = remember { FadeInFadeOutState<SnackbarData?>() }
if (current != state.current) {
state.current = current
- val keys = state.items.map { it.key }.toMutableList()
+ val keys = state.items.fastMap { it.key }.toMutableList()
if (!keys.contains(current)) {
keys.add(current)
}
state.items.clear()
- keys.filterNotNull().mapTo(state.items) { key ->
+ keys.fastFilterNotNull().fastMapTo(state.items) { key ->
FadeInFadeOutAnimationItem(key) { children ->
val isVisible = key == current
val duration = if (isVisible) SnackbarFadeInMillis else SnackbarFadeOutMillis
val delay = SnackbarFadeOutMillis + SnackbarInBetweenDelayMillis
- val animationDelay = if (isVisible && keys.filterNotNull().size != 1) delay else 0
+ val animationDelay = if (isVisible && keys.fastFilterNotNull().size != 1) {
+ delay
+ } else {
+ 0
+ }
val opacity = animatedOpacity(
animation = tween(
easing = LinearEasing,
@@ -397,7 +405,7 @@
}
Box(modifier) {
state.scope = currentRecomposeScope
- state.items.forEach { (item, opacity) ->
+ state.items.fastForEach { (item, opacity) ->
key(item) {
opacity {
content(item!!)
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Swipeable.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Swipeable.kt
index f06b0e3..73e1b1e 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Swipeable.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Swipeable.kt
@@ -53,6 +53,8 @@
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.Velocity
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastMaxBy
+import androidx.compose.ui.util.fastMinByOrNull
import androidx.compose.ui.util.lerp
import kotlin.math.PI
import kotlin.math.abs
@@ -60,7 +62,6 @@
import kotlin.math.sin
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.take
import kotlinx.coroutines.launch
@@ -734,8 +735,8 @@
anchors: Set<Float>
): List<Float> {
// Find the anchors the target lies between with a little bit of rounding error.
- val a = anchors.filter { it <= offset + 0.001 }.maxOrNull()
- val b = anchors.filter { it >= offset - 0.001 }.minOrNull()
+ val a = anchors.filter { it <= offset + 0.001 }.fastMaxBy { it }
+ val b = anchors.filter { it >= offset - 0.001 }.fastMinByOrNull { it }
return when {
a == null ->
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tab.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tab.kt
index bc9ab02..c02ecd2 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tab.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tab.kt
@@ -52,6 +52,7 @@
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
+import androidx.compose.ui.util.fastFirst
import kotlin.math.max
/**
@@ -319,7 +320,7 @@
}
) { measurables, constraints ->
val textPlaceable = text?.let {
- measurables.first { it.layoutId == "text" }.measure(
+ measurables.fastFirst { it.layoutId == "text" }.measure(
// Measure with loose constraints for height as we don't want the text to take up more
// space than it needs
constraints.copy(minHeight = 0)
@@ -327,7 +328,7 @@
}
val iconPlaceable = icon?.let {
- measurables.first { it.layoutId == "icon" }.measure(constraints)
+ measurables.fastFirst { it.layoutId == "icon" }.measure(constraints)
}
val tabWidth = max(textPlaceable?.width ?: 0, iconPlaceable?.width ?: 0)
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TabRow.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TabRow.kt
index 26dabf2..861e5d4 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TabRow.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TabRow.kt
@@ -53,6 +53,10 @@
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastFold
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastForEachIndexed
+import androidx.compose.ui.util.fastMap
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
@@ -170,11 +174,11 @@
if (tabCount > 0) {
tabWidth = (tabRowWidth / tabCount)
}
- val tabRowHeight = tabMeasurables.fold(initial = 0) { max, curr ->
+ val tabRowHeight = tabMeasurables.fastFold(initial = 0) { max, curr ->
maxOf(curr.maxIntrinsicHeight(tabWidth), max)
}
- val tabPlaceables = tabMeasurables.map {
+ val tabPlaceables = tabMeasurables.fastMap {
it.measure(
constraints.copy(
minWidth = tabWidth,
@@ -195,18 +199,18 @@
}
layout(tabRowWidth, tabRowHeight) {
- tabPlaceables.forEachIndexed { index, placeable ->
+ tabPlaceables.fastForEachIndexed { index, placeable ->
placeable.placeRelative(index * tabWidth, 0)
}
- subcompose(TabSlots.Divider, divider).forEach {
+ subcompose(TabSlots.Divider, divider).fastForEach {
val placeable = it.measure(constraints.copy(minHeight = 0))
placeable.placeRelative(0, tabRowHeight - placeable.height)
}
subcompose(TabSlots.Indicator) {
indicator(tabPositions)
- }.forEach {
+ }.fastForEach {
it.measure(Constraints.fixed(tabRowWidth, tabRowHeight)).placeRelative(0, 0)
}
}
@@ -290,7 +294,7 @@
val tabMeasurables = subcompose(TabSlots.Tabs, tabs)
- val layoutHeight = tabMeasurables.fold(initial = 0) { curr, measurable ->
+ val layoutHeight = tabMeasurables.fastFold(initial = 0) { curr, measurable ->
maxOf(curr, measurable.maxIntrinsicHeight(Constraints.Infinity))
}
@@ -302,7 +306,7 @@
val tabPlaceables = mutableListOf<Placeable>()
val tabContentWidths = mutableListOf<Dp>()
- tabMeasurables.forEach {
+ tabMeasurables.fastForEach {
val placeable = it.measure(tabConstraints)
var contentWidth =
minOf(
@@ -314,7 +318,7 @@
tabContentWidths.add(contentWidth)
}
- val layoutWidth = tabPlaceables.fold(initial = padding * 2) { curr, measurable ->
+ val layoutWidth = tabPlaceables.fastFold(initial = padding * 2) { curr, measurable ->
curr + measurable.width
}
@@ -323,7 +327,7 @@
// Place the tabs
val tabPositions = mutableListOf<TabPosition>()
var left = padding
- tabPlaceables.forEachIndexed { index, placeable ->
+ tabPlaceables.fastForEachIndexed { index, placeable ->
placeable.placeRelative(left, 0)
tabPositions.add(
TabPosition(
@@ -337,7 +341,7 @@
// The divider is measured with its own height, and width equal to the total width
// of the tab row, and then placed on top of the tabs.
- subcompose(TabSlots.Divider, divider).forEach {
+ subcompose(TabSlots.Divider, divider).fastForEach {
val placeable = it.measure(
constraints.copy(
minHeight = 0,
@@ -352,7 +356,7 @@
// row, and then placed on top of the divider.
subcompose(TabSlots.Indicator) {
indicator(tabPositions)
- }.forEach {
+ }.fastForEach {
it.measure(Constraints.fixed(layoutWidth, layoutHeight)).placeRelative(0, 0)
}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextField.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextField.kt
index 2af0c17d..1ab2a13 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextField.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TextField.kt
@@ -63,6 +63,8 @@
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.lerp
import androidx.compose.ui.unit.offset
+import androidx.compose.ui.util.fastFirst
+import androidx.compose.ui.util.fastFirstOrNull
import androidx.compose.ui.util.lerp
import kotlin.math.max
import kotlin.math.roundToInt
@@ -648,24 +650,24 @@
// measure leading icon
val leadingPlaceable =
- measurables.find { it.layoutId == LeadingId }?.measure(looseConstraints)
+ measurables.fastFirstOrNull { it.layoutId == LeadingId }?.measure(looseConstraints)
occupiedSpaceHorizontally += widthOrZero(leadingPlaceable)
occupiedSpaceVertically = max(occupiedSpaceVertically, heightOrZero(leadingPlaceable))
// measure trailing icon
- val trailingPlaceable = measurables.find { it.layoutId == TrailingId }
+ val trailingPlaceable = measurables.fastFirstOrNull { it.layoutId == TrailingId }
?.measure(looseConstraints.offset(horizontal = -occupiedSpaceHorizontally))
occupiedSpaceHorizontally += widthOrZero(trailingPlaceable)
occupiedSpaceVertically = max(occupiedSpaceVertically, heightOrZero(trailingPlaceable))
// measure prefix
- val prefixPlaceable = measurables.find { it.layoutId == PrefixId }
+ val prefixPlaceable = measurables.fastFirstOrNull { it.layoutId == PrefixId }
?.measure(looseConstraints.offset(horizontal = -occupiedSpaceHorizontally))
occupiedSpaceHorizontally += widthOrZero(prefixPlaceable)
occupiedSpaceVertically = max(occupiedSpaceVertically, heightOrZero(prefixPlaceable))
// measure suffix
- val suffixPlaceable = measurables.find { it.layoutId == SuffixId }
+ val suffixPlaceable = measurables.fastFirstOrNull { it.layoutId == SuffixId }
?.measure(looseConstraints.offset(horizontal = -occupiedSpaceHorizontally))
occupiedSpaceHorizontally += widthOrZero(suffixPlaceable)
occupiedSpaceVertically = max(occupiedSpaceVertically, heightOrZero(suffixPlaceable))
@@ -677,11 +679,11 @@
horizontal = -occupiedSpaceHorizontally
)
val labelPlaceable =
- measurables.find { it.layoutId == LabelId }?.measure(labelConstraints)
+ measurables.fastFirstOrNull { it.layoutId == LabelId }?.measure(labelConstraints)
// supporting text must be measured after other elements, but we
// reserve space for it using its intrinsic height as a heuristic
- val supportingMeasurable = measurables.find { it.layoutId == SupportingId }
+ val supportingMeasurable = measurables.fastFirstOrNull { it.layoutId == SupportingId }
val supportingIntrinsicHeight =
supportingMeasurable?.minIntrinsicHeight(constraints.minWidth) ?: 0
@@ -694,13 +696,13 @@
horizontal = -occupiedSpaceHorizontally
)
val textFieldPlaceable = measurables
- .first { it.layoutId == TextFieldId }
+ .fastFirst { it.layoutId == TextFieldId }
.measure(textFieldConstraints)
// measure placeholder
val placeholderConstraints = textFieldConstraints.copy(minWidth = 0)
val placeholderPlaceable = measurables
- .find { it.layoutId == PlaceholderId }
+ .fastFirstOrNull { it.layoutId == PlaceholderId }
?.measure(placeholderConstraints)
occupiedSpaceVertically = max(
@@ -742,7 +744,7 @@
)
val height = totalHeight - supportingHeight
- val containerPlaceable = measurables.first { it.layoutId == ContainerId }.measure(
+ val containerPlaceable = measurables.fastFirst { it.layoutId == ContainerId }.measure(
Constraints(
minWidth = if (width != Constraints.Infinity) width else 0,
maxWidth = width,
@@ -833,23 +835,23 @@
intrinsicMeasurer: (IntrinsicMeasurable, Int) -> Int
): Int {
val textFieldWidth =
- intrinsicMeasurer(measurables.first { it.layoutId == TextFieldId }, height)
- val labelWidth = measurables.find { it.layoutId == LabelId }?.let {
+ intrinsicMeasurer(measurables.fastFirst { it.layoutId == TextFieldId }, height)
+ val labelWidth = measurables.fastFirstOrNull { it.layoutId == LabelId }?.let {
intrinsicMeasurer(it, height)
} ?: 0
- val trailingWidth = measurables.find { it.layoutId == TrailingId }?.let {
+ val trailingWidth = measurables.fastFirstOrNull { it.layoutId == TrailingId }?.let {
intrinsicMeasurer(it, height)
} ?: 0
- val prefixWidth = measurables.find { it.layoutId == PrefixId }?.let {
+ val prefixWidth = measurables.fastFirstOrNull { it.layoutId == PrefixId }?.let {
intrinsicMeasurer(it, height)
} ?: 0
- val suffixWidth = measurables.find { it.layoutId == SuffixId }?.let {
+ val suffixWidth = measurables.fastFirstOrNull { it.layoutId == SuffixId }?.let {
intrinsicMeasurer(it, height)
} ?: 0
- val leadingWidth = measurables.find { it.layoutId == LeadingId }?.let {
+ val leadingWidth = measurables.fastFirstOrNull { it.layoutId == LeadingId }?.let {
intrinsicMeasurer(it, height)
} ?: 0
- val placeholderWidth = measurables.find { it.layoutId == PlaceholderId }?.let {
+ val placeholderWidth = measurables.fastFirstOrNull { it.layoutId == PlaceholderId }?.let {
intrinsicMeasurer(it, height)
} ?: 0
return calculateWidth(
@@ -870,37 +872,37 @@
intrinsicMeasurer: (IntrinsicMeasurable, Int) -> Int
): Int {
var remainingWidth = width
- val leadingHeight = measurables.find { it.layoutId == LeadingId }?.let {
+ val leadingHeight = measurables.fastFirstOrNull { it.layoutId == LeadingId }?.let {
remainingWidth -= it.maxIntrinsicWidth(Constraints.Infinity)
intrinsicMeasurer(it, width)
} ?: 0
- val trailingHeight = measurables.find { it.layoutId == TrailingId }?.let {
+ val trailingHeight = measurables.fastFirstOrNull { it.layoutId == TrailingId }?.let {
remainingWidth -= it.maxIntrinsicWidth(Constraints.Infinity)
intrinsicMeasurer(it, width)
} ?: 0
- val labelHeight = measurables.find { it.layoutId == LabelId }?.let {
+ val labelHeight = measurables.fastFirstOrNull { it.layoutId == LabelId }?.let {
intrinsicMeasurer(it, remainingWidth)
} ?: 0
- val prefixHeight = measurables.find { it.layoutId == PrefixId }?.let {
+ val prefixHeight = measurables.fastFirstOrNull { it.layoutId == PrefixId }?.let {
val height = intrinsicMeasurer(it, remainingWidth)
remainingWidth -= it.maxIntrinsicWidth(Constraints.Infinity)
height
} ?: 0
- val suffixHeight = measurables.find { it.layoutId == SuffixId }?.let {
+ val suffixHeight = measurables.fastFirstOrNull { it.layoutId == SuffixId }?.let {
val height = intrinsicMeasurer(it, remainingWidth)
remainingWidth -= it.maxIntrinsicWidth(Constraints.Infinity)
height
} ?: 0
val textFieldHeight =
- intrinsicMeasurer(measurables.first { it.layoutId == TextFieldId }, remainingWidth)
- val placeholderHeight = measurables.find { it.layoutId == PlaceholderId }?.let {
+ intrinsicMeasurer(measurables.fastFirst { it.layoutId == TextFieldId }, remainingWidth)
+ val placeholderHeight = measurables.fastFirstOrNull { it.layoutId == PlaceholderId }?.let {
intrinsicMeasurer(it, remainingWidth)
} ?: 0
- val supportingHeight = measurables.find { it.layoutId == SupportingId }?.let {
+ val supportingHeight = measurables.fastFirstOrNull { it.layoutId == SupportingId }?.let {
intrinsicMeasurer(it, width)
} ?: 0
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt
index 22feae8..2699a0e 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TimePicker.kt
@@ -158,6 +158,11 @@
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.center
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastFilter
+import androidx.compose.ui.util.fastFirst
+import androidx.compose.ui.util.fastFirstOrNull
+import androidx.compose.ui.util.fastForEachIndexed
+import androidx.compose.ui.util.fastMap
import androidx.compose.ui.zIndex
import kotlin.math.PI
import kotlin.math.abs
@@ -924,7 +929,7 @@
) {
val measurePolicy = remember {
MeasurePolicy { measurables, constraints ->
- val spacer = measurables.first { it.layoutId == "Spacer" }
+ val spacer = measurables.fastFirst { it.layoutId == "Spacer" }
val spacerPlaceable = spacer.measure(
constraints.copy(
minWidth = 0,
@@ -932,7 +937,7 @@
)
)
- val items = measurables.filter { it.layoutId != "Spacer" }.map { item ->
+ val items = measurables.fastFilter { it.layoutId != "Spacer" }.fastMap { item ->
item.measure(
constraints.copy(
minWidth = 0,
@@ -969,7 +974,7 @@
) {
val measurePolicy = remember {
MeasurePolicy { measurables, constraints ->
- val spacer = measurables.first { it.layoutId == "Spacer" }
+ val spacer = measurables.fastFirst { it.layoutId == "Spacer" }
val spacerPlaceable = spacer.measure(
constraints.copy(
minHeight = 0,
@@ -977,7 +982,7 @@
)
)
- val items = measurables.filter { it.layoutId != "Spacer" }.map { item ->
+ val items = measurables.fastFilter { it.layoutId != "Spacer" }.fastMap { item ->
item.measure(
constraints.copy(
minHeight = 0,
@@ -1604,11 +1609,11 @@
) { measurables, constraints ->
val radiusPx = radius.toPx()
val itemConstraints = constraints.copy(minWidth = 0, minHeight = 0)
- val placeables = measurables.filter {
+ val placeables = measurables.fastFilter {
it.layoutId != LayoutId.Selector && it.layoutId != LayoutId.InnerCircle
- }.map { measurable -> measurable.measure(itemConstraints) }
- val selectorMeasurable = measurables.find { it.layoutId == LayoutId.Selector }
- val innerMeasurable = measurables.find { it.layoutId == LayoutId.InnerCircle }
+ }.fastMap { measurable -> measurable.measure(itemConstraints) }
+ val selectorMeasurable = measurables.fastFirstOrNull { it.layoutId == LayoutId.Selector }
+ val innerMeasurable = measurables.fastFirstOrNull { it.layoutId == LayoutId.InnerCircle }
val theta = FullCircle / (placeables.count())
val selectorPlaceable = selectorMeasurable?.measure(itemConstraints)
val innerCirclePlaceable = innerMeasurable?.measure(itemConstraints)
@@ -1619,7 +1624,7 @@
) {
selectorPlaceable?.place(0, 0)
- placeables.forEachIndexed { i, it ->
+ placeables.fastForEachIndexed { i, it ->
val centerOffsetX = constraints.maxWidth / 2 - it.width / 2
val centerOffsetY = constraints.maxHeight / 2 - it.height / 2
val offsetX = radiusPx * cos(theta * i - QuarterCircle) + centerOffsetX
@@ -1717,7 +1722,7 @@
private val MinimumInteractiveSize = 48.dp
private val Minutes = listOf(0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55)
private val Hours = listOf(12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
-private val ExtraHours = Hours.map { (it % 12 + 12) }
+private val ExtraHours = Hours.fastMap { (it % 12 + 12) }
private val PeriodToggleMargin = 12.dp
/**
diff --git a/compose/material3/material3/src/jvmMain/kotlin/androidx/compose/material3/LegacyCalendarModelImpl.kt b/compose/material3/material3/src/jvmMain/kotlin/androidx/compose/material3/LegacyCalendarModelImpl.kt
index 1220153..7fea1e3 100644
--- a/compose/material3/material3/src/jvmMain/kotlin/androidx/compose/material3/LegacyCalendarModelImpl.kt
+++ b/compose/material3/material3/src/jvmMain/kotlin/androidx/compose/material3/LegacyCalendarModelImpl.kt
@@ -16,6 +16,7 @@
package androidx.compose.material3
+import androidx.compose.ui.util.fastForEachIndexed
import java.text.DateFormat
import java.text.DateFormatSymbols
import java.text.ParseException
@@ -56,7 +57,7 @@
val shortWeekdays = DateFormatSymbols(locale).shortWeekdays
// Skip the first item, as it's empty, and the second item, as it represents Sunday while it
// should be last according to ISO-8601.
- weekdays.drop(2).forEachIndexed { index, day ->
+ weekdays.drop(2).fastForEachIndexed { index, day ->
add(Pair(day, shortWeekdays[index + 2]))
}
// Add Sunday to the end.
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/PlatformTypefaces.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/PlatformTypefaces.kt
index b86a1f0..9b8893e 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/PlatformTypefaces.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/PlatformTypefaces.kt
@@ -23,8 +23,8 @@
import androidx.annotation.RequiresApi
import androidx.annotation.VisibleForTesting
import androidx.compose.ui.text.ExperimentalTextApi
-import androidx.compose.ui.text.fastJoinToString
import androidx.compose.ui.unit.Density
+import androidx.compose.ui.util.fastJoinToString
/**
* Primary internal interface for resolving typefaces from Android platform
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidFontListTypeface.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidFontListTypeface.android.kt
index 1d1caa0..e745347 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidFontListTypeface.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidFontListTypeface.android.kt
@@ -25,9 +25,6 @@
import androidx.collection.LruCache
import androidx.compose.ui.text.ExperimentalTextApi
import androidx.compose.ui.text.android.InternalPlatformTextApi
-import androidx.compose.ui.text.fastDistinctBy
-import androidx.compose.ui.text.fastFilter
-import androidx.compose.ui.text.fastFilterNotNull
import androidx.compose.ui.text.font.AndroidFont
import androidx.compose.ui.text.font.AndroidPreloadedFont
import androidx.compose.ui.text.font.Font
@@ -40,6 +37,9 @@
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.font.ResourceFont
import androidx.compose.ui.text.font.synthesizeTypeface
+import androidx.compose.ui.util.fastDistinctBy
+import androidx.compose.ui.util.fastFilter
+import androidx.compose.ui.util.fastFilterNotNull
import androidx.compose.ui.util.fastForEach
import androidx.compose.ui.util.fastMap
import androidx.core.content.res.ResourcesCompat
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt
index 972b324..1d92b39 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt
@@ -51,7 +51,6 @@
import androidx.compose.ui.text.android.style.SkewXSpan
import androidx.compose.ui.text.android.style.TextDecorationSpan
import androidx.compose.ui.text.android.style.TypefaceSpan
-import androidx.compose.ui.text.fastFilter
import androidx.compose.ui.text.font.Font
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontStyle
@@ -72,6 +71,7 @@
import androidx.compose.ui.unit.TextUnitType
import androidx.compose.ui.unit.isUnspecified
import androidx.compose.ui.unit.sp
+import androidx.compose.ui.util.fastFilter
import androidx.compose.ui.util.fastForEach
import androidx.compose.ui.util.fastForEachIndexed
import kotlin.math.ceil
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/AnnotatedString.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/AnnotatedString.kt
index 3398b6a..99dba45 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/AnnotatedString.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/AnnotatedString.kt
@@ -22,6 +22,7 @@
import androidx.compose.ui.text.AnnotatedString.Range
import androidx.compose.ui.text.intl.LocaleList
import androidx.compose.ui.util.fastAny
+import androidx.compose.ui.util.fastFilter
import androidx.compose.ui.util.fastForEach
import androidx.compose.ui.util.fastMap
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraph.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraph.kt
index d6a9bbd..3ec3103 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraph.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraph.kt
@@ -34,6 +34,7 @@
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Density
+import androidx.compose.ui.util.fastFlatMap
import androidx.compose.ui.util.fastForEach
import androidx.compose.ui.util.fastMap
import kotlin.math.max
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraphIntrinsics.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraphIntrinsics.kt
index cd86a8f..b1f07cb 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraphIntrinsics.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraphIntrinsics.kt
@@ -22,6 +22,7 @@
import androidx.compose.ui.text.style.TextDirection
import androidx.compose.ui.unit.Density
import androidx.compose.ui.util.fastAny
+import androidx.compose.ui.util.fastFilter
import androidx.compose.ui.util.fastMap
import androidx.compose.ui.util.fastMaxBy
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter.kt
index 9d0e94c..6d6662d 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter.kt
@@ -22,10 +22,10 @@
import androidx.compose.runtime.setValue
import androidx.compose.ui.text.caches.LruCache
import androidx.compose.ui.text.caches.SimpleArrayMap
-import androidx.compose.ui.text.fastDistinctBy
-import androidx.compose.ui.text.fastFilter
import androidx.compose.ui.text.platform.createSynchronizedObject
import androidx.compose.ui.text.platform.synchronized
+import androidx.compose.ui.util.fastDistinctBy
+import androidx.compose.ui.util.fastFilter
import androidx.compose.ui.util.fastForEach
import androidx.compose.ui.util.fastMap
import kotlin.coroutines.CoroutineContext
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontMatcher.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontMatcher.kt
index b227277..bfe532b 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontMatcher.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontMatcher.kt
@@ -16,7 +16,7 @@
package androidx.compose.ui.text.font
-import androidx.compose.ui.text.fastFilter
+import androidx.compose.ui.util.fastFilter
/**
* Given a [FontFamily], [FontWeight] and [FontStyle], matches the best font in the [FontFamily]
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextDecoration.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextDecoration.kt
index 3244f63..c107fbc 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextDecoration.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/TextDecoration.kt
@@ -17,8 +17,8 @@
import androidx.compose.runtime.Immutable
import androidx.compose.runtime.Stable
-import androidx.compose.ui.text.fastFold
-import androidx.compose.ui.text.fastJoinToString
+import androidx.compose.ui.util.fastFold
+import androidx.compose.ui.util.fastJoinToString
/**
* Defines a horizontal line to be drawn on the text.
diff --git a/compose/ui/ui-text/src/jvmMain/kotlin/androidx/compose/ui/text/JvmAnnotatedString.jvm.kt b/compose/ui/ui-text/src/jvmMain/kotlin/androidx/compose/ui/text/JvmAnnotatedString.jvm.kt
index 62a82c2..d500695 100644
--- a/compose/ui/ui-text/src/jvmMain/kotlin/androidx/compose/ui/text/JvmAnnotatedString.jvm.kt
+++ b/compose/ui/ui-text/src/jvmMain/kotlin/androidx/compose/ui/text/JvmAnnotatedString.jvm.kt
@@ -17,6 +17,7 @@
package androidx.compose.ui.text
import androidx.compose.ui.text.AnnotatedString.Range
+import androidx.compose.ui.util.fastFold
import androidx.compose.ui.util.fastMap
import java.util.SortedSet
diff --git a/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/TextStyleTest.kt b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/TextStyleTest.kt
index 66378f5..040d279 100644
--- a/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/TextStyleTest.kt
+++ b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/TextStyleTest.kt
@@ -49,6 +49,7 @@
import androidx.compose.ui.unit.em
import androidx.compose.ui.unit.isUnspecified
import androidx.compose.ui.unit.sp
+import androidx.compose.ui.util.fastDistinctBy
import com.google.common.truth.Truth.assertThat
import kotlin.reflect.KClass
import kotlin.reflect.KParameter
diff --git a/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/ListUtils.kt b/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/ListUtils.kt
index ca028b0..bb8caf3 100644
--- a/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/ListUtils.kt
+++ b/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/ListUtils.kt
@@ -249,8 +249,6 @@
* **Do not use for collections that come from public APIs**, since they may not support random
* access in an efficient way, and this method may actually be a lot slower. Only use for
* collections that are created by code we control and are known to support random access.
- *
- * @param [operation] function that takes current accumulator value and an element, and calculates the next accumulator value.
*/
@Suppress("BanInlineOptIn") // Treat Kotlin Contracts as non-experimental.
@OptIn(ExperimentalContracts::class)
@@ -365,6 +363,8 @@
*
* @param [operation] function that takes current accumulator value and an element,
* and calculates the next accumulator value.
+ *
+ * @throws UnsupportedOperationException if this collection is empty
*/
@Suppress("BanInlineOptIn")
@OptIn(ExperimentalContracts::class)
@@ -532,11 +532,11 @@
/**
* Returns the first value that [predicate] returns `true` for
*
- * @throws [NoSuchElementException] if no such element is found.
- *
* **Do not use for collections that come from public APIs**, since they may not support random
* access in an efficient way, and this method may actually be a lot slower. Only use for
* collections that are created by code we control and are known to support random access.
+ *
+ * @throws [NoSuchElementException] if no such element is found
*/
@Suppress("BanInlineOptIn")
@OptIn(ExperimentalContracts::class)
diff --git a/compose/ui/ui/lint-baseline.xml b/compose/ui/ui/lint-baseline.xml
index 5a92c32..017bacd 100644
--- a/compose/ui/ui/lint-baseline.xml
+++ b/compose/ui/ui/lint-baseline.xml
@@ -427,6 +427,15 @@
<issue
id="PrimitiveInLambda"
message="Use a functional interface instead of lambda syntax for lambdas with primitive values in variable 'scrollAction' with type AccessibilityAction<Function2<? super Float, ? super Float, ? extends Boolean>>."
+ errorLine1=" val scrollAction ="
+ errorLine2=" ^">
+ <location
+ file="src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt"/>
+ </issue>
+
+ <issue
+ id="PrimitiveInLambda"
+ message="Use a functional interface instead of lambda syntax for lambdas with primitive values in variable 'scrollAction' with type AccessibilityAction<Function2<? super Float, ? super Float, ? extends Boolean>>."
errorLine1=" var scrollAction = scrollableAncestor?.config?.getOrNull(SemanticsActions.ScrollBy)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
index 18e0502..ff887d0 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
@@ -52,7 +52,6 @@
import androidx.collection.SparseArrayCompat
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.R
-import androidx.compose.ui.fastJoinToString
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.graphics.toComposeRect
@@ -94,6 +93,7 @@
import androidx.compose.ui.unit.toSize
import androidx.compose.ui.util.fastForEach
import androidx.compose.ui.util.fastForEachIndexed
+import androidx.compose.ui.util.fastJoinToString
import androidx.compose.ui.util.fastMap
import androidx.core.util.keyIterator
import androidx.core.view.AccessibilityDelegateCompat
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/accessibility/CollectionInfo.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/accessibility/CollectionInfo.kt
index 212864c..9a9447e 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/accessibility/CollectionInfo.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/accessibility/CollectionInfo.kt
@@ -16,8 +16,6 @@
package androidx.compose.ui.platform.accessibility
-import androidx.compose.ui.fastReduce
-import androidx.compose.ui.fastZipWithNext
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.semantics.CollectionInfo
import androidx.compose.ui.semantics.CollectionItemInfo
@@ -25,6 +23,8 @@
import androidx.compose.ui.semantics.SemanticsProperties
import androidx.compose.ui.semantics.getOrNull
import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastReduce
+import androidx.compose.ui.util.fastZipWithNext
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
import kotlin.math.abs
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilter.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilter.kt
index ddf5d9e..b4743ae 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilter.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/SuspendingPointerInputFilter.kt
@@ -18,7 +18,6 @@
import androidx.compose.runtime.collection.mutableVectorOf
import androidx.compose.ui.Modifier
-import androidx.compose.ui.fastMapNotNull
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.internal.JvmDefaultWithCompatibility
import androidx.compose.ui.node.ModifierNodeElement
@@ -31,6 +30,7 @@
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.util.fastAll
+import androidx.compose.ui.util.fastMapNotNull
import kotlin.coroutines.Continuation
import kotlin.coroutines.ContinuationInterceptor
import kotlin.coroutines.CoroutineContext
diff --git a/constraintlayout/constraintlayout-compose/lint-baseline.xml b/constraintlayout/constraintlayout-compose/lint-baseline.xml
index c1c9585..cacb99a 100644
--- a/constraintlayout/constraintlayout-compose/lint-baseline.xml
+++ b/constraintlayout/constraintlayout-compose/lint-baseline.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
+<issues format="6" by="lint 8.2.0-alpha14" type="baseline" client="cli" dependencies="false" name="AGP (8.2.0-alpha14)" variant="all" version="8.2.0-alpha14">
<issue
id="BanInlineOptIn"
@@ -47,123 +47,6 @@
</issue>
<issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val a = anchors.filter { it <= offset + 0.001 }.maxOrNull()"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/androidMain/kotlin/androidx/constraintlayout/compose/carousel/CarouselSwipeable.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val b = anchors.filter { it >= offset - 0.001 }.minOrNull()"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/androidMain/kotlin/androidx/constraintlayout/compose/carousel/CarouselSwipeable.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" for (child in root.children) {"
- errorLine2=" ~~">
- <location
- file="src/androidMain/kotlin/androidx/constraintlayout/compose/ConstraintLayout.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" root.children.forEach { child ->"
- errorLine2=" ~~~~~~~">
- <location
- file="src/androidMain/kotlin/androidx/constraintlayout/compose/ConstraintLayout.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" for (child in root.children) {"
- errorLine2=" ~~">
- <location
- file="src/androidMain/kotlin/androidx/constraintlayout/compose/ConstraintLayout.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" for (child in root.children) {"
- errorLine2=" ~~">
- <location
- file="src/androidMain/kotlin/androidx/constraintlayout/compose/ConstraintLayout.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" for (element in designElements) {"
- errorLine2=" ~~">
- <location
- file="src/androidMain/kotlin/androidx/constraintlayout/compose/ConstraintLayout.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" root.children.forEach { child ->"
- errorLine2=" ~~~~~~~">
- <location
- file="src/androidMain/kotlin/androidx/constraintlayout/compose/MotionMeasurer.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" for (child in root.children) {"
- errorLine2=" ~~">
- <location
- file="src/androidMain/kotlin/androidx/constraintlayout/compose/MotionMeasurer.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" for (child in root.children) {"
- errorLine2=" ~~">
- <location
- file="src/androidMain/kotlin/androidx/constraintlayout/compose/MotionMeasurer.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" root.children.forEach { constraintWidget ->"
- errorLine2=" ~~~~~~~">
- <location
- file="src/androidMain/kotlin/androidx/constraintlayout/compose/ToolingUtils.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" constraintWidget.anchors.forEach { anchor ->"
- errorLine2=" ~~~~~~~">
- <location
- file="src/androidMain/kotlin/androidx/constraintlayout/compose/ToolingUtils.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" helperReferences.forEach(helperReferencesArray::put)"
- errorLine2=" ~~~~~~~">
- <location
- file="src/androidMain/kotlin/androidx/constraintlayout/compose/ToolingUtils.kt"/>
- </issue>
-
- <issue
id="PrimitiveInLambda"
message="Use a functional interface instead of lambda syntax for lambdas with primitive values in method setThresholds$lint_module has parameter '<set-?>' with type Function2<? super Float, ? super Float, Float>."
errorLine1=" internal var thresholds: (Float, Float) -> Float by mutableStateOf({ _, _ -> 0f })"
diff --git a/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ConstraintLayout.kt b/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ConstraintLayout.kt
index 02423cd..337d63a 100644
--- a/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ConstraintLayout.kt
+++ b/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ConstraintLayout.kt
@@ -1765,6 +1765,7 @@
json.append(" bottom: ${root.height} ,")
json.append(" } }")
+ @Suppress("ListIterator")
for (child in root.children) {
val measurable = child.companionWidget
if (measurable !is Measurable) {
@@ -1906,13 +1907,13 @@
if (DEBUG) {
root.debugName = "ConstraintLayout"
- root.children.forEach { child ->
+ root.children.fastForEach { child ->
child.debugName =
(child.companionWidget as? Measurable)?.layoutId?.toString() ?: "NOTAG"
}
Log.d("CCL", "ConstraintLayout is asked to measure with $constraints")
Log.d("CCL", root.toDebugString())
- for (child in root.children) {
+ root.children.fastForEach { child ->
Log.d("CCL", child.toDebugString())
}
}
@@ -1969,6 +1970,7 @@
fun Placeable.PlacementScope.performLayout(measurables: List<Measurable>) {
if (frameCache.isEmpty()) {
+ @Suppress("ListIterator")
for (child in root.children) {
val measurable = child.companionWidget
if (measurable !is Measurable) continue
@@ -2108,7 +2110,7 @@
@Composable
fun createDesignElements() {
- for (element in designElements) {
+ designElements.fastForEach { element ->
var id = element.id
var function = DesignElements.map[element.type]
if (function != null) {
diff --git a/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/MotionMeasurer.kt b/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/MotionMeasurer.kt
index dd09496..63edc79 100644
--- a/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/MotionMeasurer.kt
+++ b/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/MotionMeasurer.kt
@@ -64,7 +64,7 @@
if (DEBUG) {
root.debugName = "ConstraintLayout"
- root.children.forEach { child ->
+ root.children.fastForEach { child ->
child.debugName =
(child.companionWidget as? Measurable)?.layoutId?.toString() ?: "NOTAG"
}
@@ -284,7 +284,7 @@
val pos = IntArray(50)
val key = FloatArray(100)
- for (child in root.children) {
+ root.children.fastForEach { child ->
val start = transition.getStart(child.stringId)
val end = transition.getEnd(child.stringId)
val interpolated = transition.getInterpolated(child.stringId)
@@ -325,7 +325,7 @@
) {
val pathEffect = PathEffect.dashPathEffect(floatArrayOf(10f, 10f), 0f)
- for (child in root.children) {
+ root.children.fastForEach { child ->
val startFrame = transition.getStart(child)
val endFrame = transition.getEnd(child)
if (drawBounds) {
diff --git a/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ToolingUtils.kt b/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ToolingUtils.kt
index 0cd828b..515abc7 100644
--- a/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ToolingUtils.kt
+++ b/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/ToolingUtils.kt
@@ -20,6 +20,7 @@
import androidx.compose.ui.layout.layoutId
import androidx.compose.ui.semantics.SemanticsPropertyKey
import androidx.compose.ui.semantics.SemanticsPropertyReceiver
+import androidx.compose.ui.util.fastForEach
import androidx.constraintlayout.core.state.State.PARENT
import androidx.constraintlayout.core.widgets.ConstraintWidget
import androidx.constraintlayout.core.widgets.ConstraintWidgetContainer
@@ -76,7 +77,7 @@
withConstraints = it shr CONSTRAINTS == 1
}
- root.children.forEach { constraintWidget ->
+ root.children.fastForEach { constraintWidget ->
val constraintsInfoArray = JSONArray()
val helperReferences = mutableListOf<String>()
val isHelper = constraintWidget is HelperWidget
@@ -86,7 +87,7 @@
addReferencesIds(constraintWidget as HelperWidget, helperReferences, root, rootId)
}
- constraintWidget.anchors.forEach { anchor ->
+ constraintWidget.anchors.fastForEach { anchor ->
if (anchor.isConnected) {
val targetWidget = anchor.target.owner
val targetIsParent = root == targetWidget
@@ -186,7 +187,7 @@
viewWithBoundsAndConstraints.put("isRoot", isRoot)
val helperReferencesArray = JSONArray()
- helperReferences.forEach(helperReferencesArray::put)
+ helperReferences.fastForEach(helperReferencesArray::put)
viewWithBoundsAndConstraints.put("helperReferences", helperReferencesArray)
if (withConstraints) {
diff --git a/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/carousel/CarouselSwipeable.kt b/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/carousel/CarouselSwipeable.kt
index a0bb06f..4a1d531 100644
--- a/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/carousel/CarouselSwipeable.kt
+++ b/constraintlayout/constraintlayout-compose/src/androidMain/kotlin/androidx/constraintlayout/compose/carousel/CarouselSwipeable.kt
@@ -48,6 +48,8 @@
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.Velocity
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastMaxBy
+import androidx.compose.ui.util.fastMinByOrNull
import androidx.compose.ui.util.lerp
import kotlin.math.PI
import kotlin.math.abs
@@ -717,8 +719,8 @@
anchors: Set<Float>
): List<Float> {
// Find the anchors the target lies between with a little bit of rounding error.
- val a = anchors.filter { it <= offset + 0.001 }.maxOrNull()
- val b = anchors.filter { it >= offset - 0.001 }.minOrNull()
+ val a = anchors.filter { it <= offset + 0.001 }.fastMaxBy { it }
+ val b = anchors.filter { it >= offset - 0.001 }.fastMinByOrNull { it }
return when {
a == null ->
diff --git a/glance/glance-appwidget-preview/lint-baseline.xml b/glance/glance-appwidget-preview/lint-baseline.xml
deleted file mode 100644
index 88ba6f5..0000000
--- a/glance/glance-appwidget-preview/lint-baseline.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="cli" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .all { it }"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/preview/ComposableInvoker.kt"/>
- </issue>
-
-</issues>
diff --git a/glance/glance-appwidget-preview/src/main/java/androidx/glance/appwidget/preview/ComposableInvoker.kt b/glance/glance-appwidget-preview/src/main/java/androidx/glance/appwidget/preview/ComposableInvoker.kt
index 799ee8e..2e1cba7 100644
--- a/glance/glance-appwidget-preview/src/main/java/androidx/glance/appwidget/preview/ComposableInvoker.kt
+++ b/glance/glance-appwidget-preview/src/main/java/androidx/glance/appwidget/preview/ComposableInvoker.kt
@@ -33,6 +33,7 @@
* Returns true if the [methodTypes] and [actualTypes] are compatible. This means that every
* `actualTypes[n]` are assignable to `methodTypes[n]`.
*/
+ @Suppress("ListIterator")
private fun compatibleTypes(
methodTypes: Array<Class<*>>,
actualTypes: Array<Class<*>>
diff --git a/glance/glance-appwidget/lint-baseline.xml b/glance/glance-appwidget/lint-baseline.xml
index 79615c9..87160dc 100644
--- a/glance/glance-appwidget/lint-baseline.xml
+++ b/glance/glance-appwidget/lint-baseline.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="cli" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
+<issues format="6" by="lint 8.2.0-alpha14" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha14)" variant="all" version="8.2.0-alpha14">
<issue
id="BanThreadSleep"
@@ -29,465 +29,6 @@
</issue>
<issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" it.children.addAll(children.map { it.copy() })"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/AndroidRemoteViews.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" lambdas[event.key]?.forEach { it.block() }"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/AppWidgetSession.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" sizes.map { DpSize(it.width.dp, it.height.dp) }"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/AppWidgetUtils.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" }.minByOrNull { it.second }?.first"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/AppWidgetUtils.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" rv.setContentDescription(viewDef.mainViewId, contentDescription.joinToString())"
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/ApplyModifiers.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" manager.getGlanceIds(javaClass).forEach { update(context, it) }"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/GlanceAppWidget.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" manager.getGlanceIds(javaClass).forEach { glanceId ->"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/GlanceAppWidget.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" }.toMap()"
- errorLine2=" ~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/GlanceAppWidgetManager.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" return receivers.flatMap { receiver ->"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/GlanceAppWidgetManager.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val info = appWidgetManager.installedProviders.first {"
- errorLine2=" ~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/GlanceAppWidgetManager.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .filter { it.provider.packageName == packageName }"
- errorLine2=" ~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/GlanceAppWidgetManager.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .map { it.provider.className }"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/GlanceAppWidgetManager.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .toSet()"
- errorLine2=" ~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/GlanceAppWidgetManager.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" toRemove.forEach { receiver -> remove(providerKey(receiver)) }"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/GlanceAppWidgetManager.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" if (children.any { it.shouldIgnoreResult() }) return true"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/IgnoreResult.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/LayoutSelection.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" itemList.forEachIndexed { index, (itemId, composable) ->"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/lazy/LazyList.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" it.children.addAll(children.map { it.copy() })"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/lazy/LazyList.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" it.children.addAll(children.map { it.copy() })"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/lazy/LazyList.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" element.children.foldIndexed(false) { position, previous, itemEmittable ->"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/translators/LazyListTranslator.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" itemList.forEachIndexed { index, (itemId, composable) ->"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/lazy/LazyVerticalGrid.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" it.children.addAll(children.map { it.copy() })"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/lazy/LazyVerticalGrid.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" it.children.addAll(children.map { it.copy() })"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/lazy/LazyVerticalGrid.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" element.children.foldIndexed(false) { position, previous, itemEmittable ->"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/translators/LazyVerticalGridTranslator.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" if (container.children.isNotEmpty() && container.children.all { it is EmittableSizeBox }) {"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/NormalizeCompositionTree.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" for (item in container.children) {"
- errorLine2=" ~~">
- <location
- file="src/main/java/androidx/glance/appwidget/NormalizeCompositionTree.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" children.forEach { child ->"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/NormalizeCompositionTree.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" children.any { child ->"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/NormalizeCompositionTree.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" children.any { child ->"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/NormalizeCompositionTree.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" children.forEachIndexed { index, child ->"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/NormalizeCompositionTree.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" children.foldIndexed("
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/NormalizeCompositionTree.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" fold(GlanceModifier) { acc: GlanceModifier, mod: GlanceModifier? ->"
- errorLine2=" ~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/NormalizeCompositionTree.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val layoutIdCount = views.map { it.layoutId }.distinct().count()"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/RemoteCollectionItems.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" viewTypeCount = views.map { it.layoutId }.distinct().count()"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/RemoteCollectionItems.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" viewTypeCount = views.map { it.layoutId }.distinct().count()"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/RemoteCollectionItems.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" it.children.addAll(children.map { it.copy() })"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/RemoteViewsRoot.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" if (children.all { it is EmittableSizeBox }) {"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/RemoteViewsTranslator.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val views = children.map { child ->"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/RemoteViewsTranslator.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" Api31Impl.createRemoteViews(views.toMap())"
- errorLine2=" ~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/RemoteViewsTranslator.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" combineLandscapeAndPortrait(views.map { it.second })"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/RemoteViewsTranslator.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" element.children.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/RemoteViewsTranslator.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" check(children.count { it is EmittableRadioButton && it.checked } <= 1) {"
- errorLine2=" ~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/RemoteViewsTranslator.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" element.children.forEachIndexed { index, child ->"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/RemoteViewsTranslator.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" children.take(10).forEachIndexed { index, child ->"
- errorLine2=" ~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/RemoteViewsTranslator.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" children.take(10).forEachIndexed { index, child ->"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/RemoteViewsTranslator.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" it.children.addAll(children.map { it.copy() })"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/SizeBox.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .map { findBestSize(it, sizeMode.sizes) ?: smallestSize }"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/SizeBox.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" sizes.distinct().map { size ->"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/SizeBox.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" spans.forEach { span ->"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/translators/TextTranslator.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val layouts = config.layoutList.associate {"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/WidgetLayout.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" addAllChildren(element.children.map { createNode(context, it) })"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/appwidget/WidgetLayout.kt"/>
- </issue>
-
- <issue
id="PrimitiveInLambda"
message="Use a functional interface instead of lambda syntax for lambdas with primitive values in method extractAllSizes has parameter 'minSize' with type Function0<DpSize>."
errorLine1="internal fun Bundle.extractAllSizes(minSize: () -> DpSize): List<DpSize> {"
diff --git a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/AndroidRemoteViews.kt b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/AndroidRemoteViews.kt
index f199042..8450bff 100644
--- a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/AndroidRemoteViews.kt
+++ b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/AndroidRemoteViews.kt
@@ -20,6 +20,7 @@
import android.widget.RemoteViews
import androidx.annotation.IdRes
import androidx.compose.runtime.Composable
+import androidx.compose.ui.util.fastMap
import androidx.glance.Emittable
import androidx.glance.EmittableWithChildren
import androidx.glance.GlanceModifier
@@ -79,7 +80,7 @@
it.remoteViews = remoteViews
}
it.containerViewId = containerViewId
- it.children.addAll(children.map { it.copy() })
+ it.children.addAll(children.fastMap { it.copy() })
}
override fun toString(): String = "AndroidRemoteViews(" +
diff --git a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/AppWidgetSession.kt b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/AppWidgetSession.kt
index 74bc2e5..314e095 100644
--- a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/AppWidgetSession.kt
+++ b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/AppWidgetSession.kt
@@ -32,6 +32,7 @@
import androidx.compose.runtime.remember
import androidx.compose.runtime.snapshots.Snapshot
import androidx.compose.ui.unit.DpSize
+import androidx.compose.ui.util.fastForEach
import androidx.glance.EmittableWithChildren
import androidx.glance.GlanceComposable
import androidx.glance.LocalContext
@@ -183,7 +184,7 @@
is RunLambda -> {
if (DEBUG) Log.i(TAG, "Received RunLambda(${event.key}) action for session($key)")
Snapshot.withMutableSnapshot {
- lambdas[event.key]?.forEach { it.block() }
+ lambdas[event.key]?.fastForEach { it.block() }
} ?: Log.w(TAG, "Triggering Action(${event.key}) for session($key) failed")
}
is WaitForReady -> event.resume.send(Unit)
diff --git a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/AppWidgetUtils.kt b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/AppWidgetUtils.kt
index 1b39006..514a998 100644
--- a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/AppWidgetUtils.kt
+++ b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/AppWidgetUtils.kt
@@ -32,6 +32,8 @@
import androidx.compose.runtime.Composable
import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastMap
+import androidx.compose.ui.util.fastMinByOrNull
import androidx.glance.GlanceComposable
import androidx.glance.GlanceId
import java.util.concurrent.atomic.AtomicBoolean
@@ -85,7 +87,7 @@
return if (sizes.isNullOrEmpty()) {
estimateSizes(minSize)
} else {
- sizes.map { DpSize(it.width.dp, it.height.dp) }
+ sizes.fastMap { DpSize(it.width.dp, it.height.dp) }
}
}
@@ -143,7 +145,7 @@
} else {
null
}
- }.minByOrNull { it.second }?.first
+ }.fastMinByOrNull { it.second }?.first
/**
* @return the minimum size as configured by the App Widget provider.
diff --git a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/ApplyModifiers.kt b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/ApplyModifiers.kt
index 51d1774..5fb7402 100644
--- a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/ApplyModifiers.kt
+++ b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/ApplyModifiers.kt
@@ -28,6 +28,7 @@
import androidx.annotation.DoNotInline
import androidx.annotation.RequiresApi
import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.util.fastJoinToString
import androidx.core.widget.RemoteViewsCompat.setTextViewHeight
import androidx.core.widget.RemoteViewsCompat.setTextViewWidth
import androidx.core.widget.RemoteViewsCompat.setViewBackgroundColor
@@ -135,7 +136,7 @@
val contentDescription: List<String>? =
semantics.configuration.getOrNull(SemanticsProperties.ContentDescription)
if (contentDescription != null) {
- rv.setContentDescription(viewDef.mainViewId, contentDescription.joinToString())
+ rv.setContentDescription(viewDef.mainViewId, contentDescription.fastJoinToString())
}
}
rv.setViewVisibility(viewDef.mainViewId, visibility.toViewVisibility())
diff --git a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/GlanceAppWidget.kt b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/GlanceAppWidget.kt
index a1d03ba..2b0d9fa 100644
--- a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/GlanceAppWidget.kt
+++ b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/GlanceAppWidget.kt
@@ -26,6 +26,7 @@
import androidx.annotation.RestrictTo
import androidx.annotation.RestrictTo.Scope
import androidx.compose.runtime.Composable
+import androidx.compose.ui.util.fastForEach
import androidx.glance.GlanceComposable
import androidx.glance.GlanceId
import androidx.glance.appwidget.state.getAppWidgetState
@@ -202,7 +203,7 @@
/** Update all App Widgets managed by the [GlanceAppWidget] class. */
suspend fun GlanceAppWidget.updateAll(@Suppress("ContextFirst") context: Context) {
val manager = GlanceAppWidgetManager(context)
- manager.getGlanceIds(javaClass).forEach { update(context, it) }
+ manager.getGlanceIds(javaClass).fastForEach { update(context, it) }
}
/**
@@ -215,7 +216,7 @@
val stateDef = stateDefinition
requireNotNull(stateDef) { "GlanceAppWidget.updateIf cannot be used if no state is defined." }
val manager = GlanceAppWidgetManager(context)
- manager.getGlanceIds(javaClass).forEach { glanceId ->
+ manager.getGlanceIds(javaClass).fastForEach { glanceId ->
val state = getAppWidgetState(context, stateDef, glanceId) as State
if (predicate(state)) update(context, glanceId)
}
diff --git a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/GlanceAppWidgetManager.kt b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/GlanceAppWidgetManager.kt
index 41c7633..089f713 100644
--- a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/GlanceAppWidgetManager.kt
+++ b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/GlanceAppWidgetManager.kt
@@ -27,6 +27,11 @@
import androidx.annotation.RequiresApi
import androidx.annotation.VisibleForTesting
import androidx.compose.ui.unit.DpSize
+import androidx.compose.ui.util.fastFilter
+import androidx.compose.ui.util.fastFirst
+import androidx.compose.ui.util.fastFlatMap
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastMap
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.stringPreferencesKey
@@ -84,6 +89,7 @@
val packageName = context.packageName
val receivers = prefs[providersKey] ?: return State()
return State(
+ @Suppress("ListIterator")
receivers.mapNotNull { receiverName ->
val comp = ComponentName(packageName, receiverName)
val providerName = prefs[providerKey(receiverName)] ?: return@mapNotNull null
@@ -102,7 +108,7 @@
val state = getState()
val providerName = requireNotNull(provider.canonicalName) { "no canonical provider name" }
val receivers = state.providerNameToReceivers[providerName] ?: return emptyList()
- return receivers.flatMap { receiver ->
+ return receivers.fastFlatMap { receiver ->
appWidgetManager.getAppWidgetIds(receiver).map { AppWidgetId(it) }
}
}
@@ -196,7 +202,7 @@
val target = ComponentName(context.packageName, receiver.name)
val previewBundle = Bundle().apply {
if (preview != null) {
- val info = appWidgetManager.installedProviders.first {
+ val info = appWidgetManager.installedProviders.fastFirst {
it.provider == target
}
val snapshot = preview.compose(
@@ -222,9 +228,10 @@
/** Check which receivers still exist, and clean the data store to only keep those. */
internal suspend fun cleanReceivers() {
val packageName = context.packageName
+ @Suppress("ListIterator")
val receivers = appWidgetManager.installedProviders
- .filter { it.provider.packageName == packageName }
- .map { it.provider.className }
+ .fastFilter { it.provider.packageName == packageName }
+ .fastMap { it.provider.className }
.toSet()
dataStore.updateData { prefs ->
val knownReceivers = prefs[providersKey] ?: return@updateData prefs
@@ -232,7 +239,7 @@
if (toRemove.isEmpty()) return@updateData prefs
prefs.toMutablePreferences().apply {
this[providersKey] = knownReceivers - toRemove
- toRemove.forEach { receiver -> remove(providerKey(receiver)) }
+ toRemove.fastForEach { receiver -> remove(providerKey(receiver)) }
}.toPreferences()
}
}
diff --git a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/IgnoreResult.kt b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/IgnoreResult.kt
index 59062de..d6711c1 100644
--- a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/IgnoreResult.kt
+++ b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/IgnoreResult.kt
@@ -17,6 +17,7 @@
package androidx.glance.appwidget
import androidx.compose.runtime.Composable
+import androidx.compose.ui.util.fastAny
import androidx.glance.Emittable
import androidx.glance.EmittableWithChildren
import androidx.glance.GlanceComposable
@@ -51,7 +52,7 @@
if (this is EmittableIgnoreResult) {
return true
} else if (this is EmittableWithChildren) {
- if (children.any { it.shouldIgnoreResult() }) return true
+ if (children.fastAny { it.shouldIgnoreResult() }) return true
}
return false
}
diff --git a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/LayoutSelection.kt b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/LayoutSelection.kt
index e4ce545..b9bb899 100644
--- a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/LayoutSelection.kt
+++ b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/LayoutSelection.kt
@@ -26,6 +26,7 @@
import androidx.annotation.LayoutRes
import androidx.annotation.RequiresApi
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastForEach
import androidx.glance.GlanceModifier
import androidx.glance.findModifier
import androidx.glance.layout.Alignment
@@ -362,7 +363,7 @@
?: throw IllegalStateException("No child for position $pos and size $width x $height")
children.values
.filter { it != stubId }
- .forEach {
+ .fastForEach {
inflateViewStub(
translationContext, it, R.layout.glance_deleted_view, R.id.deletedViewId)
}
diff --git a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/NormalizeCompositionTree.kt b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/NormalizeCompositionTree.kt
index 2b86729..ec3d23d 100644
--- a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/NormalizeCompositionTree.kt
+++ b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/NormalizeCompositionTree.kt
@@ -18,6 +18,11 @@
import android.os.Build
import android.util.Log
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastAll
+import androidx.compose.ui.util.fastAny
+import androidx.compose.ui.util.fastFold
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastForEachIndexed
import androidx.glance.BackgroundModifier
import androidx.glance.Emittable
import androidx.glance.EmittableButton
@@ -63,7 +68,8 @@
* [EmittableBox].
*/
private fun coerceToOneChild(container: EmittableWithChildren) {
- if (container.children.isNotEmpty() && container.children.all { it is EmittableSizeBox }) {
+ if (container.children.isNotEmpty() && container.children.fastAll { it is EmittableSizeBox }) {
+ @Suppress("ListIterator")
for (item in container.children) {
item as EmittableSizeBox
if (item.children.size == 1) continue
@@ -89,20 +95,20 @@
* fillMaxSize. Otherwise, the behavior depends on the version of Android.
*/
private fun EmittableWithChildren.normalizeSizes() {
- children.forEach { child ->
+ children.fastForEach { child ->
if (child is EmittableWithChildren) {
child.normalizeSizes()
}
}
if ((modifier.findModifier<HeightModifier>()?.height ?: Dimension.Wrap) is Dimension.Wrap &&
- children.any { child ->
+ children.fastAny { child ->
child.modifier.findModifier<HeightModifier>()?.height is Dimension.Fill
}
) {
modifier = modifier.fillMaxHeight()
}
if ((modifier.findModifier<WidthModifier>()?.width ?: Dimension.Wrap) is Dimension.Wrap &&
- children.any { child ->
+ children.fastAny { child ->
child.modifier.findModifier<WidthModifier>()?.width is Dimension.Fill
}
) {
@@ -112,7 +118,7 @@
/** Transform each node in the tree. */
private fun EmittableWithChildren.transformTree(block: (Emittable) -> Emittable) {
- children.forEachIndexed { index, child ->
+ children.fastForEachIndexed { index, child ->
val newChild = block(child)
children[index] = newChild
if (newChild is EmittableWithChildren) newChild.transformTree(block)
@@ -133,6 +139,7 @@
* will be updated for the composition in all sizes. This is why there can be multiple LambdaActions
* for each key, even after de-duping.
*/
+@Suppress("ListIterator")
internal fun EmittableWithChildren.updateLambdaActionKeys(): Map<String, List<LambdaAction>> =
children.foldIndexed(
mutableMapOf<String, MutableList<LambdaAction>>()
@@ -337,6 +344,6 @@
}
private fun MutableList<GlanceModifier?>.collect(): GlanceModifier =
- fold(GlanceModifier) { acc: GlanceModifier, mod: GlanceModifier? ->
+ fastFold(GlanceModifier) { acc: GlanceModifier, mod: GlanceModifier? ->
mod?.let { acc.then(mod) } ?: acc
}
diff --git a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/RemoteCollectionItems.kt b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/RemoteCollectionItems.kt
index 61c8bcb..8fff92a 100644
--- a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/RemoteCollectionItems.kt
+++ b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/RemoteCollectionItems.kt
@@ -18,6 +18,7 @@
import android.annotation.SuppressLint
import android.widget.RemoteViews
+import androidx.compose.ui.util.fastMap
/** Representation of a fixed list of items to be displayed in a RemoteViews collection. */
internal class RemoteCollectionItems private constructor(
@@ -31,6 +32,7 @@
"RemoteCollectionItems has different number of ids and views"
}
require(_viewTypeCount >= 1) { "View type count must be >= 1" }
+ @Suppress("ListIterator")
val layoutIdCount = views.map { it.layoutId }.distinct().count()
require(layoutIdCount <= _viewTypeCount) {
"View type count is set to $_viewTypeCount, but the collection contains " +
@@ -131,7 +133,8 @@
if (viewTypeCount < 1) {
// If a view type count wasn't specified, set it to be the number of distinct
// layout ids used in the items.
- viewTypeCount = views.map { it.layoutId }.distinct().count()
+ @Suppress("ListIterator")
+ viewTypeCount = views.fastMap { it.layoutId }.distinct().count()
}
return RemoteCollectionItems(
ids.toLongArray(),
diff --git a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/RemoteViewsRoot.kt b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/RemoteViewsRoot.kt
index df0e178..7ca531c 100644
--- a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/RemoteViewsRoot.kt
+++ b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/RemoteViewsRoot.kt
@@ -18,6 +18,7 @@
import androidx.annotation.RestrictTo
import androidx.annotation.RestrictTo.Scope
+import androidx.compose.ui.util.fastMap
import androidx.glance.Emittable
import androidx.glance.EmittableWithChildren
import androidx.glance.GlanceModifier
@@ -31,7 +32,7 @@
override var modifier: GlanceModifier = GlanceModifier
override fun copy(): Emittable = RemoteViewsRoot(maxDepth).also {
it.modifier = modifier
- it.children.addAll(children.map { it.copy() })
+ it.children.addAll(children.fastMap { it.copy() })
}
override fun toString(): String = "RemoteViewsRoot(" +
diff --git a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/RemoteViewsTranslator.kt b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/RemoteViewsTranslator.kt
index d94e52f..edb9d83 100644
--- a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/RemoteViewsTranslator.kt
+++ b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/RemoteViewsTranslator.kt
@@ -31,6 +31,10 @@
import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.isSpecified
+import androidx.compose.ui.util.fastAll
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastForEachIndexed
+import androidx.compose.ui.util.fastMap
import androidx.core.widget.RemoteViewsCompat.setLinearLayoutGravity
import androidx.glance.Emittable
import androidx.glance.EmittableButton
@@ -105,13 +109,13 @@
children: List<Emittable>,
rootViewIndex: Int
): RemoteViews {
- if (children.all { it is EmittableSizeBox }) {
+ if (children.fastAll { it is EmittableSizeBox }) {
// If the children of root are all EmittableSizeBoxes, then we must translate each
// EmittableSizeBox into a distinct RemoteViews object. Then, we combine them into one
// multi-sized RemoteViews (a RemoteViews that contains either landscape & portrait RVs or
// multiple RVs mapped by size).
val sizeMode = (children.first() as EmittableSizeBox).sizeMode
- val views = children.map { child ->
+ val views = children.fastMap { child ->
val size = (child as EmittableSizeBox).size
val remoteViewsInfo = createRootView(translationContext, child.modifier, rootViewIndex)
val rv = remoteViewsInfo.remoteViews.apply {
@@ -126,10 +130,11 @@
is SizeMode.Single -> views.single().second
is SizeMode.Responsive, SizeMode.Exact -> {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ @Suppress("ListIterator")
Api31Impl.createRemoteViews(views.toMap())
} else {
require(views.size == 1 || views.size == 2) { "unsupported views size" }
- combineLandscapeAndPortrait(views.map { it.second })
+ combineLandscapeAndPortrait(views.fastMap { it.second })
}
}
}
@@ -307,7 +312,7 @@
element.modifier,
viewDef
)
- element.children.forEach {
+ element.children.fastForEach {
it.modifier = it.modifier.then(AlignmentModifier(element.contentAlignment))
}
setChildren(
@@ -392,6 +397,7 @@
}
private fun checkSelectableGroupChildren(children: List<Emittable>) {
+ @Suppress("ListIterator")
check(children.count { it is EmittableRadioButton && it.checked } <= 1) {
"When using GlanceModifier.selectableGroup(), no more than one RadioButton " +
"may be checked at a time."
@@ -410,7 +416,7 @@
}
element.remoteViews.copy().apply {
removeAllViews(element.containerViewId)
- element.children.forEachIndexed { index, child ->
+ element.children.fastForEachIndexed { index, child ->
val rvInfo = createRootView(translationContext, child.modifier, index)
val rv = rvInfo.remoteViews
rv.translateChild(translationContext.forRoot(rvInfo), child)
@@ -466,7 +472,8 @@
parentDef: InsertedViewInfo,
children: List<Emittable>
) {
- children.take(10).forEachIndexed { index, child ->
+ @Suppress("ListIterator")
+ children.take(10).fastForEachIndexed { index, child ->
translateChild(
translationContext.forChild(parent = parentDef, pos = index),
child,
diff --git a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/SizeBox.kt b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/SizeBox.kt
index 4c41537..e1727c0 100644
--- a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/SizeBox.kt
+++ b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/SizeBox.kt
@@ -20,6 +20,7 @@
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.unit.DpSize
+import androidx.compose.ui.util.fastMap
import androidx.glance.Emittable
import androidx.glance.EmittableWithChildren
import androidx.glance.GlanceModifier
@@ -48,7 +49,7 @@
override fun copy(): Emittable = EmittableSizeBox().also {
it.size = size
it.sizeMode = sizeMode
- it.children.addAll(children.map { it.copy() })
+ it.children.addAll(children.fastMap { it.copy() })
}
override fun toString(): String = "EmittableSizeBox(" +
@@ -106,11 +107,11 @@
} else {
val smallestSize = sizeMode.sizes.sortedBySize()[0]
LocalAppWidgetOptions.current.extractOrientationSizes()
- .map { findBestSize(it, sizeMode.sizes) ?: smallestSize }
+ .fastMap { findBestSize(it, sizeMode.sizes) ?: smallestSize }
.ifEmpty { listOf(smallestSize, smallestSize) }
}
}
- sizes.distinct().map { size ->
+ sizes.distinct().fastMap { size ->
SizeBox(size, sizeMode, content)
}
}
diff --git a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/WidgetLayout.kt b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/WidgetLayout.kt
index 49e0d30..bae572a 100644
--- a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/WidgetLayout.kt
+++ b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/WidgetLayout.kt
@@ -22,6 +22,7 @@
import androidx.annotation.DoNotInline
import androidx.annotation.RequiresApi
import androidx.annotation.VisibleForTesting
+import androidx.compose.ui.util.fastMap
import androidx.datastore.core.CorruptionException
import androidx.datastore.core.DataStore
import androidx.datastore.core.DataStoreFactory
@@ -114,6 +115,7 @@
)
LayoutProto.LayoutConfig.getDefaultInstance()
}
+ @Suppress("ListIterator")
val layouts = config.layoutList.associate {
it.layout to it.layoutIndex
}.toMutableMap()
@@ -241,7 +243,7 @@
is EmittableLazyColumn -> setLazyListColumn(element)
}
if (element is EmittableWithChildren && element !is EmittableLazyList) {
- addAllChildren(element.children.map { createNode(context, it) })
+ addAllChildren(element.children.fastMap { createNode(context, it) })
}
}.build()
diff --git a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/lazy/LazyList.kt b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/lazy/LazyList.kt
index 2430387..17e4528 100644
--- a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/lazy/LazyList.kt
+++ b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/lazy/LazyList.kt
@@ -19,6 +19,8 @@
import android.os.Bundle
import androidx.compose.runtime.Composable
import androidx.compose.runtime.key
+import androidx.compose.ui.util.fastForEachIndexed
+import androidx.compose.ui.util.fastMap
import androidx.glance.Emittable
import androidx.glance.EmittableLazyItemWithChildren
import androidx.glance.EmittableWithChildren
@@ -121,7 +123,7 @@
}
listScopeImpl.apply(content)
return {
- itemList.forEachIndexed { index, (itemId, composable) ->
+ itemList.fastForEachIndexed { index, (itemId, composable) ->
val id = itemId.takeIf { it != LazyListScope.UnspecifiedItemId }
?: (ReservedItemIdRangeEnd - index)
check(id != LazyListScope.UnspecifiedItemId) { "Implicit list item ids exhausted." }
@@ -297,7 +299,7 @@
override fun copy(): Emittable = EmittableLazyListItem().also {
it.itemId = itemId
it.alignment = alignment
- it.children.addAll(children.map { it.copy() })
+ it.children.addAll(children.fastMap { it.copy() })
}
override fun toString() =
@@ -310,6 +312,6 @@
it.modifier = modifier
it.horizontalAlignment = horizontalAlignment
it.activityOptions = activityOptions
- it.children.addAll(children.map { it.copy() })
+ it.children.addAll(children.fastMap { it.copy() })
}
}
diff --git a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/lazy/LazyVerticalGrid.kt b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/lazy/LazyVerticalGrid.kt
index 53a41ce..72b8eb4 100644
--- a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/lazy/LazyVerticalGrid.kt
+++ b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/lazy/LazyVerticalGrid.kt
@@ -20,6 +20,8 @@
import androidx.compose.runtime.Composable
import androidx.compose.runtime.key
import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.util.fastForEachIndexed
+import androidx.compose.ui.util.fastMap
import androidx.glance.Emittable
import androidx.glance.EmittableLazyItemWithChildren
import androidx.glance.EmittableWithChildren
@@ -128,7 +130,7 @@
}
listScopeImpl.apply(content)
return {
- itemList.forEachIndexed { index, (itemId, composable) ->
+ itemList.fastForEachIndexed { index, (itemId, composable) ->
val id = itemId.takeIf { it != LazyVerticalGridScope.UnspecifiedItemId }
?: (ReservedItemIdRangeEnd - index)
check(id != LazyVerticalGridScope.UnspecifiedItemId) {
@@ -298,7 +300,7 @@
override fun copy(): Emittable = EmittableLazyVerticalGridListItem().also {
it.itemId = itemId
it.alignment = alignment
- it.children.addAll(children.map { it.copy() })
+ it.children.addAll(children.fastMap { it.copy() })
}
override fun toString(): String =
@@ -314,7 +316,7 @@
it.horizontalAlignment = horizontalAlignment
it.gridCells = gridCells
it.activityOptions = activityOptions
- it.children.addAll(children.map { it.copy() })
+ it.children.addAll(children.fastMap { it.copy() })
}
}
diff --git a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/translators/LazyListTranslator.kt b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/translators/LazyListTranslator.kt
index 4810dd6..eb1c6fe 100644
--- a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/translators/LazyListTranslator.kt
+++ b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/translators/LazyListTranslator.kt
@@ -75,6 +75,7 @@
)
val items = RemoteCollectionItems.Builder().apply {
val childContext = translationContext.forLazyCollection(viewDef.mainViewId)
+ @Suppress("ListIterator")
element.children.foldIndexed(false) { position, previous, itemEmittable ->
itemEmittable as EmittableLazyListItem
val itemId = itemEmittable.itemId
diff --git a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/translators/LazyVerticalGridTranslator.kt b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/translators/LazyVerticalGridTranslator.kt
index eda245b..d9b74d0 100644
--- a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/translators/LazyVerticalGridTranslator.kt
+++ b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/translators/LazyVerticalGridTranslator.kt
@@ -88,6 +88,7 @@
)
val items = RemoteCollectionItems.Builder().apply {
val childContext = translationContext.forLazyCollection(viewDef.mainViewId)
+ @Suppress("ListIterator")
element.children.foldIndexed(false) { position, previous, itemEmittable ->
itemEmittable as EmittableLazyVerticalGridListItem
val itemId = itemEmittable.itemId
diff --git a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/translators/TextTranslator.kt b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/translators/TextTranslator.kt
index 6a219a7..806a7cc 100644
--- a/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/translators/TextTranslator.kt
+++ b/glance/glance-appwidget/src/main/java/androidx/glance/appwidget/translators/TextTranslator.kt
@@ -35,6 +35,7 @@
import androidx.annotation.DoNotInline
import androidx.annotation.RequiresApi
import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.util.fastForEach
import androidx.core.widget.RemoteViewsCompat.setTextViewGravity
import androidx.core.widget.RemoteViewsCompat.setTextViewMaxLines
import androidx.core.widget.RemoteViewsCompat.setTextViewTextColor
@@ -130,7 +131,7 @@
spans.add(AlignmentSpan.Standard(align.toAlignment(translationContext.isRtl)))
}
}
- spans.forEach { span ->
+ spans.fastForEach { span ->
content.setSpan(span, 0, length, Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
}
setTextViewText(resId, content)
diff --git a/glance/glance-template/lint-baseline.xml b/glance/glance-template/lint-baseline.xml
deleted file mode 100644
index 8a73870..0000000
--- a/glance/glance-template/lint-baseline.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="cli" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" textList.forEachIndexed { index, item ->"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/glance/template/GlanceAppWidgetTemplates.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" actionBlock.actionButtons.forEach { button ->"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/glance/template/GlanceAppWidgetTemplates.kt"/>
- </issue>
-
-</issues>
diff --git a/glance/glance-template/src/main/java/androidx/glance/template/GlanceAppWidgetTemplates.kt b/glance/glance-template/src/main/java/androidx/glance/template/GlanceAppWidgetTemplates.kt
index d5804bd..9937ec6 100644
--- a/glance/glance-template/src/main/java/androidx/glance/template/GlanceAppWidgetTemplates.kt
+++ b/glance/glance-template/src/main/java/androidx/glance/template/GlanceAppWidgetTemplates.kt
@@ -104,6 +104,7 @@
*
* @param textList the ordered list of text fields to display in the block
*/
+@Suppress("ListIterator")
@Composable
internal fun AppWidgetTextSection(textList: List<TemplateText>) {
if (textList.isEmpty()) return
@@ -217,6 +218,7 @@
*
* @param actionBlock The [ActionBlock] data containing a list of buttons for display
*/
+@Suppress("ListIterator")
@Composable
internal fun ActionBlockTemplate(actionBlock: ActionBlock?) {
if (actionBlock?.actionButtons?.isNotEmpty() == true) {
diff --git a/glance/glance-testing/lint-baseline.xml b/glance/glance-testing/lint-baseline.xml
deleted file mode 100644
index c7ffb94..0000000
--- a/glance/glance-testing/lint-baseline.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" return emittable.children.map { child ->"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/testing/unit/GlanceMappedNode.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" for (child in node.children()) {"
- errorLine2=" ~~">
- <location
- file="src/main/java/androidx/glance/testing/GlanceNodeAssertion.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" return matching.toList()"
- errorLine2=" ~~~~~~">
- <location
- file="src/main/java/androidx/glance/testing/GlanceNodeAssertion.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" ?.joinToString()"
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/glance/testing/unit/UnitTestFilters.kt"/>
- </issue>
-
-</issues>
diff --git a/glance/glance-testing/src/main/java/androidx/glance/testing/GlanceNodeAssertion.kt b/glance/glance-testing/src/main/java/androidx/glance/testing/GlanceNodeAssertion.kt
index 31a1c99..ed47355 100644
--- a/glance/glance-testing/src/main/java/androidx/glance/testing/GlanceNodeAssertion.kt
+++ b/glance/glance-testing/src/main/java/androidx/glance/testing/GlanceNodeAssertion.kt
@@ -118,6 +118,7 @@
return testContext.cachedMatchedNodes
}
+ @Suppress("ListIterator")
private fun findMatchingNodes(node: GlanceNode<R>): List<GlanceNode<R>> {
val matching = mutableListOf<GlanceNode<R>>()
if (matcher.matches(node)) {
diff --git a/glance/glance-testing/src/main/java/androidx/glance/testing/unit/GlanceMappedNode.kt b/glance/glance-testing/src/main/java/androidx/glance/testing/unit/GlanceMappedNode.kt
index 8b20029..0ac92ee 100644
--- a/glance/glance-testing/src/main/java/androidx/glance/testing/unit/GlanceMappedNode.kt
+++ b/glance/glance-testing/src/main/java/androidx/glance/testing/unit/GlanceMappedNode.kt
@@ -59,6 +59,7 @@
@RestrictTo(Scope.LIBRARY_GROUP)
override fun children(): List<GlanceNode<MappedNode>> {
val emittable = mappedNode.emittable
+ @Suppress("ListIterator")
if (emittable is EmittableWithChildren) {
return emittable.children.map { child ->
GlanceMappedNode(child)
diff --git a/glance/glance-testing/src/main/java/androidx/glance/testing/unit/UnitTestFilters.kt b/glance/glance-testing/src/main/java/androidx/glance/testing/unit/UnitTestFilters.kt
index 1e3d858..577caa5 100644
--- a/glance/glance-testing/src/main/java/androidx/glance/testing/unit/UnitTestFilters.kt
+++ b/glance/glance-testing/src/main/java/androidx/glance/testing/unit/UnitTestFilters.kt
@@ -93,6 +93,7 @@
substring: Boolean = false,
ignoreCase: Boolean = false
): Boolean {
+ @Suppress("ListIterator")
val contentDescription =
semanticsModifier.configuration.getOrNull(SemanticsProperties.ContentDescription)
?.joinToString()
diff --git a/glance/glance-wear-tiles-preview/lint-baseline.xml b/glance/glance-wear-tiles-preview/lint-baseline.xml
deleted file mode 100644
index d2965f7..0000000
--- a/glance/glance-wear-tiles-preview/lint-baseline.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .all { it }"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/wear/tiles/preview/ComposableInvoker.kt"/>
- </issue>
-
-</issues>
diff --git a/glance/glance-wear-tiles-preview/src/main/java/androidx/glance/wear/tiles/preview/ComposableInvoker.kt b/glance/glance-wear-tiles-preview/src/main/java/androidx/glance/wear/tiles/preview/ComposableInvoker.kt
index 2105f3c..dcfe376 100644
--- a/glance/glance-wear-tiles-preview/src/main/java/androidx/glance/wear/tiles/preview/ComposableInvoker.kt
+++ b/glance/glance-wear-tiles-preview/src/main/java/androidx/glance/wear/tiles/preview/ComposableInvoker.kt
@@ -33,6 +33,7 @@
* Returns true if the [methodTypes] and [actualTypes] are compatible. This means that every
* `actualTypes[n]` are assignable to `methodTypes[n]`.
*/
+ @Suppress("ListIterator")
private fun compatibleTypes(
methodTypes: Array<Class<*>>,
actualTypes: Array<Class<*>>
diff --git a/glance/glance-wear-tiles/lint-baseline.xml b/glance/glance-wear-tiles/lint-baseline.xml
deleted file mode 100644
index 5a135eb..0000000
--- a/glance/glance-wear-tiles/lint-baseline.xml
+++ /dev/null
@@ -1,130 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" curvedChildList.forEach { composable ->"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/glance/wear/tiles/curved/CurvedRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" it.children.addAll(children.map { it.copy() })"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/wear/tiles/curved/CurvedRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" it.children.addAll(children.map { it.copy() })"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/wear/tiles/curved/CurvedRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" children.mapIndexed { index, child ->"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/main/java/androidx/glance/wear/tiles/NormalizeCompositionTree.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" toDelete.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/glance/wear/tiles/NormalizeCompositionTree.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" children.forEach { child ->"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/glance/wear/tiles/NormalizeCompositionTree.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" textList.forEach { item ->"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/glance/wear/tiles/template/SingleEntityTemplateLayouts.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .setContentDescription(it.joinToString())"
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/glance/wear/tiles/WearCompositionTranslator.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .setContentDescription(it.joinToString())"
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/glance/wear/tiles/WearCompositionTranslator.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" element.children.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/glance/wear/tiles/WearCompositionTranslator.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" element.children.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/glance/wear/tiles/WearCompositionTranslator.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" element.children.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/glance/wear/tiles/WearCompositionTranslator.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" element.children.forEach { curvedChild ->"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/glance/wear/tiles/WearCompositionTranslator.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" curvedChild.children.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/glance/wear/tiles/WearCompositionTranslator.kt"/>
- </issue>
-
-</issues>
diff --git a/glance/glance-wear-tiles/src/main/java/androidx/glance/wear/tiles/NormalizeCompositionTree.kt b/glance/glance-wear-tiles/src/main/java/androidx/glance/wear/tiles/NormalizeCompositionTree.kt
index 557632d..8666f31 100644
--- a/glance/glance-wear-tiles/src/main/java/androidx/glance/wear/tiles/NormalizeCompositionTree.kt
+++ b/glance/glance-wear-tiles/src/main/java/androidx/glance/wear/tiles/NormalizeCompositionTree.kt
@@ -20,6 +20,8 @@
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastMapIndexed
import androidx.glance.AndroidResourceImageProvider
import androidx.glance.BitmapImageProvider
import androidx.glance.Emittable
@@ -53,7 +55,7 @@
/** Transform each node in the tree. */
private fun EmittableWithChildren.transformTree(block: (Emittable) -> Emittable?) {
val toDelete = mutableListOf<Int>()
- children.mapIndexed { index, child ->
+ children.fastMapIndexed { index, child ->
val newChild = block(child)
if (newChild == null) {
toDelete += index
@@ -63,7 +65,7 @@
if (newChild is EmittableWithChildren) newChild.transformTree(block)
}
toDelete.reverse()
- toDelete.forEach {
+ toDelete.fastForEach {
children.removeAt(it)
}
}
@@ -86,7 +88,7 @@
return when (this) {
is EmittableWithChildren -> {
modifier = GlanceModifier.then(WidthModifier(width)).then(HeightModifier(height))
- children.forEach { child ->
+ children.fastForEach { child ->
val visibility =
child.modifier.findModifier<VisibilityModifier>()?.visibility
?: Visibility.Visible
diff --git a/glance/glance-wear-tiles/src/main/java/androidx/glance/wear/tiles/WearCompositionTranslator.kt b/glance/glance-wear-tiles/src/main/java/androidx/glance/wear/tiles/WearCompositionTranslator.kt
index 3d90666..99565c4 100644
--- a/glance/glance-wear-tiles/src/main/java/androidx/glance/wear/tiles/WearCompositionTranslator.kt
+++ b/glance/glance-wear-tiles/src/main/java/androidx/glance/wear/tiles/WearCompositionTranslator.kt
@@ -23,6 +23,8 @@
import android.view.ViewGroup
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastJoinToString
import androidx.glance.AndroidResourceImageProvider
import androidx.glance.BackgroundModifier
import androidx.glance.BitmapImageProvider
@@ -146,7 +148,7 @@
private fun SemanticsModifier.toProto(): androidx.wear.tiles.ModifiersBuilders.Semantics? =
this.configuration.getOrNull(SemanticsProperties.ContentDescription)?.let {
androidx.wear.tiles.ModifiersBuilders.Semantics.Builder()
- .setContentDescription(it.joinToString())
+ .setContentDescription(it.fastJoinToString())
.build()
}
@@ -154,7 +156,7 @@
private fun SemanticsCurvedModifier.toProto(): androidx.wear.tiles.ModifiersBuilders.Semantics? =
this.configuration.getOrNull(SemanticsProperties.ContentDescription)?.let {
androidx.wear.tiles.ModifiersBuilders.Semantics.Builder()
- .setContentDescription(it.joinToString())
+ .setContentDescription(it.fastJoinToString())
.build()
}
@@ -329,7 +331,7 @@
.setWidth(element.modifier.getWidth(context).toContainerDimension())
.setHeight(element.modifier.getHeight(context).toContainerDimension())
.also { box ->
- element.children.forEach {
+ element.children.fastForEach {
box.addContent(translateComposition(context, resourceBuilder, it))
}
}
@@ -349,7 +351,7 @@
.setHeight(height.toContainerDimension())
.setVerticalAlignment(element.verticalAlignment.toProto())
.also { row ->
- element.children.forEach {
+ element.children.fastForEach {
row.addContent(translateComposition(context, resourceBuilder, it))
}
}
@@ -389,7 +391,7 @@
.setWidth(width.toContainerDimension())
.setHorizontalAlignment(element.horizontalAlignment.toProto())
.also { column ->
- element.children.forEach {
+ element.children.fastForEach {
column.addContent(translateComposition(context, resourceBuilder, it))
}
}
@@ -635,9 +637,9 @@
.setVerticalAlign(element.radialAlignment.toProto())
// Add all the children first...
- element.children.forEach { curvedChild ->
+ element.children.fastForEach { curvedChild ->
if (curvedChild is EmittableCurvedChild) {
- curvedChild.children.forEach {
+ curvedChild.children.fastForEach {
arcBuilder.addContent(
translateEmittableElementInArc(
context,
diff --git a/glance/glance-wear-tiles/src/main/java/androidx/glance/wear/tiles/curved/CurvedRow.kt b/glance/glance-wear-tiles/src/main/java/androidx/glance/wear/tiles/curved/CurvedRow.kt
index 58489b1..06e5801 100644
--- a/glance/glance-wear-tiles/src/main/java/androidx/glance/wear/tiles/curved/CurvedRow.kt
+++ b/glance/glance-wear-tiles/src/main/java/androidx/glance/wear/tiles/curved/CurvedRow.kt
@@ -18,6 +18,8 @@
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastMap
import androidx.glance.Emittable
import androidx.glance.EmittableWithChildren
import androidx.glance.GlanceModifier
@@ -123,7 +125,7 @@
curvedScopeImpl.apply(content)
return {
- curvedChildList.forEach { composable ->
+ curvedChildList.fastForEach { composable ->
object : CurvedChildScope {}.apply { composable() }
}
}
@@ -155,7 +157,7 @@
it.anchorDegrees = anchorDegrees
it.anchorType = anchorType
it.radialAlignment = radialAlignment
- it.children.addAll(children.map { it.copy() })
+ it.children.addAll(children.fastMap { it.copy() })
}
override fun toString(): String =
@@ -171,7 +173,7 @@
override fun copy(): Emittable = EmittableCurvedChild().also {
it.modifier = modifier
it.rotateContent = rotateContent
- it.children.addAll(children.map { it.copy() })
+ it.children.addAll(children.fastMap { it.copy() })
}
override fun toString(): String = "EmittableCurvedChild(" +
diff --git a/glance/glance-wear-tiles/src/main/java/androidx/glance/wear/tiles/template/SingleEntityTemplateLayouts.kt b/glance/glance-wear-tiles/src/main/java/androidx/glance/wear/tiles/template/SingleEntityTemplateLayouts.kt
index 8d5016b..f22097a 100644
--- a/glance/glance-wear-tiles/src/main/java/androidx/glance/wear/tiles/template/SingleEntityTemplateLayouts.kt
+++ b/glance/glance-wear-tiles/src/main/java/androidx/glance/wear/tiles/template/SingleEntityTemplateLayouts.kt
@@ -114,6 +114,7 @@
}
}
+@Suppress("ListIterator")
@Composable
private fun TextSection(textList: List<TemplateText>) {
if (textList.isEmpty()) return
diff --git a/glance/glance/build.gradle b/glance/glance/build.gradle
index 0a8e136..a27703a 100644
--- a/glance/glance/build.gradle
+++ b/glance/glance/build.gradle
@@ -25,6 +25,7 @@
dependencies {
+ api(project(":compose:ui:ui-util"))
api("androidx.annotation:annotation:1.2.0")
api("androidx.compose.runtime:runtime:1.2.1")
api("androidx.compose.ui:ui-graphics:1.1.1")
diff --git a/glance/glance/lint-baseline.xml b/glance/glance/lint-baseline.xml
index d2fb308..362729b4 100644
--- a/glance/glance/lint-baseline.xml
+++ b/glance/glance/lint-baseline.xml
@@ -20,87 +20,6 @@
</issue>
<issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" it.children.addAll(children.map { it.copy() })"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/layout/Box.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" it.children.addAll(children.map { it.copy() })"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/layout/Column.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" children.joinToString(",\n").prependIndent(" ")"
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/glance/Emittables.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" events.forEach { addAction(it) }"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/glance/session/IdleEventBroadcastReceiver.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" fold(0.dp) { acc, res ->"
- errorLine2=" ~~~~">
- <location
- file="src/main/java/androidx/glance/layout/Padding.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" it.children.addAll(children.map { it.copy() })"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/layout/Row.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .any { it.state == WorkInfo.State.RUNNING } && synchronized(sessions) {"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/glance/session/SessionManager.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val mask = decorations.fold(0) { acc, decoration ->"
- errorLine2=" ~~~~">
- <location
- file="src/main/java/androidx/glance/text/TextDecoration.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" return "TextDecoration[${values.joinToString(separator = ", ")}]""
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/glance/text/TextDecoration.kt"/>
- </issue>
-
- <issue
id="PrimitiveInLambda"
message="Use a functional interface instead of lambda syntax for lambdas with primitive values in constructor InteractiveFrameClock has parameter 'nanoTime' with type Function0<Long>."
errorLine1=" private val nanoTime: () -> Long = { System.nanoTime() }"
diff --git a/glance/glance/src/main/java/androidx/glance/Emittables.kt b/glance/glance/src/main/java/androidx/glance/Emittables.kt
index b9cf2f2..84d50c2 100644
--- a/glance/glance/src/main/java/androidx/glance/Emittables.kt
+++ b/glance/glance/src/main/java/androidx/glance/Emittables.kt
@@ -17,6 +17,7 @@
package androidx.glance
import androidx.annotation.RestrictTo
+import androidx.compose.ui.util.fastJoinToString
import androidx.glance.layout.Alignment
import androidx.glance.text.TextStyle
@@ -34,7 +35,7 @@
val children: MutableList<Emittable> = mutableListOf<Emittable>()
protected fun childrenToString(): String =
- children.joinToString(",\n").prependIndent(" ")
+ children.fastJoinToString(",\n").prependIndent(" ")
}
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
diff --git a/glance/glance/src/main/java/androidx/glance/layout/Box.kt b/glance/glance/src/main/java/androidx/glance/layout/Box.kt
index acc6c2e..9392c48 100644
--- a/glance/glance/src/main/java/androidx/glance/layout/Box.kt
+++ b/glance/glance/src/main/java/androidx/glance/layout/Box.kt
@@ -18,6 +18,7 @@
import androidx.annotation.RestrictTo
import androidx.compose.runtime.Composable
+import androidx.compose.ui.util.fastMap
import androidx.glance.Emittable
import androidx.glance.EmittableWithChildren
import androidx.glance.GlanceModifier
@@ -32,7 +33,7 @@
override fun copy(): Emittable = EmittableBox().also {
it.modifier = modifier
it.contentAlignment = contentAlignment
- it.children.addAll(children.map { it.copy() })
+ it.children.addAll(children.fastMap { it.copy() })
}
override fun toString(): String = "EmittableBox(" +
diff --git a/glance/glance/src/main/java/androidx/glance/layout/Column.kt b/glance/glance/src/main/java/androidx/glance/layout/Column.kt
index 6e1e4e1..d489c7f 100644
--- a/glance/glance/src/main/java/androidx/glance/layout/Column.kt
+++ b/glance/glance/src/main/java/androidx/glance/layout/Column.kt
@@ -18,6 +18,7 @@
import androidx.annotation.RestrictTo
import androidx.compose.runtime.Composable
+import androidx.compose.ui.util.fastMap
import androidx.glance.Emittable
import androidx.glance.EmittableWithChildren
import androidx.glance.GlanceModifier
@@ -34,7 +35,7 @@
it.modifier = modifier
it.verticalAlignment = verticalAlignment
it.horizontalAlignment = horizontalAlignment
- it.children.addAll(children.map { it.copy() })
+ it.children.addAll(children.fastMap { it.copy() })
}
override fun toString(): String = "EmittableColumn(" +
diff --git a/glance/glance/src/main/java/androidx/glance/layout/Padding.kt b/glance/glance/src/main/java/androidx/glance/layout/Padding.kt
index a5027be..95ebe2c 100644
--- a/glance/glance/src/main/java/androidx/glance/layout/Padding.kt
+++ b/glance/glance/src/main/java/androidx/glance/layout/Padding.kt
@@ -20,6 +20,7 @@
import androidx.annotation.RestrictTo
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastFold
import androidx.glance.GlanceModifier
/**
@@ -193,7 +194,7 @@
collectPadding()?.toDp(resources)
private fun List<Int>.toDp(resources: Resources) =
- fold(0.dp) { acc, res ->
+ fastFold(0.dp) { acc, res ->
acc + (resources.getDimension(res) / resources.displayMetrics.density).dp
}
diff --git a/glance/glance/src/main/java/androidx/glance/layout/Row.kt b/glance/glance/src/main/java/androidx/glance/layout/Row.kt
index 4fe0201..fa7bb50 100644
--- a/glance/glance/src/main/java/androidx/glance/layout/Row.kt
+++ b/glance/glance/src/main/java/androidx/glance/layout/Row.kt
@@ -18,6 +18,7 @@
import androidx.annotation.RestrictTo
import androidx.compose.runtime.Composable
+import androidx.compose.ui.util.fastMap
import androidx.glance.Emittable
import androidx.glance.EmittableWithChildren
import androidx.glance.GlanceModifier
@@ -34,7 +35,7 @@
it.modifier = modifier
it.horizontalAlignment = horizontalAlignment
it.verticalAlignment = verticalAlignment
- it.children.addAll(children.map { it.copy() })
+ it.children.addAll(children.fastMap { it.copy() })
}
override fun toString(): String = "EmittableRow(" +
diff --git a/glance/glance/src/main/java/androidx/glance/session/IdleEventBroadcastReceiver.kt b/glance/glance/src/main/java/androidx/glance/session/IdleEventBroadcastReceiver.kt
index 7929994..5801903 100644
--- a/glance/glance/src/main/java/androidx/glance/session/IdleEventBroadcastReceiver.kt
+++ b/glance/glance/src/main/java/androidx/glance/session/IdleEventBroadcastReceiver.kt
@@ -34,6 +34,7 @@
PowerManager.ACTION_DEVICE_LIGHT_IDLE_MODE_CHANGED,
PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED
)
+ @Suppress("ListIterator")
val filter = IntentFilter().apply {
events.forEach { addAction(it) }
}
diff --git a/glance/glance/src/main/java/androidx/glance/session/SessionManager.kt b/glance/glance/src/main/java/androidx/glance/session/SessionManager.kt
index 5b83da2..3213cd3 100644
--- a/glance/glance/src/main/java/androidx/glance/session/SessionManager.kt
+++ b/glance/glance/src/main/java/androidx/glance/session/SessionManager.kt
@@ -96,6 +96,7 @@
}
override suspend fun isSessionRunning(context: Context, key: String) =
+ @Suppress("ListIterator")
(WorkManager.getInstance(context).getWorkInfosForUniqueWork(key).await()
.any { it.state == WorkInfo.State.RUNNING } && synchronized(sessions) {
sessions.containsKey(key)
diff --git a/glance/glance/src/main/java/androidx/glance/text/TextDecoration.kt b/glance/glance/src/main/java/androidx/glance/text/TextDecoration.kt
index 6f100c0..386a8e2 100644
--- a/glance/glance/src/main/java/androidx/glance/text/TextDecoration.kt
+++ b/glance/glance/src/main/java/androidx/glance/text/TextDecoration.kt
@@ -17,6 +17,8 @@
package androidx.glance.text
import androidx.compose.runtime.Stable
+import androidx.compose.ui.util.fastFold
+import androidx.compose.ui.util.fastJoinToString
/**
* Defines a horizontal line to be drawn on the text.
@@ -44,7 +46,7 @@
* @param decorations The decorations to be added
*/
fun combine(decorations: List<TextDecoration>): TextDecoration {
- val mask = decorations.fold(0) { acc, decoration ->
+ val mask = decorations.fastFold(0) { acc, decoration ->
acc or decoration.mask
}
return TextDecoration(mask)
@@ -81,6 +83,6 @@
if ((values.size == 1)) {
return "TextDecoration.${values[0]}"
}
- return "TextDecoration[${values.joinToString(separator = ", ")}]"
+ return "TextDecoration[${values.fastJoinToString(separator = ", ")}]"
}
}
diff --git a/text/text/lint-baseline.xml b/text/text/lint-baseline.xml
deleted file mode 100644
index 7bcb892..0000000
--- a/text/text/lint-baseline.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
-
- <issue
- id="BanInlineOptIn"
- message="Inline functions cannot opt into experimental APIs."
- errorLine1="internal inline fun <T> List<T>.fastForEach(action: (T) -> Unit) {"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/compose/ui/text/android/TempListUtils.kt"/>
- </issue>
-
- <issue
- id="BanInlineOptIn"
- message="Inline functions cannot opt into experimental APIs."
- errorLine1="internal inline fun <T, R, C : MutableCollection<in R>> List<T>.fastMapTo("
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/main/java/androidx/compose/ui/text/android/TempListUtils.kt"/>
- </issue>
-
- <issue
- id="BanInlineOptIn"
- message="Inline functions cannot opt into experimental APIs."
- errorLine1="internal inline fun <T, R> List<T>.fastZipWithNext(transform: (T, T) -> R): List<R> {"
- errorLine2=" ~~~~~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/compose/ui/text/android/TempListUtils.kt"/>
- </issue>
-
-</issues>
diff --git a/tv/tv-foundation/build.gradle b/tv/tv-foundation/build.gradle
index 96e8a5e..d99a8ab 100644
--- a/tv/tv-foundation/build.gradle
+++ b/tv/tv-foundation/build.gradle
@@ -40,11 +40,11 @@
api("androidx.compose.runtime:runtime:$composeVersion")
api(project(":compose:foundation:foundation"))
+ api(project(":compose:ui:ui-util"))
api("androidx.compose.ui:ui:$composeVersion")
api("androidx.compose.foundation:foundation-layout:$composeVersion")
api("androidx.compose.ui:ui-graphics:$composeVersion")
api("androidx.compose.ui:ui-text:$composeVersion")
- api("androidx.compose.ui:ui-util:$composeVersion")
androidTestImplementation(libs.truth)
androidTestImplementation(project(":compose:runtime:runtime"))
diff --git a/tv/tv-material/lint-baseline.xml b/tv/tv-material/lint-baseline.xml
index 5087d0f..68659db 100644
--- a/tv/tv-material/lint-baseline.xml
+++ b/tv/tv-material/lint-baseline.xml
@@ -1,50 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" tabMeasurables.map { it.measure(constraints.copy(minWidth = 0, minHeight = 0)) }"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/tv/material3/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" separatorMeasurables.map {"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/tv/material3/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" (tabMeasurables.maxOfOrNull { it.maxIntrinsicHeight(Constraints.Infinity) } ?: 0)"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/tv/material3/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" tabPlaceables.forEachIndexed { index, tabPlaceable ->"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/tv/material3/TabRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/tv/material3/TabRow.kt"/>
- </issue>
+<issues format="6" by="lint 8.1.0-beta05" type="baseline" client="gradle" dependencies="false" name="AGP (8.1.0-beta05)" variant="all" version="8.1.0-beta05">
<issue
id="PrimitiveInLambda"
diff --git a/tv/tv-material/src/main/java/androidx/tv/material3/TabRow.kt b/tv/tv-material/src/main/java/androidx/tv/material3/TabRow.kt
index 7fb80c5..a76a111 100644
--- a/tv/tv-material/src/main/java/androidx/tv/material3/TabRow.kt
+++ b/tv/tv-material/src/main/java/androidx/tv/material3/TabRow.kt
@@ -49,6 +49,10 @@
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.height
import androidx.compose.ui.unit.width
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastForEachIndexed
+import androidx.compose.ui.util.fastMap
+import androidx.compose.ui.util.fastMaxOfOrNull
import androidx.compose.ui.zIndex
/**
@@ -119,7 +123,7 @@
// Tab placeables
val tabPlaceables =
- tabMeasurables.map { it.measure(constraints.copy(minWidth = 0, minHeight = 0)) }
+ tabMeasurables.fastMap { it.measure(constraints.copy(minWidth = 0, minHeight = 0)) }
val tabsCount = tabMeasurables.size
val separatorsCount = tabsCount - 1
@@ -127,7 +131,7 @@
val separators = @Composable { repeat(separatorsCount) { separator() } }
val separatorMeasurables = subcompose(TabRowSlots.Separator, separators)
val separatorPlaceables =
- separatorMeasurables.map {
+ separatorMeasurables.fastMap {
it.measure(
constraints.copy(
minWidth = 0,
@@ -138,9 +142,9 @@
val separatorWidth = separatorPlaceables.firstOrNull()?.width ?: 0
val layoutWidth = tabPlaceables.sumOf { it.width } + separatorsCount * separatorWidth
- val layoutHeight =
- (tabMeasurables.maxOfOrNull { it.maxIntrinsicHeight(Constraints.Infinity) } ?: 0)
- .coerceAtLeast(0)
+ val layoutHeight = (tabMeasurables.fastMaxOfOrNull {
+ it.maxIntrinsicHeight(Constraints.Infinity)
+ } ?: 0).coerceAtLeast(0)
// Position the children
layout(layoutWidth, layoutHeight) {
@@ -148,7 +152,7 @@
// Place the tabs
val tabPositions = mutableListOf<DpRect>()
var left = 0
- tabPlaceables.forEachIndexed { index, tabPlaceable ->
+ tabPlaceables.fastForEachIndexed { index, tabPlaceable ->
// place the tab
tabPlaceable.placeRelative(left, 0)
@@ -172,7 +176,7 @@
subcompose(TabRowSlots.Indicator) {
indicator(tabPositions, isActivated)
}
- .forEach {
+ .fastForEach {
it.measure(Constraints.fixed(layoutWidth, layoutHeight)).placeRelative(0, 0)
}
}
diff --git a/wear/compose/compose-foundation/lint-baseline.xml b/wear/compose/compose-foundation/lint-baseline.xml
index 3557074..83c5cbf 100644
--- a/wear/compose/compose-foundation/lint-baseline.xml
+++ b/wear/compose/compose-foundation/lint-baseline.xml
@@ -1,284 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" children.maxOfOrNull { it.estimateThickness(maxRadius) } ?: 0f"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/CurvedBox.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val maxSweep = children.maxOfOrNull { child ->"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/CurvedBox.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" children.forEach { child ->"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/CurvedBox.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" maxRadius - children.fold(maxRadius) { currentMaxRadius, node ->"
- errorLine2=" ~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/CurvedColumn.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val weights = childrenInLayoutOrder.map { node ->"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/CurvedColumn.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val extraSpace = parentThickness - childrenInLayoutOrder.mapIndexed { ix, node ->"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/CurvedColumn.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" childrenInLayoutOrder.forEachIndexed { ix, node ->"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/CurvedColumn.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" var maxSweep = childrenInLayoutOrder.maxOfOrNull { it.sweepRadians } ?: 0f"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/CurvedColumn.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" children.forEach { child ->"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/CurvedColumn.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" children.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/CurvedContainer.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" ) = children.forEach { node ->"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/CurvedContainer.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" override fun DrawScope.draw() = children.forEach { with(it) { draw() } }"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/CurvedContainer.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" children.forEach { with(it) { placeIfNeeded() } }"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/CurvedContainer.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" }.reversed().toTypedArray()),"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/CurvedDraw.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" }.sortedBy { it.first }"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/CurvedDraw.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" children.maxOfOrNull { it.estimateThickness(maxRadius) } ?: 0f"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/CurvedRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" var totalSweep = children.sumOf { child ->"
- errorLine2=" ~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/CurvedRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val weights = childrenInLayoutOrder.map { node ->"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/CurvedRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val extraSpace = parentSweepRadians - childrenInLayoutOrder.mapIndexed { ix, node ->"
- errorLine2=" ~~~~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/CurvedRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" childrenInLayoutOrder.forEachIndexed { ix, node ->"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/CurvedRow.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val placeables = measurables.map { it.measure(constraints) }"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/Expandable.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val currentItem = items.find { it.index == index }"
- errorLine2=" ~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/lazy/ScalingLazyColumn.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .map { animationState.value + it.unadjustedOffset + snapOffset }"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/lazy/ScalingLazyColumnSnapFlingBehavior.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .minByOrNull { abs(it - decayTarget) } ?: decayTarget)"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/lazy/ScalingLazyColumnSnapFlingBehavior.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" visibleItems.find { it.index == itemIndexToFind }"
- errorLine2=" ~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/lazy/ScalingLazyListState.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" visibleItems.map {"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/lazy/ScalingLazyListState.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" visibleItems.find { it.index == itemIndexToFind }"
- errorLine2=" ~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/lazy/ScalingLazyListState.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" visibleItems.map {"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/lazy/ScalingLazyListState.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" return this.visibleItemsInfo.find { it.index == index }"
- errorLine2=" ~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/lazy/ScalingLazyListState.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" visibleItemsInfo.forEach { totalSize += it.unadjustedSize }"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/lazy/ScalingLazyListState.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" awaitPointerEvent(PointerEventPass.Initial).changes.forEach { change ->"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/foundation/SwipeToDismissBox.kt"/>
- </issue>
+<issues format="6" by="lint 8.1.0-beta02" type="baseline" client="gradle" dependencies="false" name="AGP (8.1.0-beta02)" variant="all" version="8.1.0-beta02">
<issue
id="PrimitiveInLambda"
diff --git a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedBox.kt b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedBox.kt
index 71d9aa0..a360536 100644
--- a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedBox.kt
+++ b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedBox.kt
@@ -18,6 +18,8 @@
import androidx.compose.foundation.layout.Box
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastMaxOfOrNull
/**
* A layout composable that places its children on top of each other and on an arc. This is
@@ -67,14 +69,14 @@
) : ContainerChild(curvedLayoutDirection, reverseLayout = false, contentBuilder) {
override fun doEstimateThickness(maxRadius: Float) =
- children.maxOfOrNull { it.estimateThickness(maxRadius) } ?: 0f
+ children.fastMaxOfOrNull { it.estimateThickness(maxRadius) } ?: 0f
override fun doRadialPosition(
parentOuterRadius: Float,
parentThickness: Float,
): PartialLayoutInfo {
// position children, take max sweep.
- val maxSweep = children.maxOfOrNull { child ->
+ val maxSweep = children.fastMaxOfOrNull { child ->
var childRadialPosition = parentOuterRadius
var childThickness = parentThickness
if (radialAlignment != null) {
@@ -102,7 +104,7 @@
parentSweepRadians: Float,
centerOffset: Offset
): Float {
- children.forEach { child ->
+ children.fastForEach { child ->
var childAngularPosition = parentStartAngleRadians
var childSweep = parentSweepRadians
if (angularAlignment != null) {
diff --git a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedColumn.kt b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedColumn.kt
index 2980e45..825a3ee 100644
--- a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedColumn.kt
+++ b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedColumn.kt
@@ -18,6 +18,12 @@
import androidx.compose.foundation.layout.Column
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.util.fastFold
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastForEachIndexed
+import androidx.compose.ui.util.fastMap
+import androidx.compose.ui.util.fastMapIndexed
+import androidx.compose.ui.util.fastMaxOfOrNull
/**
* A curved layout composable that places its children stacked as part of an arc (the first child
@@ -59,7 +65,7 @@
contentBuilder: CurvedScope.() -> Unit
) : ContainerChild(curvedLayoutDirection, !curvedLayoutDirection.outsideIn(), contentBuilder) {
override fun doEstimateThickness(maxRadius: Float): Float =
- maxRadius - children.fold(maxRadius) { currentMaxRadius, node ->
+ maxRadius - children.fastFold(maxRadius) { currentMaxRadius, node ->
currentMaxRadius - node.estimateThickness(currentMaxRadius)
}
@@ -68,11 +74,11 @@
parentThickness: Float,
): PartialLayoutInfo {
// Compute space used by weighted children and space left
- val weights = childrenInLayoutOrder.map { node ->
+ val weights = childrenInLayoutOrder.fastMap { node ->
(node.computeParentData() as? CurvedScopeParentData)?.weight ?: 0f
}
val sumWeights = weights.sum()
- val extraSpace = parentThickness - childrenInLayoutOrder.mapIndexed { ix, node ->
+ val extraSpace = parentThickness - childrenInLayoutOrder.fastMapIndexed { ix, node ->
if (weights[ix] == 0f) {
node.estimatedThickness
} else {
@@ -82,7 +88,7 @@
// position children
var outerRadius = parentOuterRadius
- childrenInLayoutOrder.forEachIndexed { ix, node ->
+ childrenInLayoutOrder.fastForEachIndexed { ix, node ->
val actualThickness = if (weights[ix] > 0f) {
extraSpace * weights[ix] / sumWeights
} else {
@@ -95,7 +101,7 @@
)
outerRadius -= actualThickness
}
- var maxSweep = childrenInLayoutOrder.maxOfOrNull { it.sweepRadians } ?: 0f
+ var maxSweep = childrenInLayoutOrder.fastMaxOfOrNull { it.sweepRadians } ?: 0f
return PartialLayoutInfo(
maxSweep,
@@ -110,7 +116,7 @@
parentSweepRadians: Float,
centerOffset: Offset
): Float {
- children.forEach { child ->
+ children.fastForEach { child ->
var childAngularPosition = parentStartAngleRadians
var childSweep = parentSweepRadians
if (angularAlignment != null) {
diff --git a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedContainer.kt b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedContainer.kt
index 5a6622e..32e7a1f 100644
--- a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedContainer.kt
+++ b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedContainer.kt
@@ -21,6 +21,7 @@
import androidx.compose.ui.graphics.drawscope.DrawScope
import androidx.compose.ui.layout.Measurable
import androidx.compose.ui.layout.Placeable
+import androidx.compose.ui.util.fastForEach
/**
* Layout scope used for curved containers.
@@ -53,14 +54,14 @@
@Composable
override fun SubComposition() {
- children.forEach {
+ children.fastForEach {
it.SubComposition()
}
}
override fun CurvedMeasureScope.initializeMeasure(
measurables: Iterator<Measurable>
- ) = children.forEach { node ->
+ ) = children.fastForEach { node ->
with(CurvedMeasureScope(
subDensity = this,
curvedContainerScope.curvedLayoutDirection,
@@ -72,9 +73,9 @@
}
}
- override fun DrawScope.draw() = children.forEach { with(it) { draw() } }
+ override fun DrawScope.draw() = children.fastForEach { with(it) { draw() } }
override fun (Placeable.PlacementScope).placeIfNeeded() {
- children.forEach { with(it) { placeIfNeeded() } }
+ children.fastForEach { with(it) { placeIfNeeded() } }
}
}
diff --git a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedDraw.kt b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedDraw.kt
index 28421be..c9ad3fb 100644
--- a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedDraw.kt
+++ b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedDraw.kt
@@ -53,6 +53,7 @@
cap: StrokeCap = StrokeCap.Butt
) = background(cap) { layoutInfo ->
val radiusRatio = layoutInfo.innerRadius / layoutInfo.outerRadius
+ @Suppress("ListIterator")
Brush.radialGradient(
*(colorStops.map { (step, color) ->
1f - step * (1f - radiusRatio) to color
@@ -89,6 +90,7 @@
vararg colorStops: Pair<Float, Color>,
cap: StrokeCap = StrokeCap.Butt
) = background(cap) { layoutInfo ->
+ @Suppress("ListIterator")
val actualStops = colorStops.map { (step, color) ->
(layoutInfo.startAngleRadians + layoutInfo.sweepRadians * step) /
(2 * PI).toFloat() to color
diff --git a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedRow.kt b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedRow.kt
index af2d5f2..f4fa3ca 100644
--- a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedRow.kt
+++ b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/CurvedRow.kt
@@ -18,6 +18,10 @@
import androidx.compose.foundation.layout.Row
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.util.fastForEachIndexed
+import androidx.compose.ui.util.fastMap
+import androidx.compose.ui.util.fastMapIndexed
+import androidx.compose.ui.util.fastMaxOfOrNull
/**
* A layout composable that places its children in an arc, rotating them as needed. This is
@@ -60,13 +64,14 @@
) : ContainerChild(curvedLayoutDirection, !curvedLayoutDirection.clockwise(), contentBuilder) {
override fun doEstimateThickness(maxRadius: Float) =
- children.maxOfOrNull { it.estimateThickness(maxRadius) } ?: 0f
+ children.fastMaxOfOrNull { it.estimateThickness(maxRadius) } ?: 0f
override fun doRadialPosition(
parentOuterRadius: Float,
parentThickness: Float,
): PartialLayoutInfo {
// position children, sum angles.
+ @Suppress("ListIterator")
var totalSweep = children.sumOf { child ->
var childRadialPosition = parentOuterRadius
var childThickness = parentThickness
@@ -96,11 +101,11 @@
parentSweepRadians: Float,
centerOffset: Offset
): Float {
- val weights = childrenInLayoutOrder.map { node ->
+ val weights = childrenInLayoutOrder.fastMap { node ->
(node.computeParentData() as? CurvedScopeParentData)?.weight ?: 0f
}
val sumWeights = weights.sum()
- val extraSpace = parentSweepRadians - childrenInLayoutOrder.mapIndexed { ix, node ->
+ val extraSpace = parentSweepRadians - childrenInLayoutOrder.fastMapIndexed { ix, node ->
if (weights[ix] == 0f) {
node.sweepRadians
} else {
@@ -109,7 +114,7 @@
}.sum()
var currentStartAngle = parentStartAngleRadians
- childrenInLayoutOrder.forEachIndexed { ix, node ->
+ childrenInLayoutOrder.fastForEachIndexed { ix, node ->
val actualSweep = if (weights[ix] > 0f) {
extraSpace * weights[ix] / sumWeights
} else {
diff --git a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/Expandable.kt b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/Expandable.kt
index 20ebcae..92117e1 100644
--- a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/Expandable.kt
+++ b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/Expandable.kt
@@ -28,6 +28,7 @@
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clipToBounds
import androidx.compose.ui.layout.Layout
+import androidx.compose.ui.util.fastMap
import androidx.compose.ui.util.lerp
import androidx.wear.compose.foundation.lazy.ScalingLazyListScope
import kotlin.math.roundToInt
@@ -189,7 +190,7 @@
},
modifier = Modifier.clipToBounds()
) { measurables, constraints ->
- val placeables = measurables.map { it.measure(constraints) }
+ val placeables = measurables.fastMap { it.measure(constraints) }
val width = lerp(placeables[0].width, placeables[1].width, progress)
val height = lerp(placeables[0].height, placeables[1].height, progress)
diff --git a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/SwipeToDismissBox.kt b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/SwipeToDismissBox.kt
index f4e9c56..c1c7213 100644
--- a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/SwipeToDismissBox.kt
+++ b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/SwipeToDismissBox.kt
@@ -53,6 +53,7 @@
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.Velocity
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastForEach
import androidx.compose.ui.util.lerp
import kotlin.math.max
import kotlin.math.min
@@ -494,7 +495,7 @@
coroutineScope {
awaitPointerEventScope {
while (isActive) {
- awaitPointerEvent(PointerEventPass.Initial).changes.forEach { change ->
+ awaitPointerEvent(PointerEventPass.Initial).changes.fastForEach { change ->
// By default swipeState is WaitingForTouch.
// If it is in this state and a first touch hit an edge area, we
// set swipeState to EdgeClickedWaitingForDirection.
diff --git a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/ScalingLazyColumn.kt b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/ScalingLazyColumn.kt
index 51ca1f9..843150a 100644
--- a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/ScalingLazyColumn.kt
+++ b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/ScalingLazyColumn.kt
@@ -56,6 +56,7 @@
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.offset
+import androidx.compose.ui.util.fastFirstOrNull
import androidx.wear.compose.foundation.ExperimentalWearFoundationApi
import androidx.wear.compose.foundation.LocalReduceMotion
@@ -655,7 +656,7 @@
val reverseLayout = state.reverseLayout.value!!
val anchorType = state.anchorType.value!!
val items = state.layoutInfo.internalVisibleItemInfo()
- val currentItem = items.find { it.index == index }
+ val currentItem = items.fastFirstOrNull { it.index == index }
if (currentItem != null) {
alpha = currentItem.alpha
scaleX = currentItem.scale
diff --git a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/ScalingLazyColumnSnapFlingBehavior.kt b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/ScalingLazyColumnSnapFlingBehavior.kt
index 8b20123..3245cf7 100644
--- a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/ScalingLazyColumnSnapFlingBehavior.kt
+++ b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/ScalingLazyColumnSnapFlingBehavior.kt
@@ -26,6 +26,8 @@
import androidx.compose.animation.core.tween
import androidx.compose.foundation.gestures.FlingBehavior
import androidx.compose.foundation.gestures.ScrollScope
+import androidx.compose.ui.util.fastMap
+import androidx.compose.ui.util.fastMinByOrNull
import androidx.compose.ui.util.lerp
import kotlin.math.abs
import kotlin.math.roundToInt
@@ -76,8 +78,8 @@
// to the original target. Note that the target may be off-screen, in that case we
// will land on the last visible item in that direction.
(state.layoutInfo.visibleItemsInfo
- .map { animationState.value + it.unadjustedOffset + snapOffset }
- .minByOrNull { abs(it - decayTarget) } ?: decayTarget)
+ .fastMap { animationState.value + it.unadjustedOffset + snapOffset }
+ .fastMinByOrNull { abs(it - decayTarget) } ?: decayTarget)
}
} else {
// Not a fling, just snap to the current item.
diff --git a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/ScalingLazyListState.kt b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/ScalingLazyListState.kt
index 9241dd6..0711517 100644
--- a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/ScalingLazyListState.kt
+++ b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/ScalingLazyListState.kt
@@ -32,6 +32,9 @@
import androidx.compose.runtime.saveable.listSaver
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.util.fastFirstOrNull
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastMap
import kotlin.math.roundToInt
/**
@@ -554,14 +557,14 @@
// we have more than enough content before it to make sure it can be scrolled to the center
// of the viewport
val initialCenterItem =
- visibleItems.find { it.index == itemIndexToFind }
+ visibleItems.fastFirstOrNull { it.index == itemIndexToFind }
// Determine how much space we actually need
var spaceNeeded = spaceNeeded(initialCenterItem)
if (spaceNeeded > 0f) {
// Now see how much content we already have
- visibleItems.map {
+ visibleItems.fastMap {
if (it.index < itemIndexToFind) {
// Reduce the space needed
spaceNeeded = spaceNeeded - gapBetweenItemsPx.value!! - it.unadjustedSize
@@ -593,14 +596,14 @@
// we have more than enough content before it to make sure it can be scrolled to the center
// of the viewport
val initialCenterItem =
- visibleItems.find { it.index == itemIndexToFind }
+ visibleItems.fastFirstOrNull { it.index == itemIndexToFind }
// Determine how much space we actually need
var spaceNeeded = spaceNeeded(initialCenterItem)
if (spaceNeeded > 0f) {
// Now see how much content we already have
- visibleItems.map {
+ visibleItems.fastMap {
if (it.index != 0 && it.index < itemIndexToFind) {
// Reduce the space needed
spaceNeeded = spaceNeeded - gapBetweenItemsPx.value!! - it.size
@@ -679,7 +682,7 @@
}
private fun LazyListLayoutInfo.findItemInfoWithIndex(index: Int): LazyListItemInfo? {
- return this.visibleItemsInfo.find { it.index == index }
+ return this.visibleItemsInfo.fastFirstOrNull { it.index == index }
}
private suspend fun LazyListState.scrollToItem(animated: Boolean, index: Int, offset: Int) {
@@ -688,7 +691,7 @@
private fun ScalingLazyListLayoutInfo.averageUnadjustedItemSize(): Int {
var totalSize = 0
- visibleItemsInfo.forEach { totalSize += it.unadjustedSize }
+ visibleItemsInfo.fastForEach { totalSize += it.unadjustedSize }
return if (visibleItemsInfo.isNotEmpty())
(totalSize.toFloat() / visibleItemsInfo.size).roundToInt()
else 0
diff --git a/wear/compose/compose-material/lint-baseline.xml b/wear/compose/compose-material/lint-baseline.xml
index 11bfe8a..3ebc76a 100644
--- a/wear/compose/compose-material/lint-baseline.xml
+++ b/wear/compose/compose-material/lint-baseline.xml
@@ -1,176 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.2.0-alpha15" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha15)" variant="all" version="8.2.0-alpha15">
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" visibleItems.find { info ->"
- errorLine2=" ~~~~">
- <location
- file="src/main/java/androidx/wear/compose/material/Picker.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val placeables = measurables.map { it.measure(constraints) }"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/wear/compose/material/PickerGroup.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" placeables.forEach {"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/material/PickerGroup.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" placeables.forEach { p ->"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/material/PickerGroup.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val maxChildrenHeight = placeables.maxOf { it.height }"
- errorLine2=" ~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/material/PickerGroup.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val currentItem = items.find { it.index == index }"
- errorLine2=" ~~~~">
- <location
- file="src/main/java/androidx/wear/compose/material/ScalingLazyColumn.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .map { animationState.value + it.unadjustedOffset + snapOffset }"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/wear/compose/material/ScalingLazyColumnSnapFlingBehavior.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" .minByOrNull { abs(it - decayTarget) } ?: decayTarget)"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/material/ScalingLazyColumnSnapFlingBehavior.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" visibleItems.find { it.index == itemIndexToFind }"
- errorLine2=" ~~~~">
- <location
- file="src/main/java/androidx/wear/compose/material/ScalingLazyListState.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" visibleItems.map {"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/wear/compose/material/ScalingLazyListState.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" visibleItems.find { it.index == itemIndexToFind }"
- errorLine2=" ~~~~">
- <location
- file="src/main/java/androidx/wear/compose/material/ScalingLazyListState.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" visibleItems.map {"
- errorLine2=" ~~~">
- <location
- file="src/main/java/androidx/wear/compose/material/ScalingLazyListState.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" return this.visibleItemsInfo.find { it.index == index }"
- errorLine2=" ~~~~">
- <location
- file="src/main/java/androidx/wear/compose/material/ScalingLazyListState.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" visibleItemsInfo.forEach { totalSize += it.unadjustedSize }"
- errorLine2=" ~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/material/ScalingLazyListState.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" yPx = scrollState.layoutInfo.visibleItemsInfo.find { it.index == itemIndex }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/main/java/androidx/wear/compose/material/ScrollAway.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" yPx = scrollState.layoutInfo.visibleItemsInfo.find { it.index == itemIndex }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/main/java/androidx/wear/compose/material/ScrollAway.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" yPx = scrollState.layoutInfo.visibleItemsInfo.find { it.index == itemIndex }?.let {"
- errorLine2=" ~~~~">
- <location
- file="src/main/java/androidx/wear/compose/material/ScrollAway.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val a = anchors.filter { it <= offset + 0.001 }.maxOrNull()"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/material/Swipeable.kt"/>
- </issue>
-
- <issue
- id="ListIterator"
- message="Creating an unnecessary Iterator to iterate through a List"
- errorLine1=" val b = anchors.filter { it >= offset - 0.001 }.minOrNull()"
- errorLine2=" ~~~~~~~~~">
- <location
- file="src/main/java/androidx/wear/compose/material/Swipeable.kt"/>
- </issue>
+<issues format="6" by="lint 8.2.0-alpha14" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0-alpha14)" variant="all" version="8.2.0-alpha14">
<issue
id="PrimitiveInLambda"
diff --git a/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/Picker.kt b/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/Picker.kt
index 6587a21..315b05a 100644
--- a/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/Picker.kt
+++ b/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/Picker.kt
@@ -60,6 +60,7 @@
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastFirstOrNull
import androidx.wear.compose.foundation.lazy.AutoCenteringParams
import androidx.wear.compose.foundation.lazy.ScalingLazyColumn
import androidx.wear.compose.foundation.lazy.ScalingLazyColumnDefaults
@@ -171,7 +172,7 @@
state.scalingLazyListState.layoutInfo.visibleItemsInfo
if (visibleItems.isNotEmpty()) {
val centerItem =
- visibleItems.find { info ->
+ visibleItems.fastFirstOrNull { info ->
info.index == state.scalingLazyListState.centerItemIndex
} ?: visibleItems[visibleItems.size / 2]
val shimHeight =
diff --git a/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/PickerGroup.kt b/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/PickerGroup.kt
index 8588ee8..fbeb706 100644
--- a/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/PickerGroup.kt
+++ b/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/PickerGroup.kt
@@ -40,6 +40,9 @@
import androidx.compose.ui.layout.Placeable
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Density
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastMap
+import androidx.compose.ui.util.fastMaxOfOrNull
import androidx.wear.compose.foundation.ExperimentalWearFoundationApi
import androidx.wear.compose.foundation.HierarchicalFocusCoordinator
import androidx.wear.compose.foundation.rememberActiveFocusRequester
@@ -266,7 +269,7 @@
} else {
parentConstraints.copy(minWidth = 0, minHeight = 0)
}
- val placeables = measurables.map { it.measure(constraints) }
+ val placeables = measurables.fastMap { it.measure(constraints) }
val centeringOffset = computeCenteringOffset(placeables)
val rowWidth =
if (constraints.hasBoundedWidth) constraints.maxWidth
@@ -274,7 +277,7 @@
val rowHeight = calculateHeight(constraints, placeables)
layout(width = rowWidth, height = rowHeight) {
var x = rowWidth / 2f - centeringOffset
- placeables.forEach {
+ placeables.fastForEach {
it.placeRelative(x.roundToInt(), ((rowHeight - it.height) / 2f).roundToInt())
x += it.width
}
@@ -304,7 +307,7 @@
*/
private fun computeCenteringOffset(placeables: List<Placeable>): Int {
var sumWidth = 0
- placeables.forEach { p ->
+ placeables.fastForEach { p ->
if (p.isAutoCenteringTarget()) {
// The target centering offset is at the middle of this child.
return sumWidth + p.width / 2
@@ -322,7 +325,7 @@
* [Constraints].
*/
private fun calculateHeight(constraints: Constraints, placeables: List<Placeable>): Int {
- val maxChildrenHeight = placeables.maxOf { it.height }
+ val maxChildrenHeight = placeables.fastMaxOfOrNull { it.height }!!
return maxChildrenHeight.coerceIn(constraints.minHeight, constraints.maxHeight)
}
diff --git a/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/ScalingLazyColumn.kt b/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/ScalingLazyColumn.kt
index 3c93e35..5ca39eb 100644
--- a/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/ScalingLazyColumn.kt
+++ b/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/ScalingLazyColumn.kt
@@ -55,6 +55,7 @@
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.offset
+import androidx.compose.ui.util.fastFirstOrNull
import androidx.wear.compose.foundation.lazy.CombinedPaddingValues
import androidx.wear.compose.foundation.lazy.verticalNegativePadding
@@ -673,7 +674,7 @@
val reverseLayout = state.reverseLayout.value!!
val anchorType = state.anchorType.value!!
val items = state.layoutInfo.internalVisibleItemInfo()
- val currentItem = items.find { it.index == index }
+ val currentItem = items.fastFirstOrNull { it.index == index }
if (currentItem != null) {
alpha = currentItem.alpha
scaleX = currentItem.scale
diff --git a/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/ScalingLazyColumnSnapFlingBehavior.kt b/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/ScalingLazyColumnSnapFlingBehavior.kt
index 36268aa9..fb71229 100644
--- a/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/ScalingLazyColumnSnapFlingBehavior.kt
+++ b/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/ScalingLazyColumnSnapFlingBehavior.kt
@@ -26,6 +26,8 @@
import androidx.compose.animation.core.tween
import androidx.compose.foundation.gestures.FlingBehavior
import androidx.compose.foundation.gestures.ScrollScope
+import androidx.compose.ui.util.fastMap
+import androidx.compose.ui.util.fastMinByOrNull
import androidx.compose.ui.util.lerp
import kotlin.math.abs
import kotlin.math.roundToInt
@@ -77,8 +79,8 @@
// to the original target. Note that the target may be off-screen, in that case we
// will land on the last visible item in that direction.
(state.layoutInfo.visibleItemsInfo
- .map { animationState.value + it.unadjustedOffset + snapOffset }
- .minByOrNull { abs(it - decayTarget) } ?: decayTarget)
+ .fastMap { animationState.value + it.unadjustedOffset + snapOffset }
+ .fastMinByOrNull { abs(it - decayTarget) } ?: decayTarget)
}
} else {
// Not a fling, just snap to the current item.
diff --git a/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/ScalingLazyListState.kt b/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/ScalingLazyListState.kt
index 2926cca..2109674 100644
--- a/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/ScalingLazyListState.kt
+++ b/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/ScalingLazyListState.kt
@@ -34,6 +34,9 @@
import androidx.compose.runtime.saveable.listSaver
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.util.fastFirstOrNull
+import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastMap
import kotlin.math.roundToInt
/**
@@ -559,14 +562,14 @@
// we have more than enough content before it to make sure it can be scrolled to the center
// of the viewport
val initialCenterItem =
- visibleItems.find { it.index == itemIndexToFind }
+ visibleItems.fastFirstOrNull { it.index == itemIndexToFind }
// Determine how much space we actually need
var spaceNeeded = spaceNeeded(initialCenterItem)
if (spaceNeeded > 0f) {
// Now see how much content we already have
- visibleItems.map {
+ visibleItems.fastMap {
if (it.index < itemIndexToFind) {
// Reduce the space needed
spaceNeeded = spaceNeeded - gapBetweenItemsPx.value!! - it.unadjustedSize
@@ -598,14 +601,14 @@
// we have more than enough content before it to make sure it can be scrolled to the center
// of the viewport
val initialCenterItem =
- visibleItems.find { it.index == itemIndexToFind }
+ visibleItems.fastFirstOrNull { it.index == itemIndexToFind }
// Determine how much space we actually need
var spaceNeeded = spaceNeeded(initialCenterItem)
if (spaceNeeded > 0f) {
// Now see how much content we already have
- visibleItems.map {
+ visibleItems.fastMap {
if (it.index != 0 && it.index < itemIndexToFind) {
// Reduce the space needed
spaceNeeded = spaceNeeded - gapBetweenItemsPx.value!! - it.size
@@ -684,7 +687,7 @@
}
private fun LazyListLayoutInfo.findItemInfoWithIndex(index: Int): LazyListItemInfo? {
- return this.visibleItemsInfo.find { it.index == index }
+ return this.visibleItemsInfo.fastFirstOrNull { it.index == index }
}
private suspend fun LazyListState.scrollToItem(animated: Boolean, index: Int, offset: Int) {
@@ -693,7 +696,7 @@
private fun ScalingLazyListLayoutInfo.averageUnadjustedItemSize(): Int {
var totalSize = 0
- visibleItemsInfo.forEach { totalSize += it.unadjustedSize }
+ visibleItemsInfo.fastForEach { totalSize += it.unadjustedSize }
return if (visibleItemsInfo.isNotEmpty())
(totalSize.toFloat() / visibleItemsInfo.size).roundToInt()
else 0
diff --git a/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/ScrollAway.kt b/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/ScrollAway.kt
index c15fd01..5a6fd04d 100644
--- a/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/ScrollAway.kt
+++ b/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/ScrollAway.kt
@@ -30,6 +30,7 @@
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastFirstOrNull
import androidx.compose.ui.util.lerp
import androidx.wear.compose.foundation.lazy.ScalingLazyColumn
import androidx.wear.compose.foundation.lazy.ScalingLazyListState
@@ -71,9 +72,10 @@
scrollAway {
ScrollParams(
valid = itemIndex < scrollState.layoutInfo.totalItemsCount,
- yPx = scrollState.layoutInfo.visibleItemsInfo.find { it.index == itemIndex }?.let {
- -it.offset - offset.toPx()
- }
+ yPx = scrollState.layoutInfo.visibleItemsInfo.fastFirstOrNull { it.index == itemIndex }
+ ?.let {
+ -it.offset - offset.toPx()
+ }
)
}
@@ -95,9 +97,10 @@
scrollAway {
ScrollParams(
valid = itemIndex < scrollState.layoutInfo.totalItemsCount,
- yPx = scrollState.layoutInfo.visibleItemsInfo.find { it.index == itemIndex }?.let {
- -it.offset - offset.toPx()
- }
+ yPx = scrollState.layoutInfo.visibleItemsInfo.fastFirstOrNull { it.index == itemIndex }
+ ?.let {
+ -it.offset - offset.toPx()
+ }
)
}
@@ -125,9 +128,10 @@
scrollAway {
ScrollParams(
valid = itemIndex < scrollState.layoutInfo.totalItemsCount,
- yPx = scrollState.layoutInfo.visibleItemsInfo.find { it.index == itemIndex }?.let {
- -it.offset - offset.toPx()
- }
+ yPx = scrollState.layoutInfo.visibleItemsInfo.fastFirstOrNull { it.index == itemIndex }
+ ?.let {
+ -it.offset - offset.toPx()
+ }
)
}
diff --git a/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/Swipeable.kt b/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/Swipeable.kt
index b605836..b689e6d 100644
--- a/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/Swipeable.kt
+++ b/wear/compose/compose-material/src/main/java/androidx/wear/compose/material/Swipeable.kt
@@ -48,6 +48,8 @@
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.fastMaxBy
+import androidx.compose.ui.util.fastMinByOrNull
import androidx.compose.ui.util.lerp
import androidx.wear.compose.material.SwipeableDefaults.StandardResistanceFactor
import androidx.wear.compose.material.SwipeableDefaults.VelocityThreshold
@@ -744,8 +746,8 @@
anchors: Set<Float>
): List<Float> {
// Find the anchors the target lies between with a little bit of rounding error.
- val a = anchors.filter { it <= offset + 0.001 }.maxOrNull()
- val b = anchors.filter { it >= offset - 0.001 }.minOrNull()
+ val a = anchors.filter { it <= offset + 0.001 }.fastMaxBy { it }
+ val b = anchors.filter { it >= offset - 0.001 }.fastMinByOrNull { it }
return when {
a == null ->