From e5e047ee102cefc3bf5cbb67fca7c230ed50d4ea Mon Sep 17 00:00:00 2001 From: GG Bond Date: Thu, 7 Dec 2023 12:14:05 +0800 Subject: [PATCH] Move to Compose ReaderContentOverlay --- .../kotlin/com/hippo/ehviewer/Settings.kt | 7 ++ .../tachiyomi/ui/reader/ReaderActivity.kt | 64 +++++++------------ .../ui/reader/ReaderColorFilterView.kt | 36 ----------- .../ui/reader/ReaderContentOverlay.kt | 36 +++++++++++ app/src/main/res/layout/reader_activity.xml | 37 ++--------- 5 files changed, 70 insertions(+), 110 deletions(-) delete mode 100644 app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterView.kt create mode 100644 app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderContentOverlay.kt diff --git a/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt b/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt index cf0e2c946..06eeb0bbe 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt @@ -171,6 +171,13 @@ object Settings : DataStorePreferences(null) { // TODO: Remove this after swipe gestures are correctly handled in compose var touchSlopFactor by intPref("touch_slop", 3) + // Tachiyomi Reader + val colorFilter = boolPref("pref_color_filter_key", false) + val colorFilterValue = intPref("color_filter_value", 0) + val colorFilterMode = intPref("color_filter_mode", 0) + val customBrightness = boolPref("pref_custom_brightness_key", false) + val customBrightnessValue = intPref("custom_brightness_value", 0) + init { if ("CN" == Locale.getDefault().country) { edit { diff --git a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index 1daea4954..13cff3fe0 100644 --- a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt +++ b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt @@ -23,7 +23,6 @@ import android.content.ClipData import android.content.ContentValues import android.content.Intent import android.content.pm.ActivityInfo -import android.graphics.Color import android.graphics.ColorMatrix import android.graphics.ColorMatrixColorFilter import android.graphics.Paint @@ -50,6 +49,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue +import androidx.compose.ui.graphics.BlendMode import androidx.core.content.FileProvider import androidx.core.graphics.ColorUtils import androidx.core.view.WindowCompat @@ -61,8 +61,10 @@ import androidx.lifecycle.lifecycleScope import com.google.android.material.shape.MaterialShapeDrawable import com.hippo.ehviewer.BuildConfig import com.hippo.ehviewer.R +import com.hippo.ehviewer.Settings import com.hippo.ehviewer.client.EhUrl import com.hippo.ehviewer.client.data.BaseGalleryInfo +import com.hippo.ehviewer.collectAsState import com.hippo.ehviewer.databinding.ReaderActivityBinding import com.hippo.ehviewer.gallery.ArchivePageLoader import com.hippo.ehviewer.gallery.EhPageLoader @@ -104,7 +106,6 @@ import eu.kanade.tachiyomi.util.view.setTooltip import eu.kanade.tachiyomi.widget.listener.SimpleAnimationListener import java.io.File import java.io.IOException -import kotlin.math.abs import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.drop import kotlinx.coroutines.flow.launchIn @@ -301,7 +302,26 @@ class ReaderActivity : EhActivity() { buildProvider() binding = ReaderActivityBinding.inflate(layoutInflater) binding.dialogStub.setMD3Content { + val brightness by Settings.customBrightness.collectAsState() + val brightnessValue by Settings.customBrightnessValue.collectAsState() + val colorOverlayEnabled by Settings.colorFilter.collectAsState() + val colorOverlay by Settings.colorFilterValue.collectAsState() + val colorOverlayMode by Settings.colorFilterMode.collectAsState { + when (it) { + 1 -> BlendMode.Multiply + 2 -> BlendMode.Screen + 3 -> BlendMode.Overlay + 4 -> BlendMode.Lighten + 5 -> BlendMode.Darken + else -> BlendMode.SrcOver + } + } dialogState.Intercept() + ReaderContentOverlay( + brightness = { brightnessValue }.takeIf { brightness && brightnessValue < 0 }, + color = { colorOverlay }.takeIf { colorOverlayEnabled }, + colorBlendMode = colorOverlayMode, + ) } setContentView(binding.root) mGalleryProvider.let { @@ -923,14 +943,6 @@ class ReaderActivity : EhActivity() { .onEach { setCustomBrightness(it) } .launchIn(lifecycleScope) - ReaderPreferences.colorFilter().changes() - .onEach { setColorFilter(it) } - .launchIn(lifecycleScope) - - ReaderPreferences.colorFilterMode().changes() - .onEach { setColorFilter(ReaderPreferences.colorFilter().get()) } - .launchIn(lifecycleScope) - merge( ReaderPreferences.grayscale().changes(), ReaderPreferences.invertedColors().changes(), @@ -1014,21 +1026,6 @@ class ReaderActivity : EhActivity() { } } - /** - * Sets the color filter overlay according to [enabled]. - */ - @OptIn(FlowPreview::class) - private fun setColorFilter(enabled: Boolean) { - if (enabled) { - ReaderPreferences.colorFilterValue().changes() - .sample(100) - .onEach { setColorFilterValue(it) } - .launchIn(lifecycleScope) - } else { - binding.colorOverlay.isVisible = false - } - } - /** * Sets the brightness of the screen. Range is [-75, 100]. * From -75 to -1 a semi-transparent black view is overlaid with the minimum brightness. @@ -1050,23 +1047,6 @@ class ReaderActivity : EhActivity() { } window.attributes = window.attributes.apply { screenBrightness = readerBrightness } - - // Set black overlay visibility. - if (value < 0) { - binding.brightnessOverlay.isVisible = true - val alpha = (abs(value) * 2.56).toInt() - binding.brightnessOverlay.setBackgroundColor(Color.argb(alpha, 0, 0, 0)) - } else { - binding.brightnessOverlay.isVisible = false - } - } - - /** - * Sets the color filter [value]. - */ - private fun setColorFilterValue(value: Int) { - binding.colorOverlay.isVisible = true - binding.colorOverlay.setFilterColor(value, ReaderPreferences.colorFilterMode().get()) } private fun setLayerPaint(grayscale: Boolean, invertedColors: Boolean) { diff --git a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterView.kt b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterView.kt deleted file mode 100644 index 6266ab239..000000000 --- a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterView.kt +++ /dev/null @@ -1,36 +0,0 @@ -package eu.kanade.tachiyomi.ui.reader - -import android.content.Context -import android.graphics.Canvas -import android.graphics.Paint -import android.graphics.PorterDuff -import android.util.AttributeSet -import android.view.View -import androidx.core.graphics.toXfermode - -class ReaderColorFilterView( - context: Context, - attrs: AttributeSet? = null, -) : View(context, attrs) { - - private val colorFilterPaint: Paint = Paint() - - fun setFilterColor(color: Int, filterMode: Int) { - colorFilterPaint.color = color - colorFilterPaint.xfermode = when (filterMode) { - 1 -> PorterDuff.Mode.MULTIPLY - 2 -> PorterDuff.Mode.SCREEN - 3 -> PorterDuff.Mode.OVERLAY - 4 -> PorterDuff.Mode.LIGHTEN - 5 -> PorterDuff.Mode.DARKEN - else -> PorterDuff.Mode.SRC_OVER - }.toXfermode() - - invalidate() - } - - override fun onDraw(canvas: Canvas) { - super.onDraw(canvas) - canvas.drawPaint(colorFilterPaint) - } -} diff --git a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderContentOverlay.kt b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderContentOverlay.kt new file mode 100644 index 000000000..0df206953 --- /dev/null +++ b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderContentOverlay.kt @@ -0,0 +1,36 @@ +package eu.kanade.tachiyomi.ui.reader + +import androidx.compose.foundation.Canvas +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.BlendMode +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.graphicsLayer +import kotlin.math.abs + +@Composable +fun ReaderContentOverlay( + brightness: (() -> Int)?, + color: (() -> Int)?, + colorBlendMode: BlendMode = BlendMode.SrcOver, +) { + if (brightness != null) { + Canvas( + modifier = Modifier.fillMaxSize().graphicsLayer { + alpha = abs(brightness()) / 100f + }, + ) { + drawRect(Color.Black) + } + } + + if (color != null) { + Canvas(modifier = Modifier.fillMaxSize()) { + drawRect( + color = Color(color()), + blendMode = colorBlendMode, + ) + } + } +} diff --git a/app/src/main/res/layout/reader_activity.xml b/app/src/main/res/layout/reader_activity.xml index d0f7094c1..32f5382f1 100644 --- a/app/src/main/res/layout/reader_activity.xml +++ b/app/src/main/res/layout/reader_activity.xml @@ -5,11 +5,6 @@ android:layout_height="match_parent" android:gravity="center"> - - - - + + - - - -