Add toggle to invert page color in reader color filter settings (#5713)

(cherry picked from commit 4c8dfd0c0cad40c1412d211cd40355f86152559b)
This commit is contained in:
Hunter Nickel 2021-08-15 08:58:01 -06:00 committed by Jobobby04
parent a773e99214
commit dc56b47e16
6 changed files with 39 additions and 8 deletions

View File

@ -55,6 +55,8 @@ object PreferenceKeys {
const val grayscale = "pref_grayscale"
const val invertedColors = "pref_inverted_colors"
const val defaultReadingMode = "pref_default_reading_mode_key"
const val defaultOrientationType = "pref_default_orientation_type_key"

View File

@ -133,6 +133,8 @@ class PreferencesHelper(val context: Context) {
fun grayscale() = flowPrefs.getBoolean(Keys.grayscale, false)
fun invertedColors() = flowPrefs.getBoolean(Keys.invertedColors, false)
fun defaultReadingMode() = prefs.getInt(Keys.defaultReadingMode, ReadingModeType.RIGHT_TO_LEFT.flagValue)
fun defaultOrientationType() = prefs.getInt(Keys.defaultOrientationType, OrientationType.FREE.flagValue)

View File

@ -100,6 +100,7 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.drop
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.merge
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.sample
import kotlinx.coroutines.launch
@ -1466,12 +1467,26 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
*/
private inner class ReaderConfig {
private val grayscalePaint by lazy {
Paint().apply {
private fun getCombinedPaint(grayscale: Boolean, invertedColors: Boolean): Paint {
return Paint().apply {
colorFilter = ColorMatrixColorFilter(
ColorMatrix().apply {
if (grayscale) {
setSaturation(0f)
}
if (invertedColors) {
postConcat(
ColorMatrix(
floatArrayOf(
-1f, 0f, 0f, 0f, 255f,
0f, -1f, 0f, 0f, 255f,
0f, 0f, -1f, 0f, 255f,
0f, 0f, 0f, 1f, 0f
)
)
)
}
}
)
}
}
@ -1523,8 +1538,8 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
.onEach { setColorFilter(preferences.colorFilter().get()) }
.launchIn(lifecycleScope)
preferences.grayscale().asFlow()
.onEach { setGrayscale(it) }
merge(preferences.grayscale().asFlow(), preferences.invertedColors().asFlow())
.onEach { setLayerPaint(preferences.grayscale().get(), preferences.invertedColors().get()) }
.launchIn(lifecycleScope)
preferences.fullscreen().asFlow()
@ -1675,8 +1690,8 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
binding.colorOverlay.setFilterColor(value, preferences.colorFilterMode().get())
}
private fun setGrayscale(enabled: Boolean) {
val paint = if (enabled) grayscalePaint else null
private fun setLayerPaint(grayscale: Boolean, invertedColors: Boolean) {
val paint = if (grayscale || invertedColors) getCombinedPaint(grayscale, invertedColors) else null
binding.viewerContainer.setLayerType(LAYER_TYPE_HARDWARE, paint)
}
}

View File

@ -67,6 +67,7 @@ class ReaderColorFilterSettings @JvmOverloads constructor(context: Context, attr
binding.customBrightness.bindToPreference(preferences.customBrightness())
binding.colorFilterMode.bindToPreference(preferences.colorFilterMode())
binding.grayscale.bindToPreference(preferences.grayscale())
binding.invertedColors.bindToPreference(preferences.invertedColors())
binding.seekbarColorFilterAlpha.setOnSeekBarChangeListener(
object : SimpleSeekBarListener() {

View File

@ -193,6 +193,16 @@
android:textColor="?android:attr/textColorSecondary"
app:layout_constraintTop_toBottomOf="@id/color_filter_mode" />
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/inverted_colors"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:text="@string/pref_inverted_colors"
android:textColor="?android:attr/textColorSecondary"
app:layout_constraintTop_toBottomOf="@id/grayscale" />
<!-- Brightness -->
<com.google.android.material.switchmaterial.SwitchMaterial
@ -203,7 +213,7 @@
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:text="@string/pref_custom_brightness"
app:layout_constraintTop_toBottomOf="@id/grayscale" />
app:layout_constraintTop_toBottomOf="@id/inverted_colors" />
<!-- Brightness value -->

View File

@ -275,6 +275,7 @@
<string name="off">Off</string>
<string name="pref_custom_brightness">Custom brightness</string>
<string name="pref_grayscale">Grayscale</string>
<string name="pref_inverted_colors">Inverted</string>
<string name="pref_custom_color_filter">Custom color filter</string>
<string name="pref_color_filter_mode">Color filter blend mode</string>
<string name="filter_mode_default">Default</string>