Skip to content

Commit

Permalink
RUM-6535: Add backwards compatibility for Coil AsyncImage
Browse files Browse the repository at this point in the history
  • Loading branch information
ambushwork committed Dec 5, 2024
1 parent 4f55776 commit c7aa1b7
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,13 @@ internal object ComposeReflection {
val AndroidImageBitmapClass = getClassSafe("androidx.compose.ui.graphics.AndroidImageBitmap")
val BitmapField = AndroidImageBitmapClass?.getDeclaredFieldSafe("bitmap")

val ContentPainterModifierClass = getClassSafe("coil.compose.ContentPainterModifier")
val PainterFieldOfContentPainterModifier =
ContentPainterModifierClass?.getDeclaredFieldSafe("painter")

val ContentPainterElementClass = getClassSafe("coil.compose.ContentPainterElement")
val PainterFieldOfContentPainter = ContentPainterElementClass?.getDeclaredFieldSafe("painter")
val PainterFieldOfContentPainterElement =
ContentPainterElementClass?.getDeclaredFieldSafe("painter")

val AsyncImagePainterClass = getClassSafe("coil.compose.AsyncImagePainter")
val PainterFieldOfAsyncImagePainter = AsyncImagePainterClass?.getDeclaredFieldSafe("_painter")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,15 @@ import com.datadog.android.sessionreplay.compose.internal.reflection.ComposeRefl
import com.datadog.android.sessionreplay.compose.internal.reflection.ComposeReflection.BitmapField
import com.datadog.android.sessionreplay.compose.internal.reflection.ComposeReflection.CompositionField
import com.datadog.android.sessionreplay.compose.internal.reflection.ComposeReflection.ContentPainterElementClass
import com.datadog.android.sessionreplay.compose.internal.reflection.ComposeReflection.ContentPainterModifierClass
import com.datadog.android.sessionreplay.compose.internal.reflection.ComposeReflection.GetInnerLayerCoordinatorMethod
import com.datadog.android.sessionreplay.compose.internal.reflection.ComposeReflection.ImageField
import com.datadog.android.sessionreplay.compose.internal.reflection.ComposeReflection.LayoutNodeField
import com.datadog.android.sessionreplay.compose.internal.reflection.ComposeReflection.PainterElementClass
import com.datadog.android.sessionreplay.compose.internal.reflection.ComposeReflection.PainterField
import com.datadog.android.sessionreplay.compose.internal.reflection.ComposeReflection.PainterFieldOfAsyncImagePainter
import com.datadog.android.sessionreplay.compose.internal.reflection.ComposeReflection.PainterFieldOfContentPainter
import com.datadog.android.sessionreplay.compose.internal.reflection.ComposeReflection.PainterFieldOfContentPainterElement
import com.datadog.android.sessionreplay.compose.internal.reflection.ComposeReflection.PainterFieldOfContentPainterModifier
import com.datadog.android.sessionreplay.compose.internal.reflection.getSafe

@Suppress("TooManyFunctions")
Expand Down Expand Up @@ -136,12 +138,16 @@ internal class ReflectionUtils {
}

fun getAsyncImagePainter(semanticsNode: SemanticsNode): Painter? {
val modifier = semanticsNode.layoutInfo.getModifierInfo().firstOrNull {
ContentPainterElementClass?.isInstance(it.modifier) == true
}?.modifier
val asyncPainter = PainterFieldOfContentPainter?.getSafe(modifier)
val painter = PainterFieldOfAsyncImagePainter?.getSafe(asyncPainter) as? Painter
return painter
val asyncPainter = semanticsNode.layoutInfo.getModifierInfo().firstNotNullOfOrNull {
if (ContentPainterModifierClass?.isInstance(it.modifier) == true) {
PainterFieldOfContentPainterModifier?.getSafe(it.modifier)
} else if (ContentPainterElementClass?.isInstance(it.modifier) == true) {
PainterFieldOfContentPainterElement?.getSafe(it.modifier)
} else {
null
}
}
return PainterFieldOfAsyncImagePainter?.getSafe(asyncPainter) as? Painter
}

fun getNestedPainter(painter: Painter): Painter? {
Expand Down

0 comments on commit c7aa1b7

Please sign in to comment.