Переглянути джерело

added blur for old devices

sirekanian 3 роки тому
батько
коміт
391c594a0f

+ 33 - 0
app/src/main/java/com/sirekanian/spacetime/ui/BlurHelper.kt

@@ -0,0 +1,33 @@
+@file:Suppress("DEPRECATION")
+
+package com.sirekanian.spacetime.ui
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.renderscript.Allocation
+import android.renderscript.Element
+import android.renderscript.RenderScript
+import android.renderscript.ScriptIntrinsicBlur
+
+class BlurHelper(context: Context, private val bitmap: Bitmap) {
+
+    private val script = RenderScript.create(context)
+    private val input = Allocation.createFromBitmap(script, bitmap)
+    private val output = Allocation.createTyped(script, input.type)
+    private val blur = ScriptIntrinsicBlur.create(script, Element.U8(script))
+
+    fun blur(radius: Float) {
+        blur.setRadius(radius)
+        blur.setInput(input)
+        blur.forEach(output)
+        output.copyTo(bitmap)
+    }
+
+    fun destroy() {
+        blur.destroy()
+        output.destroy()
+        input.destroy()
+        script.destroy()
+    }
+
+}

+ 33 - 0
app/src/main/java/com/sirekanian/spacetime/ui/BlurTransformation.kt

@@ -0,0 +1,33 @@
+package com.sirekanian.spacetime.ui
+
+import android.content.Context
+import android.graphics.Bitmap
+import coil.size.Size
+import coil.transform.Transformation
+
+class BlurTransformation(
+    private val context: Context,
+    private val radius: Float,
+    url: String,
+) : Transformation {
+
+    override val cacheKey: String = "url=$url|radius=$radius"
+
+    override suspend fun transform(input: Bitmap, size: Size): Bitmap {
+        if (radius > 0) {
+            doTransformation(input)
+        }
+        return input
+    }
+
+    private fun doTransformation(input: Bitmap) {
+        var helper: BlurHelper? = null
+        try {
+            helper = BlurHelper(context, input)
+            helper.blur(radius)
+        } finally {
+            helper?.destroy()
+        }
+    }
+
+}

+ 19 - 1
app/src/main/java/com/sirekanian/spacetime/ui/ImagePageContent.kt

@@ -1,5 +1,6 @@
 package com.sirekanian.spacetime.ui
 
+import android.os.Build
 import androidx.activity.compose.BackHandler
 import androidx.compose.animation.core.animateFloatAsState
 import androidx.compose.foundation.ExperimentalFoundationApi
@@ -54,11 +55,28 @@ fun ImagePageContent(
         model = ImageRequest.Builder(LocalContext.current)
             .data(page.url)
             .crossfade(true)
+            .let {
+                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
+                    val context = LocalContext.current
+                    val blurTransformation = remember(blur) {
+                        BlurTransformation(context, blur * 22 + 3, page.url)
+                    }
+                    it.transformations(blurTransformation)
+                } else {
+                    it
+                }
+            }
             .build(),
         contentDescription = null,
         modifier = Modifier
             .fillMaxSize()
-            .blur((blur * 29 + 3).dp),
+            .let {
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+                    it.blur((blur * 22 + 3).dp)
+                } else {
+                    it
+                }
+            },
         contentScale = ContentScale.Crop,
     )
     DefaultAnimatedVisibility(visible = isEditMode) {