@@ -8,6 +8,7 @@ import android.graphics.Rect
88import android.os.Build
99import android.os.Handler
1010import android.os.Looper
11+ import android.util.Log
1112import android.view.PixelCopy
1213import android.view.View
1314import android.view.Window
@@ -22,10 +23,7 @@ import androidx.compose.ui.platform.LocalContext
2223import androidx.compose.ui.viewinterop.AndroidView
2324import androidx.core.view.doOnLayout
2425import androidx.core.view.drawToBitmap
25- import kotlinx.coroutines.flow.catch
26- import kotlinx.coroutines.flow.launchIn
27- import kotlinx.coroutines.flow.mapNotNull
28- import kotlinx.coroutines.flow.onEach
26+ import kotlinx.coroutines.flow.*
2927import java.io.File
3028import kotlin.coroutines.resume
3129import kotlin.coroutines.resumeWithException
@@ -55,8 +53,9 @@ private inline fun ComposeView.applyCapturability(
5553 setContent {
5654 content()
5755 LaunchedEffect (controller, onCaptured) {
56+
5857 controller.captureRequests
59- .mapNotNull { config -> drawToBitmapPostLaidOut(context, config) }
58+ .map { config -> drawToBitmapPostLaidOut(context, config) }
6059 .onEach { bitmap -> onCaptured(bitmap.asImageBitmap(), null ) }
6160 .catch { error -> onCaptured(null , error) }
6261 .launchIn(this )
@@ -65,24 +64,21 @@ private inline fun ComposeView.applyCapturability(
6564}
6665
6766suspend fun View.drawToBitmapPostLaidOut (context : Context , config : Bitmap .Config ): Bitmap {
67+
6868 return suspendCoroutine { continuation ->
69+
6970 doOnLayout { view ->
70- try {
71- continuation.resume(view.drawToBitmap(config))
72- } catch (e: IllegalArgumentException ) {
73- if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .O ) {
74- val window = context.findActivity().window
75-
76- drawBitmapWithPixelCopy(
77- view = view,
78- window = window,
79- config = config,
80- onDrawn = { bitmap -> continuation.resume(bitmap) },
81- onError = { error -> continuation.resumeWithException(error) }
82- )
83- } else {
84- continuation.resumeWithException(e)
85- }
71+
72+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .O ) {
73+ val window = context.findActivity().window
74+
75+ drawBitmapWithPixelCopy(
76+ view = view,
77+ window = window,
78+ config = config,
79+ onDrawn = { bitmap -> continuation.resume(bitmap) },
80+ onError = { error -> continuation.resumeWithException(error) }
81+ )
8682 }
8783 }
8884 }
@@ -111,14 +107,14 @@ fun drawBitmapWithPixelCopy(
111107
112108 val (x, y) = IntArray (2 ).apply { view.getLocationInWindow(this ) }
113109 val rect = Rect (x, y, x + width, y + height)
114-
115110 PixelCopy .request(
116111 window,
117112 rect,
118113 bitmap,
119114 { copyResult ->
120115 if (copyResult == PixelCopy .SUCCESS ) {
121116 onDrawn(bitmap)
117+
122118 } else {
123119 onError(RuntimeException (" Failed to draw bitmap" ))
124120 }
@@ -135,4 +131,4 @@ internal fun Context.findActivity(): Activity {
135131 context = context.baseContext
136132 }
137133 throw IllegalStateException (" Unable to retrieve Activity from the current context" )
138- }
134+ }
0 commit comments