From 094f8b6a438a9b6a60105d39a38804a4743816cb Mon Sep 17 00:00:00 2001 From: geeksville Date: Wed, 4 Mar 2020 13:40:09 -0800 Subject: [PATCH] fix channel image scaling with new compose --- .../java/com/geeksville/mesh/ui/Channel.kt | 49 +++++++++++++++---- 1 file changed, 40 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/ui/Channel.kt b/app/src/main/java/com/geeksville/mesh/ui/Channel.kt index ab4979ec5..3f289c7a9 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/Channel.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/Channel.kt @@ -3,20 +3,21 @@ package com.geeksville.mesh.ui import android.content.Intent import android.graphics.Bitmap import androidx.compose.Composable -import androidx.ui.core.ContextAmbient -import androidx.ui.core.Text -import androidx.ui.foundation.SimpleImage -import androidx.ui.graphics.Image -import androidx.ui.graphics.ImageConfig -import androidx.ui.graphics.NativeImage +import androidx.ui.core.* +import androidx.ui.foundation.Box +import androidx.ui.graphics.* import androidx.ui.graphics.colorspace.ColorSpace import androidx.ui.graphics.colorspace.ColorSpaces +import androidx.ui.graphics.painter.ImagePainter import androidx.ui.layout.* import androidx.ui.material.MaterialTheme import androidx.ui.material.OutlinedButton import androidx.ui.material.ripple.Ripple import androidx.ui.tooling.preview.Preview +import androidx.ui.unit.Density +import androidx.ui.unit.PxSize import androidx.ui.unit.dp +import androidx.ui.unit.toRect import com.geeksville.analytics.DataPair import com.geeksville.android.GeeksvilleApplication import com.geeksville.android.Logging @@ -71,6 +72,35 @@ class AndroidImage(val bitmap: Bitmap) : Image { } } + +/// Stolen from the Compose SimpleImage, replace with their real Image component someday +// TODO(mount, malkov) : remove when RepaintBoundary is a modifier: b/149982905 +// This is class and not val because if b/149985596 +private object ClipModifier : DrawModifier { + override fun draw(density: Density, drawContent: () -> Unit, canvas: Canvas, size: PxSize) { + canvas.save() + canvas.clipRect(size.toRect()) + drawContent() + canvas.restore() + } +} + +/// Stolen from the Compose SimpleImage, replace with their real Image component someday +@Composable +fun ScaledImage( + image: Image, + modifier: Modifier = Modifier.None, + tint: Color? = null +) { + with(DensityAmbient.current) { + val imageModifier = ImagePainter(image).toModifier( + scaleFit = ScaleFit.FillMaxDimension, + colorFilter = tint?.let { ColorFilter(it, BlendMode.srcIn) } + ) + Box(modifier + ClipModifier + imageModifier) + } +} + @Composable fun ChannelContent(channel: Channel = Channel("Default", 7)) { analyticsScreen(name = "channel") @@ -90,9 +120,10 @@ fun ChannelContent(channel: Channel = Channel("Default", 7)) { // val image = imageResource(id = R.drawable.qrcode) val image = AndroidImage(UIState.getChannelQR(context)) - //Container(modifier = LayoutGravity.Center + LayoutSize.Min(200.dp, 200.dp)) { - SimpleImage(image = image) - //} + ScaledImage( + image = image, + modifier = LayoutGravity.Center + LayoutSize.Min(200.dp, 200.dp) + ) Ripple(bounded = false) { OutlinedButton(modifier = LayoutGravity.Center + LayoutPadding(start = 24.dp),