From 14c39ceaaf4d97a4bd6da79f42e2406282b5db3b Mon Sep 17 00:00:00 2001 From: raystatic Date: Sat, 4 Jul 2026 08:55:19 +0530 Subject: [PATCH] Filter use case - good practice --- .../interests/impl/filter/FilterActivity.kt | 21 ++++++++++--------- .../interests/impl/filter/FilterUtils.kt | 5 ++++- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/filter/FilterActivity.kt b/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/filter/FilterActivity.kt index d5b745b05..f3db96dd1 100644 --- a/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/filter/FilterActivity.kt +++ b/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/filter/FilterActivity.kt @@ -103,7 +103,7 @@ fun FilterScreen(modifier: Modifier = Modifier) { val sourceBitmap = remember { decodeSourceBitmap(context) } - val previewBitmap = createFilteredBitmap(sourceBitmap, selectedFilter) + val sourceImage = remember(sourceBitmap) { sourceBitmap.asImageBitmap() } Column( modifier = modifier @@ -122,23 +122,23 @@ fun FilterScreen(modifier: Modifier = Modifier) { Spacer(modifier = Modifier.height(12.dp)) Image( - bitmap = previewBitmap.asImageBitmap(), + bitmap = sourceImage, contentDescription = "Filtered Preview (${selectedFilter.name})", modifier = Modifier .size(300.dp) .clip(RoundedCornerShape(12.dp)) .background(Color.LightGray), - contentScale = ContentScale.Crop + contentScale = ContentScale.Crop, + colorFilter = selectedFilter.colorFilter ) Spacer(modifier = Modifier.height(12.dp)) LazyRow(horizontalArrangement = Arrangement.spacedBy(12.dp)) { items(FILTERS, key = { it.name }) { filter -> - val thumbnail = createFilteredBitmap(sourceBitmap, filter) FilterThumbnail( - image = thumbnail.asImageBitmap(), - name = filter.name, + image = sourceImage, + filter = filter, selected = filter == selectedFilter, onClick = { selectedFilter = filter} ) @@ -166,7 +166,7 @@ fun FilterScreen(modifier: Modifier = Modifier) { @Composable fun FilterThumbnail( image: ImageBitmap, - name: String, + filter: ImageFilter, selected: Boolean, onClick: () -> Unit ) { @@ -186,14 +186,15 @@ fun FilterThumbnail( ) { Image( bitmap = image, - contentDescription = name, + contentDescription = filter.name, modifier = Modifier.fillMaxSize(), - contentScale = ContentScale.Crop + contentScale = ContentScale.Crop, + colorFilter = filter.colorFilter ) } Spacer(modifier = Modifier.height(4.dp)) Text( - text = name, + text = filter.name, style = MaterialTheme.typography.labelMedium, fontWeight = if (selected) FontWeight.Bold else FontWeight.Normal ) diff --git a/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/filter/FilterUtils.kt b/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/filter/FilterUtils.kt index c6746d710..497030357 100644 --- a/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/filter/FilterUtils.kt +++ b/feature/interests/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/interests/impl/filter/FilterUtils.kt @@ -24,6 +24,7 @@ import android.graphics.Canvas import android.graphics.ColorMatrix import android.graphics.ColorMatrixColorFilter import android.graphics.Paint +import androidx.compose.ui.graphics.ColorFilter import androidx.core.content.FileProvider import com.google.samples.apps.nowinandroid.feature.interests.impl.R import java.io.File @@ -32,7 +33,9 @@ import java.io.FileOutputStream class ImageFilter( val name: String, val matrix: FloatArray -) +) { + val colorFilter by lazy { ColorFilter.colorMatrix(androidx.compose.ui.graphics.ColorMatrix(matrix)) } +} val FILTERS = listOf( ImageFilter(