From a32846cbda0950c26c3af94835c6c1fbe57c1ee2 Mon Sep 17 00:00:00 2001 From: Maia Grotepass Date: Fri, 5 Sep 2025 22:10:43 +0200 Subject: [PATCH 1/3] Refactor SafeArea and update KSP settings --- .../de/berlindroid/zepatch/patchable/Demo.kt | 85 +++++++++---------- .../de/berlindroid/zepatch/ui/SafeArea.kt | 4 +- gradle.properties | 6 +- 3 files changed, 48 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/de/berlindroid/zepatch/patchable/Demo.kt b/app/src/main/java/de/berlindroid/zepatch/patchable/Demo.kt index 24d3f16..b53e50e 100644 --- a/app/src/main/java/de/berlindroid/zepatch/patchable/Demo.kt +++ b/app/src/main/java/de/berlindroid/zepatch/patchable/Demo.kt @@ -5,7 +5,6 @@ import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape @@ -89,28 +88,28 @@ fun AndroidLogo() { @Patch("AndyA") @Composable fun AndyA() { - SafeArea( - modifier = Modifier - .size(200.dp) - .background( - brush = Brush.linearGradient( - colors = listOf( - Color.Red, - Color.Yellow, - Color.Green, - Color.Blue, - Color.Cyan + SafeArea { + Column( + modifier = Modifier + .size(200.dp) + .background( + brush = Brush.linearGradient( + colors = listOf( + Color.Red, + Color.Yellow, + Color.Green, + Color.Blue, + Color.Cyan + ) + ), + shape = RoundedCornerShape( + topStartPercent = 50, + topEndPercent = 50, + bottomStartPercent = 50, + bottomEndPercent = 0 ) ), - shape = RoundedCornerShape( - topStartPercent = 50, - topEndPercent = 50, - bottomStartPercent = 50, - bottomEndPercent = 0 - ) - ), - ) { - Column(modifier = Modifier.fillMaxSize()) { + ) { Spacer(modifier = Modifier.weight(1f)) Text( modifier = Modifier.fillMaxWidth(), @@ -129,28 +128,28 @@ fun AndyA() { @Patch("AndyB") @Composable fun AndyB() { - SafeArea( - modifier = Modifier - .size(200.dp) - .background( - color = Color.White, - shape = RoundedCornerShape( - topStartPercent = 0, - topEndPercent = 50, - bottomStartPercent = 50, - bottomEndPercent = 50 - ) - ) - .border( - 12.dp, Color.Black, RoundedCornerShape( - topStartPercent = 0, - topEndPercent = 50, - bottomStartPercent = 50, - bottomEndPercent = 50 + SafeArea { + Column( + modifier = Modifier + .size(200.dp) + .background( + color = Color.White, + shape = RoundedCornerShape( + topStartPercent = 0, + topEndPercent = 50, + bottomStartPercent = 50, + bottomEndPercent = 50 + ) ) - ), - ) { - Column(modifier = Modifier.fillMaxSize()) { + .border( + 12.dp, Color.Black, RoundedCornerShape( + topStartPercent = 0, + topEndPercent = 50, + bottomStartPercent = 50, + bottomEndPercent = 50 + ) + ), + ) { Spacer(modifier = Modifier.weight(1f)) Text( modifier = Modifier.fillMaxWidth(), @@ -161,7 +160,7 @@ fun AndyB() { style = TextStyle.Default.copy(shadow = Shadow(blurRadius = 12f)), color = Color.Black, text = "Andy", - letterSpacing = -1.sp + letterSpacing = (-1).sp ) Spacer(modifier = Modifier.weight(1f)) } diff --git a/app/src/main/java/de/berlindroid/zepatch/ui/SafeArea.kt b/app/src/main/java/de/berlindroid/zepatch/ui/SafeArea.kt index 1ed9aa5..96e8383 100644 --- a/app/src/main/java/de/berlindroid/zepatch/ui/SafeArea.kt +++ b/app/src/main/java/de/berlindroid/zepatch/ui/SafeArea.kt @@ -3,7 +3,6 @@ package de.berlindroid.zepatch.ui import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp /** @@ -11,11 +10,10 @@ import androidx.compose.ui.unit.dp */ @Composable fun SafeArea( - modifier: Modifier = Modifier, content: @Composable () -> Unit, ) { Box( - modifier = modifier.padding(32.dp), + modifier = androidx.compose.ui.Modifier.padding(32.dp), ) { content() } diff --git a/gradle.properties b/gradle.properties index 20e2a01..8b8ff35 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,4 +20,8 @@ kotlin.code.style=official # Enables namespacing of each library's R class so that its R class includes only the # resources declared in the library itself and none from the library's dependencies, # thereby reducing the size of the R class for that library -android.nonTransitiveRClass=true \ No newline at end of file +android.nonTransitiveRClass=true +ksp.incremental=false +ksp.incremental.log=true +# For more verbose KSP logs (can be very noisy) +# ksp.log.level=DEBUG \ No newline at end of file From 3cffa83ab4091783f5deb51e951a87bd8a925e8d Mon Sep 17 00:00:00 2001 From: Maia Grotepass Date: Fri, 5 Sep 2025 22:18:00 +0200 Subject: [PATCH 2/3] Enhance SafeArea to capture content as ImageBitmap --- .../de/berlindroid/zepatch/ui/SafeArea.kt | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/de/berlindroid/zepatch/ui/SafeArea.kt b/app/src/main/java/de/berlindroid/zepatch/ui/SafeArea.kt index 96e8383..501eb00 100644 --- a/app/src/main/java/de/berlindroid/zepatch/ui/SafeArea.kt +++ b/app/src/main/java/de/berlindroid/zepatch/ui/SafeArea.kt @@ -3,18 +3,50 @@ package de.berlindroid.zepatch.ui import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.drawWithContent +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ImageBitmap +import androidx.compose.ui.graphics.rememberGraphicsLayer import androidx.compose.ui.unit.dp +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch /** * Common SafeArea wrapper to provide consistent padding around patchable content. + * + * Extended to optionally capture the rendered content into an ImageBitmap when + * shouldCapture becomes true, returning it via onBitmap. */ @Composable fun SafeArea( + shouldCapture: Boolean = false, + onBitmap: (ImageBitmap) -> Unit = {}, content: @Composable () -> Unit, ) { + val coroutineScope = rememberCoroutineScope() + val graphicsLayer = rememberGraphicsLayer() + Box( - modifier = androidx.compose.ui.Modifier.padding(32.dp), + modifier = Modifier + .padding(32.dp) + .drawWithContent { + // Record content drawing into the graphics layer + graphicsLayer.record { + this@drawWithContent.drawContent() + } + }, ) { + LaunchedEffect(shouldCapture) { + if (shouldCapture) { + coroutineScope.launch(Dispatchers.IO) { + val bitmap = graphicsLayer.toImageBitmap() + onBitmap(bitmap) + } + } + } content() } } From cec73938e6b946a71a863023b540044f8f1e3cb0 Mon Sep 17 00:00:00 2001 From: Maia Grotepass Date: Fri, 5 Sep 2025 22:43:15 +0200 Subject: [PATCH 3/3] Refactor patchable composables to accept capture parameters This change modifies the patchable composables and the `PatchableToBitmap` composable to handle bitmap capturing more directly. Refactor PatchableBoundingBox composable Refactor: Remove explicit `androidx.compose.ui.graphics.ImageBitmap` type --- .../java/de/berlindroid/zepatch/Holzmesser.kt | 1 + .../de/berlindroid/zepatch/MainActivity.kt | 22 ++- .../de/berlindroid/zepatch/patchable/Demo.kt | 153 ++++++++++++------ .../zepatch/ui/PatchableToBitmap.kt | 20 +-- .../zepatch/ui/PatchableToBoundingBox.kt | 5 +- .../de/berlindroid/zepatch/ui/SafeArea.kt | 5 +- .../zepatch/utils/CaptureToBitmap.kt | 58 ------- .../zepatch/processor/PatchSymbolProcessor.kt | 24 ++- 8 files changed, 156 insertions(+), 132 deletions(-) delete mode 100644 app/src/main/java/de/berlindroid/zepatch/utils/CaptureToBitmap.kt diff --git a/app/src/main/java/de/berlindroid/zepatch/Holzmesser.kt b/app/src/main/java/de/berlindroid/zepatch/Holzmesser.kt index e42eb92..3216df5 100644 --- a/app/src/main/java/de/berlindroid/zepatch/Holzmesser.kt +++ b/app/src/main/java/de/berlindroid/zepatch/Holzmesser.kt @@ -10,4 +10,5 @@ import de.berlindroid.zepatch.generated.PatchRegistry */ // Generated via @Patch + KSP + val patchables = PatchRegistry.patchables diff --git a/app/src/main/java/de/berlindroid/zepatch/MainActivity.kt b/app/src/main/java/de/berlindroid/zepatch/MainActivity.kt index 4735e3c..79f2a83 100644 --- a/app/src/main/java/de/berlindroid/zepatch/MainActivity.kt +++ b/app/src/main/java/de/berlindroid/zepatch/MainActivity.kt @@ -195,7 +195,7 @@ private fun PatchableDetail( modifier: Modifier = Modifier, name: String, onBackClick: () -> Unit, - patchable: @Composable () -> Unit, + patchable: @Composable (Boolean, (ImageBitmap) -> Unit) -> Unit, ) { var imageBitmap by remember { mutableStateOf(null) } var reducedImageBitmap by remember { mutableStateOf(null) } @@ -245,12 +245,24 @@ private fun PatchableDetail( name, onBitmapUpdated = { imageBitmap = it }, onColorCountUpdated = { colorCount = it }, - onReducedUpdated = { img, histo -> reducedImageBitmap = img;reducedHistogram = histo }, - onEmbroideryUpdated = { data, preview -> embroideryData = data; embroideryPreviewImage = preview }, + onReducedUpdated = { img, histo -> + reducedImageBitmap = img;reducedHistogram = histo + }, + onEmbroideryUpdated = { data, preview -> + embroideryData = data + embroideryPreviewImage = preview + }, patchable ) - WizardButtons(currentMode, imageBitmap, reducedImageBitmap, embroideryData, name, launcher) { + WizardButtons( + currentMode, + imageBitmap, + reducedImageBitmap, + embroideryData, + name, + launcher + ) { currentMode = it } } @@ -269,7 +281,7 @@ private fun WizardContent( onColorCountUpdated: (Int) -> Unit, onReducedUpdated: (ImageBitmap, Histogram) -> Unit, onEmbroideryUpdated: (ByteArray, ImageBitmap) -> Unit, - patchable: @Composable (() -> Unit), + patchable: @Composable (Boolean, (ImageBitmap) -> Unit) -> Unit, ) { Card( modifier = Modifier diff --git a/app/src/main/java/de/berlindroid/zepatch/patchable/Demo.kt b/app/src/main/java/de/berlindroid/zepatch/patchable/Demo.kt index b53e50e..26885a4 100644 --- a/app/src/main/java/de/berlindroid/zepatch/patchable/Demo.kt +++ b/app/src/main/java/de/berlindroid/zepatch/patchable/Demo.kt @@ -10,10 +10,16 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Text +import androidx.compose.material3.TextField import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.Shadow import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.TextStyle @@ -28,12 +34,17 @@ import de.berlindroid.zepatch.R import de.berlindroid.zepatch.annotations.Patch import de.berlindroid.zepatch.ui.SafeArea - @OptIn(ExperimentalMaterial3Api::class) @Patch("AppLogo") @Composable -fun AppLogo() { - SafeArea { +fun AppLogo( + shouldCapture: Boolean = false, + onBitmap: (ImageBitmap) -> Unit = {}, +) { + SafeArea( + shouldCapture = shouldCapture, + onBitmap = onBitmap, + ) { Image( modifier = Modifier.size(200.dp), painter = painterResource(R.drawable.ai_logo), @@ -46,8 +57,14 @@ fun AppLogo() { @OptIn(ExperimentalMaterial3Api::class) @Patch("BerlindroidLogo") @Composable -fun BerlindroidLogo() { - SafeArea { +fun BerlindroidLogo( + shouldCapture: Boolean = false, + onBitmap: (ImageBitmap) -> Unit = {}, +) { + SafeArea( + shouldCapture = shouldCapture, + onBitmap = onBitmap, + ) { Image( modifier = Modifier.size(200.dp), painter = painterResource(R.drawable.voltron_nosign), @@ -60,8 +77,14 @@ fun BerlindroidLogo() { @OptIn(ExperimentalMaterial3Api::class) @Patch("GoogleLogo") @Composable -fun GoogleLogo() { - SafeArea { +fun GoogleLogo( + shouldCapture: Boolean = false, + onBitmap: (ImageBitmap) -> Unit = {}, +) { + SafeArea( + shouldCapture = shouldCapture, + onBitmap = onBitmap, + ) { Image( modifier = Modifier.size(200.dp), painter = painterResource(R.drawable.g), @@ -74,8 +97,14 @@ fun GoogleLogo() { @OptIn(ExperimentalMaterial3Api::class) @Patch("Android") @Composable -fun AndroidLogo() { - SafeArea { +fun AndroidLogo( + shouldCapture: Boolean = false, + onBitmap: (ImageBitmap) -> Unit = {}, +) { + SafeArea( + shouldCapture = shouldCapture, + onBitmap = onBitmap, + ) { Image( modifier = Modifier.size(200.dp), painter = painterResource(R.drawable.andriod), @@ -87,48 +116,64 @@ fun AndroidLogo() { @Patch("AndyA") @Composable -fun AndyA() { - SafeArea { - Column( - modifier = Modifier - .size(200.dp) - .background( - brush = Brush.linearGradient( - colors = listOf( - Color.Red, - Color.Yellow, - Color.Green, - Color.Blue, - Color.Cyan +fun AndyA( + shouldCapture: Boolean = false, + onBitmap: (ImageBitmap) -> Unit = {}, +) { + var name by remember { mutableStateOf("Andy") } + Column { + SafeArea( + shouldCapture = shouldCapture, + onBitmap = onBitmap, + ) { + Column( + modifier = Modifier + .size(200.dp) + .background( + brush = Brush.linearGradient( + colors = listOf( + Color.Red, + Color.Yellow, + Color.Green, + Color.Blue, + Color.Cyan + ) + ), + shape = RoundedCornerShape( + topStartPercent = 50, + topEndPercent = 50, + bottomStartPercent = 50, + bottomEndPercent = 0 ) ), - shape = RoundedCornerShape( - topStartPercent = 50, - topEndPercent = 50, - bottomStartPercent = 50, - bottomEndPercent = 0 - ) - ), - ) { - Spacer(modifier = Modifier.weight(1f)) - Text( - modifier = Modifier.fillMaxWidth(), - fontFamily = FontFamily.Cursive, - textAlign = TextAlign.Center, - fontStyle = FontStyle.Italic, - fontWeight = FontWeight.ExtraBold, - fontSize = 70.sp, - text = "Andy", - ) - Spacer(modifier = Modifier.weight(1f)) + ) { + Spacer(modifier = Modifier.weight(1f)) + Text( + modifier = Modifier.fillMaxWidth(), + fontFamily = FontFamily.Cursive, + textAlign = TextAlign.Center, + fontStyle = FontStyle.Italic, + fontWeight = FontWeight.ExtraBold, + fontSize = 70.sp, + text = name, + ) + Spacer(modifier = Modifier.weight(1f)) + } } + TextField(value = name, onValueChange = { name = it }) } } @Patch("AndyB") @Composable -fun AndyB() { - SafeArea { +fun AndyB( + shouldCapture: Boolean = false, + onBitmap: (ImageBitmap) -> Unit = {}, +) { + SafeArea( + shouldCapture = shouldCapture, + onBitmap = onBitmap, + ) { Column( modifier = Modifier .size(200.dp) @@ -169,16 +214,28 @@ fun AndyB() { @Patch("flex") @Composable -fun Emoji() { - SafeArea { +fun Emoji( + shouldCapture: Boolean = false, + onBitmap: (ImageBitmap) -> Unit = {}, +) { + SafeArea( + shouldCapture = shouldCapture, + onBitmap = onBitmap, + ) { Text("πŸ’ͺ", fontSize = 48.sp) } } @Patch("ROBOT") @Composable -fun Emoji2() { - SafeArea { +fun Emoji2( + shouldCapture: Boolean = false, + onBitmap: (ImageBitmap) -> Unit = {}, +) { + SafeArea( + shouldCapture = shouldCapture, + onBitmap = onBitmap, + ) { Text("πŸ¦ΎπŸ€–\nHereWeGo", fontSize = 34.sp) } } @@ -186,5 +243,5 @@ fun Emoji2() { @Preview @Composable fun PreviewDemo() { - AndyB() + AndyA() } diff --git a/app/src/main/java/de/berlindroid/zepatch/ui/PatchableToBitmap.kt b/app/src/main/java/de/berlindroid/zepatch/ui/PatchableToBitmap.kt index e8dde0f..9823242 100644 --- a/app/src/main/java/de/berlindroid/zepatch/ui/PatchableToBitmap.kt +++ b/app/src/main/java/de/berlindroid/zepatch/ui/PatchableToBitmap.kt @@ -13,7 +13,6 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.ImageBitmap -import de.berlindroid.zepatch.utils.CaptureToBitmap /** * Renders the provided [patchable] into a Bitmap-like [ImageBitmap] and displays it via [Image]. @@ -23,7 +22,7 @@ import de.berlindroid.zepatch.utils.CaptureToBitmap fun PatchableToBitmap( modifier: Modifier = Modifier, onBitmap: (ImageBitmap) -> Unit = {}, - patchable: @Composable () -> Unit, + patchable: @Composable (Boolean, (ImageBitmap) -> Unit) -> Unit, ) { var image by remember { mutableStateOf(null) } var shouldCapture by remember { mutableStateOf(false) } @@ -33,16 +32,12 @@ fun PatchableToBitmap( image = null shouldCapture = true }) { Text("Do it") } - // Compose the content through the composable utility; it will invoke the callback when ready. - CaptureToBitmap( - modifier = Modifier.fillMaxWidth(), - shouldCapture = shouldCapture, - onBitmap = { img -> - image = img - shouldCapture = false - }, - content = patchable - ) + + // Render the patchable; it will capture via SafeArea when shouldCapture is true + patchable(shouldCapture) { img -> + image = img + shouldCapture = false + } image?.let { Image( @@ -52,7 +47,6 @@ fun PatchableToBitmap( ) onBitmap(it) } ?: CircularProgressIndicator() - } } diff --git a/app/src/main/java/de/berlindroid/zepatch/ui/PatchableToBoundingBox.kt b/app/src/main/java/de/berlindroid/zepatch/ui/PatchableToBoundingBox.kt index e5fd959..48267de 100644 --- a/app/src/main/java/de/berlindroid/zepatch/ui/PatchableToBoundingBox.kt +++ b/app/src/main/java/de/berlindroid/zepatch/ui/PatchableToBoundingBox.kt @@ -5,12 +5,13 @@ import androidx.compose.foundation.layout.Box import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.unit.dp @Composable fun PatchableBoundingBox( modifier: Modifier = Modifier, - patchable: @Composable () -> Unit + patchable: @Composable (Boolean, (ImageBitmap) -> Unit) -> Unit ) { Box( modifier = modifier.border( @@ -18,6 +19,6 @@ fun PatchableBoundingBox( color = Color.Black, ), ) { - patchable() + patchable(false, {}) } } diff --git a/app/src/main/java/de/berlindroid/zepatch/ui/SafeArea.kt b/app/src/main/java/de/berlindroid/zepatch/ui/SafeArea.kt index 501eb00..a629fb7 100644 --- a/app/src/main/java/de/berlindroid/zepatch/ui/SafeArea.kt +++ b/app/src/main/java/de/berlindroid/zepatch/ui/SafeArea.kt @@ -1,5 +1,6 @@ package de.berlindroid.zepatch.ui +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable @@ -37,7 +38,9 @@ fun SafeArea( graphicsLayer.record { this@drawWithContent.drawContent() } - }, + drawContent() + } + .background(Color.Transparent), ) { LaunchedEffect(shouldCapture) { if (shouldCapture) { diff --git a/app/src/main/java/de/berlindroid/zepatch/utils/CaptureToBitmap.kt b/app/src/main/java/de/berlindroid/zepatch/utils/CaptureToBitmap.kt deleted file mode 100644 index 4a5db4c..0000000 --- a/app/src/main/java/de/berlindroid/zepatch/utils/CaptureToBitmap.kt +++ /dev/null @@ -1,58 +0,0 @@ -package de.berlindroid.zepatch.utils - -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.drawWithContent -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.ImageBitmap -import androidx.compose.ui.graphics.rememberGraphicsLayer -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch - -/** - * A composable function that captures the drawn content of its child composables into a bitmap - * when triggered. This allows developers to programmatically generate an `ImageBitmap` - * from the rendered UI content. - * - * @param modifier A [Modifier] instance to apply to this composable for layout or styling configurations. - * @param shouldCapture A flag to trigger the capture process when set to `true`. The content will be converted - * to a bitmap and passed to the `onBitmap` callback. - * @param onBitmap A callback triggered with the generated [ImageBitmap] once the content has been - * successfully captured. - * @param content A lambda expression containing the composable content to be rendered and captured - * into the output bitmap. - */ -@Composable -fun CaptureToBitmap( - modifier: Modifier = Modifier, - shouldCapture: Boolean = false, - onBitmap: (ImageBitmap) -> Unit, - content: @Composable () -> Unit, -) { - val coroutineScope = rememberCoroutineScope() - val graphicsLayer = rememberGraphicsLayer() - Box( - modifier = modifier - .drawWithContent { - // Record content drawing into the graphics layer - graphicsLayer.record { - this@drawWithContent.drawContent() - } - } - .background(Color.Transparent) - ) { - LaunchedEffect(shouldCapture) { - if (shouldCapture) { - coroutineScope.launch(Dispatchers.IO) { - val bitmap = graphicsLayer.toImageBitmap() - onBitmap(bitmap) - } - } - } - content() - } -} diff --git a/patch-processor/src/main/kotlin/de/berlindroid/zepatch/processor/PatchSymbolProcessor.kt b/patch-processor/src/main/kotlin/de/berlindroid/zepatch/processor/PatchSymbolProcessor.kt index 4a06096..9f88de9 100644 --- a/patch-processor/src/main/kotlin/de/berlindroid/zepatch/processor/PatchSymbolProcessor.kt +++ b/patch-processor/src/main/kotlin/de/berlindroid/zepatch/processor/PatchSymbolProcessor.kt @@ -2,7 +2,6 @@ package de.berlindroid.zepatch.processor import com.google.devtools.ksp.KspExperimental import com.google.devtools.ksp.getAnnotationsByType -import com.google.devtools.ksp.processing.CodeGenerator import com.google.devtools.ksp.processing.Dependencies import com.google.devtools.ksp.processing.Resolver import com.google.devtools.ksp.processing.SymbolProcessor @@ -61,18 +60,33 @@ class PatchSymbolProcessor(val environment: SymbolProcessorEnvironment) : Symbol val objectName = "PatchRegistry" val composableAnnotation = ClassName("androidx.compose.runtime", "Composable") + val imageBitmapClass = ClassName("androidx.compose.ui.graphics", "ImageBitmap") + val onBitmapLambda = LambdaTypeName.get( + returnType = Unit::class.asTypeName(), + parameters = arrayOf(imageBitmapClass) + ) + val patchableLambda = LambdaTypeName.get( + returnType = Unit::class.asTypeName(), + parameters = arrayOf(Boolean::class.asTypeName(), onBitmapLambda) + ).copy( + annotations = listOf(AnnotationSpec.builder(composableAnnotation).build()) + ) + val mapType = com.squareup.kotlinpoet.MAP.parameterizedBy( String::class.asTypeName(), - LambdaTypeName.get(returnType = Unit::class.asTypeName()).copy( - annotations = listOf(AnnotationSpec.builder(composableAnnotation).build()) - ) + patchableLambda ) val mapInitializer = CodeBlock.builder().apply { add("mapOf(\n") entries.forEachIndexed { idx, e -> val sep = if (idx < entries.size - 1) "," else "" - add(" %S to { %L() }%L\n", e.key, e.fqFunctionCall, sep) + add( + " %S to { shouldCapture, onBitmap -> %L(shouldCapture = shouldCapture, onBitmap = onBitmap) }%L\n", + e.key, + e.fqFunctionCall, + sep + ) } add(")") }.build()