aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Judd <sam.a.judd@gmail.com>2023-08-23 18:55:34 -0700
committerSam <sam.a.judd@gmail.com>2023-08-23 20:04:16 -0700
commitaf0d631c616c41cd23eacf953f278d28b0d217e4 (patch)
tree21e00ef0332e70e4bdcc361e82eca7fcc2c206de
parent4db0b300c43f127313211774a1784ac873aa45cf (diff)
downloadglide-af0d631c616c41cd23eacf953f278d28b0d217e4.tar.gz
Avoid modifying constraints when a scale factor can't be computed
This will happen if either width or height (or both) are constrained to have a 0 size. We already avoid loading the image via AsyncImageSize / inferredGlideSize. This only impacts layout. Fixes #5256
-rw-r--r--integration/compose/src/androidTest/java/com/bumptech/glide/integration/compose/GlideImageTest.kt19
-rw-r--r--integration/compose/src/main/java/com/bumptech/glide/integration/compose/GlideModifier.kt8
2 files changed, 25 insertions, 2 deletions
diff --git a/integration/compose/src/androidTest/java/com/bumptech/glide/integration/compose/GlideImageTest.kt b/integration/compose/src/androidTest/java/com/bumptech/glide/integration/compose/GlideImageTest.kt
index 7873de4e..46e351a4 100644
--- a/integration/compose/src/androidTest/java/com/bumptech/glide/integration/compose/GlideImageTest.kt
+++ b/integration/compose/src/androidTest/java/com/bumptech/glide/integration/compose/GlideImageTest.kt
@@ -5,13 +5,18 @@ import android.graphics.drawable.Drawable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.IntrinsicSize
+import androidx.compose.foundation.layout.aspectRatio
+import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.material.Text
import androidx.compose.material.TextButton
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
+import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.test.assert
@@ -372,4 +377,18 @@ class GlideImageTest {
.assert(expectDisplayedDrawable(drawable))
}
}
+
+ // See #5256
+ @Test
+ fun glideImage_withZeroSize_doesNotCrash() {
+ glideComposeRule.setContent {
+ GlideImage(
+ model = android.R.drawable.star_big_on,
+ contentDescription = null,
+ modifier = Modifier.width(IntrinsicSize.Min),
+ contentScale = ContentScale.Crop
+ )
+ }
+ glideComposeRule.waitForIdle()
+ }
}
diff --git a/integration/compose/src/main/java/com/bumptech/glide/integration/compose/GlideModifier.kt b/integration/compose/src/main/java/com/bumptech/glide/integration/compose/GlideModifier.kt
index e480fe6f..d61fc1cb 100644
--- a/integration/compose/src/main/java/com/bumptech/glide/integration/compose/GlideModifier.kt
+++ b/integration/compose/src/main/java/com/bumptech/glide/integration/compose/GlideModifier.kt
@@ -20,6 +20,7 @@ import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.layout.Measurable
import androidx.compose.ui.layout.MeasureResult
import androidx.compose.ui.layout.MeasureScope
+import androidx.compose.ui.layout.ScaleFactor
import androidx.compose.ui.layout.times
import androidx.compose.ui.node.DrawModifierNode
import androidx.compose.ui.node.LayoutModifierNode
@@ -477,10 +478,13 @@ internal class GlideNode : DrawModifierNode, LayoutModifierNode, SemanticsModifi
val constrainedHeight = constraints.constrainHeight(intrinsicHeight)
val srcSize = Size(intrinsicWidth.toFloat(), intrinsicHeight.toFloat())
- val scaledSize =
- srcSize * contentScale.computeScaleFactor(
+ val scaleFactor = contentScale.computeScaleFactor(
srcSize, Size(constrainedWidth.toFloat(), constrainedHeight.toFloat())
)
+ if (scaleFactor == ScaleFactor.Unspecified) {
+ return constraints
+ }
+ val scaledSize = srcSize * scaleFactor
val minWidth = constraints.constrainWidth(scaledSize.width.roundToInt())
val minHeight = constraints.constrainHeight(scaledSize.height.roundToInt())