Add option to flash white screen on page change in reader for e-ink displays

Closes #2123

(cherry picked from commit 443d56f69bc1df515ed2edcd5b2936ed8710fb71)

# Conflicts:
#	app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsReaderScreen.kt
#	app/src/main/java/eu/kanade/presentation/reader/settings/GeneralSettingsPage.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt
This commit is contained in:
arkon 2023-10-28 16:21:45 -04:00 committed by Jobobby04
parent 6fa77fe894
commit ee212460b3
7 changed files with 77 additions and 1 deletions

View File

@ -90,6 +90,11 @@ object SettingsReaderScreen : SearchableSettings {
title = stringResource(R.string.pref_page_transitions),
),
SY <-- */
Preference.PreferenceItem.SwitchPreference(
pref = readerPref.flashOnPageChange(),
title = stringResource(R.string.pref_flash_page),
subtitle = stringResource(R.string.pref_flash_page_summ),
),
getDisplayGroup(readerPreferences = readerPref),
getReadingGroup(readerPreferences = readerPref),
getPagedGroup(readerPreferences = readerPref),

View File

@ -0,0 +1,45 @@
package eu.kanade.presentation.reader
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.Stable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import kotlinx.coroutines.delay
@Stable
class DisplayRefreshHost {
internal var currentDisplayRefresh by mutableStateOf(false)
fun flash() {
currentDisplayRefresh = true
}
}
@Composable
fun DisplayRefreshHost(
hostState: DisplayRefreshHost,
modifier: Modifier = Modifier,
) {
val currentDisplayRefresh = hostState.currentDisplayRefresh
LaunchedEffect(currentDisplayRefresh) {
if (currentDisplayRefresh) {
delay(200)
hostState.currentDisplayRefresh = false
}
}
if (currentDisplayRefresh) {
Canvas(
modifier = modifier.fillMaxSize(),
) {
drawRect(Color.White)
}
}
}

View File

@ -88,7 +88,14 @@ internal fun ColumnScope.GeneralPage(screenModel: ReaderSettingsScreenModel) {
/*CheckboxItem(
label = stringResource(R.string.pref_page_transitions),
pref = screenModel.preferences.pageTransitions(),
)*/
) SY <-- */
CheckboxItem(
label = stringResource(R.string.pref_flash_page),
pref = screenModel.preferences.flashOnPageChange(),
)
// SY -->
CheckboxItem(
label = stringResource(R.string.auto_webtoon_mode),
pref = screenModel.preferences.useAutoWebtoon(),

View File

@ -53,6 +53,7 @@ import eu.kanade.domain.base.BasePreferences
import eu.kanade.domain.manga.model.readingModeType
import eu.kanade.presentation.reader.BrightnessOverlay
import eu.kanade.presentation.reader.ChapterListDialog
import eu.kanade.presentation.reader.DisplayRefreshHost
import eu.kanade.presentation.reader.OrientationModeSelectDialog
import eu.kanade.presentation.reader.PageIndicatorText
import eu.kanade.presentation.reader.ReaderPageActionsDialog
@ -160,6 +161,7 @@ class ReaderActivity : BaseActivity() {
private var menuToggleToast: Toast? = null
private var readingModeToast: Toast? = null
private val displayRefreshHost = DisplayRefreshHost()
private val windowInsetsController by lazy { WindowInsetsControllerCompat(window, binding.root) }
@ -238,6 +240,9 @@ class ReaderActivity : BaseActivity() {
ReaderViewModel.Event.ReloadViewerChapters -> {
viewModel.state.value.viewerChapters?.let(::setChapters)
}
ReaderViewModel.Event.PageChanged -> {
displayRefreshHost.flash()
}
is ReaderViewModel.Event.SetOrientation -> {
setOrientation(event.orientation)
}
@ -366,6 +371,7 @@ class ReaderActivity : BaseActivity() {
val isHttpSource = viewModel.getSource() is HttpSource
val isFullscreen by readerPreferences.fullscreen().collectAsState()
val flashOnPageChange by readerPreferences.flashOnPageChange().collectAsState()
val cropBorderPaged by readerPreferences.cropBorders().collectAsState()
val cropBorderWebtoon by readerPreferences.cropBordersWebtoon().collectAsState()
@ -477,6 +483,12 @@ class ReaderActivity : BaseActivity() {
value = state.brightnessOverlayValue,
)
if (flashOnPageChange) {
DisplayRefreshHost(
hostState = displayRefreshHost,
)
}
val onDismissRequest = viewModel::closeDialog
when (state.dialog) {
is ReaderViewModel.Dialog.Loading -> {

View File

@ -561,6 +561,8 @@ class ReaderViewModel @JvmOverloads constructor(
if (inDownloadRange) {
downloadNextChapters()
}
eventChannel.trySend(Event.PageChanged)
}
private fun downloadNextChapters() {
@ -1293,6 +1295,7 @@ class ReaderViewModel @JvmOverloads constructor(
sealed interface Event {
data object ReloadViewerChapters : Event
data object PageChanged : Event
data class SetOrientation(val orientation: Int) : Event
data class SetCoverResult(val result: SetAsCoverResult) : Event

View File

@ -18,6 +18,8 @@ class ReaderPreferences(
fun pageTransitionsWebtoon() = preferenceStore.getBoolean("pref_enable_transitions_webtoon_key", true)
// SY <--
fun flashOnPageChange() = preferenceStore.getBoolean("pref_reader_flash", false)
fun doubleTapAnimSpeed() = preferenceStore.getInt("pref_double_tap_anim_speed", 500)
fun showPageNumber() = preferenceStore.getBoolean("pref_show_page_number_key", true)

View File

@ -333,6 +333,8 @@
<string name="pref_double_tap_zoom">Double tap to zoom</string>
<string name="pref_cutout_short">Show content in cutout area</string>
<string name="pref_page_transitions">Animate page transitions</string>
<string name="pref_flash_page">Flash white on page change</string>
<string name="pref_flash_page_summ">Reduces ghosting on e-ink displays</string>
<string name="pref_double_tap_anim_speed">Double tap animation speed</string>
<string name="pref_show_page_number">Show page number</string>
<string name="pref_show_reading_mode">Show reading mode</string>