diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsReaderScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsReaderScreen.kt index a29b9da9b..502c73415 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsReaderScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsReaderScreen.kt @@ -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), diff --git a/app/src/main/java/eu/kanade/presentation/reader/DisplayRefreshHost.kt b/app/src/main/java/eu/kanade/presentation/reader/DisplayRefreshHost.kt new file mode 100644 index 000000000..018dbb948 --- /dev/null +++ b/app/src/main/java/eu/kanade/presentation/reader/DisplayRefreshHost.kt @@ -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) + } + } +} diff --git a/app/src/main/java/eu/kanade/presentation/reader/settings/GeneralSettingsPage.kt b/app/src/main/java/eu/kanade/presentation/reader/settings/GeneralSettingsPage.kt index 2e563c399..f5f5644ea 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/settings/GeneralSettingsPage.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/settings/GeneralSettingsPage.kt @@ -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(), diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index eb3d37d49..00a9887dd 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt @@ -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 -> { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt index 33821f230..895a48e61 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt @@ -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 diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt index f77c5972b..bfecfa34e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt @@ -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) diff --git a/i18n/src/main/res/values/strings.xml b/i18n/src/main/res/values/strings.xml index ce717378f..685f02608 100755 --- a/i18n/src/main/res/values/strings.xml +++ b/i18n/src/main/res/values/strings.xml @@ -333,6 +333,8 @@ Double tap to zoom Show content in cutout area Animate page transitions + Flash white on page change + Reduces ghosting on e-ink displays Double tap animation speed Show page number Show reading mode