Skip to content

Commit 830fd11

Browse files
committedSep 3, 2023
Avoid duplicating Modifiers in GlideModifer
1 parent 59c2d9b commit 830fd11

File tree

6 files changed

+76
-10
lines changed

6 files changed

+76
-10
lines changed
 
Loading

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

+3
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ class GlideImageTest {
4848
@get:Rule
4949
val glideComposeRule = GlideComposeRule()
5050

51+
@get:Rule(order = 2)
52+
val glideComposeRule = GlideComposeRule()
53+
5154
@Test
5255
fun glideImage_noModifierSize_resourceDrawable_displaysDrawable() {
5356
val description = "test"

‎integration/compose/src/androidTest/java/com/bumptech/glide/integration/compose/GlideSubcompositionTest.kt

+67-2
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,43 @@ package com.bumptech.glide.integration.compose
33
import android.content.Context
44
import androidx.compose.foundation.Image
55
import androidx.compose.foundation.layout.Box
6+
import androidx.compose.foundation.layout.Spacer
7+
import androidx.compose.foundation.layout.aspectRatio
8+
import androidx.compose.foundation.layout.padding
69
import androidx.compose.foundation.layout.size
10+
import androidx.compose.foundation.layout.width
11+
import androidx.compose.material.icons.Icons
12+
import androidx.compose.material.icons.filled.Email
13+
import androidx.compose.runtime.mutableStateOf
14+
import androidx.compose.runtime.remember
715
import androidx.compose.ui.Modifier
16+
import androidx.compose.ui.draw.drawBehind
17+
import androidx.compose.ui.geometry.Size
18+
import androidx.compose.ui.geometry.isUnspecified
19+
import androidx.compose.ui.graphics.Color
20+
import androidx.compose.ui.semantics.contentDescription
21+
import androidx.compose.ui.semantics.semantics
22+
import androidx.compose.ui.test.captureToImage
23+
import androidx.compose.ui.test.onNodeWithContentDescription
824
import androidx.compose.ui.unit.dp
925
import androidx.test.core.app.ApplicationProvider
1026
import com.bumptech.glide.Glide
1127
import com.bumptech.glide.integration.compose.test.GlideComposeRule
1228
import com.bumptech.glide.load.DataSource
29+
import com.bumptech.glide.test.compareToGolden
30+
import com.bumptech.glide.test.pxToDp
1331
import com.google.common.truth.Truth.assertThat
1432
import org.junit.Rule
1533
import org.junit.Test
34+
import org.junit.rules.TestName
1635

1736
@OptIn(ExperimentalGlideComposeApi::class)
1837
class GlideSubcompositionTest {
19-
val context: Context = ApplicationProvider.getApplicationContext()
38+
private val context: Context = ApplicationProvider.getApplicationContext()
2039

21-
@get:Rule
40+
@get:Rule(order = 1)
41+
val testName = TestName()
42+
@get:Rule(order = 2)
2243
val glideComposeRule = GlideComposeRule()
2344

2445
@Test
@@ -162,5 +183,49 @@ class GlideSubcompositionTest {
162183
glideComposeRule.waitForIdle()
163184
assertThat(dataSource).isEqualTo(DataSource.MEMORY_CACHE)
164185
}
186+
187+
// See #5272
188+
@Test
189+
fun glideSubcomposition_withPadding_appliesPaddingOnce() {
190+
glideComposeRule.setContent {
191+
val lastSize = remember { mutableStateOf(Size.Unspecified) }
192+
193+
GlideSubcomposition(
194+
model = null,
195+
modifier = Modifier
196+
.semantics {
197+
contentDescription = "test"
198+
}
199+
.width(400.pxToDp())
200+
.aspectRatio(1f)
201+
.drawBehind {
202+
if (lastSize.value.isUnspecified) {
203+
lastSize.value = size
204+
drawRect(Color.Blue)
205+
} else if (lastSize.value != this.size) {
206+
drawRect(Color.Red)
207+
} else {
208+
drawRect(Color.Blue)
209+
}
210+
}
211+
.padding(80.pxToDp()),
212+
) {
213+
when (state) {
214+
RequestState.Failure -> Image(
215+
imageVector = Icons.Default.Email,
216+
contentDescription = "placeholder",
217+
modifier = Modifier.width(400.pxToDp())
218+
)
219+
RequestState.Loading -> Spacer(modifier = Modifier.size(100.pxToDp()))
220+
is RequestState.Success -> Image(painter = painter, contentDescription = null)
221+
}
222+
}
223+
}
224+
glideComposeRule.waitForIdle()
225+
glideComposeRule.onNodeWithContentDescription("test")
226+
.captureToImage()
227+
.compareToGolden(testName.methodName)
228+
}
165229
}
166230

231+

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

+6-8
Original file line numberDiff line numberDiff line change
@@ -88,16 +88,14 @@ internal fun Modifier.glideNode(
8888
requestListener,
8989
draw,
9090
transitionFactory,
91-
) then
92-
clipToBounds() then
91+
)
92+
.clipToBounds()
93+
.semantics {
9394
if (contentDescription != null) {
94-
semantics {
95-
this@semantics.contentDescription = contentDescription
96-
role = Role.Image
97-
}
98-
} else {
99-
Modifier
95+
this@semantics.contentDescription = contentDescription
10096
}
97+
role = Role.Image
98+
}
10199
}
102100

103101
@ExperimentalGlideComposeApi

0 commit comments

Comments
 (0)
Please sign in to comment.