From 385442da2b6ed5c9b8d92cad8ff5668c33760a19 Mon Sep 17 00:00:00 2001 From: Sam Judd Date: Wed, 23 Aug 2023 18:55:34 -0700 Subject: [PATCH] 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 --- .../integration/compose/GlideImageTest.kt | 19 +++++++++++++++++++ .../integration/compose/GlideModifier.kt | 8 ++++++-- 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 7873de4e23..46e351a475 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 e480fe6f34..d61fc1cb59 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())