Skip to content

NPE in ZoomablePeekOverlay on Android 9 #138

@haluzpav

Description

@haluzpav

Hello, I'm getting crash reports from Android 9 users (API 28).

Fatal Exception: java.lang.NullPointerException:
       at androidx.compose.ui.node.LayoutNodeDrawScope.drawContent(LayoutNodeDrawScope.kt:49)
       at me.saket.telephoto.zoomable.ZoomablePeekOverlayKt$zoomablePeekOverlay$1$1.invoke(ZoomablePeekOverlay.kt:43)
       at me.saket.telephoto.zoomable.ZoomablePeekOverlayKt$zoomablePeekOverlay$1$1.invoke(ZoomablePeekOverlay.kt:42)
       at androidx.compose.ui.graphics.drawscope.DrawScope$record$1.invoke(DrawScope.java:1077)
       at androidx.compose.ui.graphics.drawscope.DrawScope$record$1.invoke(DrawScope.java:941)
       at androidx.compose.ui.graphics.layer.GraphicsLayer$clipDrawBlock$1.invoke(GraphicsLayer.java:71)
       at androidx.compose.ui.graphics.layer.GraphicsLayer$clipDrawBlock$1.invoke(GraphicsLayer.java:66)
       at androidx.compose.ui.graphics.layer.ViewLayer.dispatchDraw(GraphicsViewLayer.android.kt:592)
       at android.view.View.draw(View.java:21884)

My minSdk is 24, and so far I got the crash reports from 9 users, so I guess it's specific to API 28.

It doesn't happen every time - I see in analytics they sometimes get through my main screen and then crash in detail (I use zoomablePeekOverlay in both, always). I didn't manage to replicate in emulator at all.

Affected phones: Galaxy S8, P20 Lite, Redmi Note 7, ...

Lib version 0.15.1.

Here's an example code where some users crash. The AsyncImage is Coil.

@Composable
fun HomeBanner(
    imageUrl: String?,
    modifier: Modifier = Modifier,
    onClick: (() -> Unit)? = null,
    onZoom: ((Boolean) -> Unit)? = null,
    contentDescription: String? = null,
) {
    val zoomablePeekOverlayState = rememberZoomablePeekOverlayState()

    LaunchedEffect(zoomablePeekOverlayState.isZoomedIn) {
        onZoom?.invoke(zoomablePeekOverlayState.isZoomedIn)
    }

    Surface(
        color = Color.Transparent,
        contentColor = MyTheme.colors.textStrong,
        modifier = modifier,
    ) {
        AsyncImage(
            model = MyImageRequestBuilder(imageUrl = imageUrl).build(),
            contentDescription = contentDescription,
            contentScale = ContentScale.Crop,
            modifier = Modifier
                .zoomablePeekOverlay(state = zoomablePeekOverlayState)
                .fillMaxWidth()
                .aspectRatio(ratio = 335f / 176)
                .imageInspectionBackground()
                .thenIf(onClick != null) { Modifier.clickable(onClick = onClick!!) },
        )
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    blockedbugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions