Skip to content

Commit af0d631

Browse files
committed
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
1 parent 4db0b30 commit af0d631

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

integration/compose/src/androidTest/java/com/bumptech/glide/integration/compose/GlideImageTest.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,18 @@ import android.graphics.drawable.Drawable
55
import androidx.compose.foundation.layout.Arrangement
66
import androidx.compose.foundation.layout.Box
77
import androidx.compose.foundation.layout.Column
8+
import androidx.compose.foundation.layout.IntrinsicSize
9+
import androidx.compose.foundation.layout.aspectRatio
10+
import androidx.compose.foundation.layout.height
811
import androidx.compose.foundation.layout.size
12+
import androidx.compose.foundation.layout.width
913
import androidx.compose.foundation.lazy.LazyRow
1014
import androidx.compose.material.Text
1115
import androidx.compose.material.TextButton
1216
import androidx.compose.runtime.mutableStateOf
1317
import androidx.compose.runtime.remember
1418
import androidx.compose.ui.Modifier
19+
import androidx.compose.ui.layout.ContentScale
1520
import androidx.compose.ui.platform.LocalDensity
1621
import androidx.compose.ui.platform.testTag
1722
import androidx.compose.ui.test.assert
@@ -372,4 +377,18 @@ class GlideImageTest {
372377
.assert(expectDisplayedDrawable(drawable))
373378
}
374379
}
380+
381+
// See #5256
382+
@Test
383+
fun glideImage_withZeroSize_doesNotCrash() {
384+
glideComposeRule.setContent {
385+
GlideImage(
386+
model = android.R.drawable.star_big_on,
387+
contentDescription = null,
388+
modifier = Modifier.width(IntrinsicSize.Min),
389+
contentScale = ContentScale.Crop
390+
)
391+
}
392+
glideComposeRule.waitForIdle()
393+
}
375394
}

integration/compose/src/main/java/com/bumptech/glide/integration/compose/GlideModifier.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import androidx.compose.ui.layout.ContentScale
2020
import androidx.compose.ui.layout.Measurable
2121
import androidx.compose.ui.layout.MeasureResult
2222
import androidx.compose.ui.layout.MeasureScope
23+
import androidx.compose.ui.layout.ScaleFactor
2324
import androidx.compose.ui.layout.times
2425
import androidx.compose.ui.node.DrawModifierNode
2526
import androidx.compose.ui.node.LayoutModifierNode
@@ -477,10 +478,13 @@ internal class GlideNode : DrawModifierNode, LayoutModifierNode, SemanticsModifi
477478
val constrainedHeight = constraints.constrainHeight(intrinsicHeight)
478479

479480
val srcSize = Size(intrinsicWidth.toFloat(), intrinsicHeight.toFloat())
480-
val scaledSize =
481-
srcSize * contentScale.computeScaleFactor(
481+
val scaleFactor = contentScale.computeScaleFactor(
482482
srcSize, Size(constrainedWidth.toFloat(), constrainedHeight.toFloat())
483483
)
484+
if (scaleFactor == ScaleFactor.Unspecified) {
485+
return constraints
486+
}
487+
val scaledSize = srcSize * scaleFactor
484488

485489
val minWidth = constraints.constrainWidth(scaledSize.width.roundToInt())
486490
val minHeight = constraints.constrainHeight(scaledSize.height.roundToInt())

0 commit comments

Comments
 (0)