From 188a236a908e2d533dbbedc6d3f6846648c82504 Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Thu, 5 Sep 2024 23:25:42 +0800 Subject: [PATCH] Fix reader padding and progress indicator theme --- .../kotlin/com/hippo/ehviewer/ui/Theme.kt | 3 +- .../hippo/ehviewer/ui/reader/GalleryPager.kt | 4 - .../hippo/ehviewer/ui/reader/PagerViewer.kt | 4 - .../hippo/ehviewer/ui/reader/ReaderScreen.kt | 109 ++++++++++-------- .../hippo/ehviewer/ui/reader/WebtoonViewer.kt | 10 +- .../com/hippo/ehviewer/ui/theme/Theme.kt | 4 +- .../hippo/ehviewer/ui/tools/WindowInsets.kt | 5 + 7 files changed, 71 insertions(+), 68 deletions(-) create mode 100644 app/src/main/kotlin/com/hippo/ehviewer/ui/tools/WindowInsets.kt diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/Theme.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/Theme.kt index d0e841972..e7975ba40 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/Theme.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/Theme.kt @@ -5,6 +5,7 @@ import androidx.activity.compose.setContent import androidx.compose.animation.AnimatedContentTransitionScope import androidx.compose.animation.EnterTransition import androidx.compose.animation.ExitTransition +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.remember @@ -19,7 +20,7 @@ import soup.compose.material.motion.animation.materialSharedAxisXOut import soup.compose.material.motion.animation.rememberSlideDistance inline fun ComponentActivity.setMD3Content(crossinline content: @Composable () -> Unit) = setContent { - EhTheme { + EhTheme(useDarkTheme = isSystemInDarkTheme()) { ProvideVectorPainterCache { val dialogState = remember { DialogState() } dialogState.Intercept() diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/GalleryPager.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/GalleryPager.kt index f7bff00d9..604f4d8fe 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/GalleryPager.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/GalleryPager.kt @@ -1,6 +1,5 @@ package com.hippo.ehviewer.ui.reader -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.pager.PagerState @@ -44,7 +43,6 @@ fun GalleryPager( onSelectPage: (ReaderPage) -> Unit, onMenuRegionClick: () -> Unit, modifier: Modifier = Modifier, - contentPadding: PaddingValues = PaddingValues(0.dp), ) { val isPagerType = !ReadingModeType.isWebtoon(type) val pagerNavigation by Settings.readerPagerNav.collectAsState() @@ -84,7 +82,6 @@ fun GalleryPager( navigator = { navigator }, onSelectPage = onSelectPage, onMenuRegionClick = onMenuRegionClick, - contentPadding = contentPadding, modifier = modifier.pointerInput(channel) { awaitPointerEventScope { while (true) { @@ -103,7 +100,6 @@ fun GalleryPager( navigator = { navigator }, onSelectPage = onSelectPage, onMenuRegionClick = onMenuRegionClick, - contentPadding = contentPadding, modifier = modifier, ) } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/PagerViewer.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/PagerViewer.kt index 27940c67d..05ccb9dab 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/PagerViewer.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/PagerViewer.kt @@ -2,7 +2,6 @@ package com.hippo.ehviewer.ui.reader import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.PagerState @@ -58,7 +57,6 @@ fun PagerViewer( navigator: () -> NavigationRegions, onSelectPage: (ReaderPage) -> Unit, onMenuRegionClick: () -> Unit, - contentPadding: PaddingValues, modifier: Modifier = Modifier, ) { val scope = rememberCoroutineScope() @@ -76,7 +74,6 @@ fun PagerViewer( VerticalPager( state = pagerState, modifier = modifier, - contentPadding = contentPadding, key = { it }, ) { index -> val page = items[index] @@ -100,7 +97,6 @@ fun PagerViewer( HorizontalPager( state = pagerState, modifier = modifier, - contentPadding = contentPadding, reverseLayout = isRtl xor isRtlLayout, key = { it }, ) { index -> diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderScreen.kt index 7eb7f89a9..0f54a8af9 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderScreen.kt @@ -10,10 +10,8 @@ import androidx.compose.foundation.gestures.awaitEachGesture import androidx.compose.foundation.gestures.waitForUpOrCancellation import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.WindowInsetsSides -import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.displayCutout import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.navigationBarsPadding @@ -49,7 +47,6 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.dp import androidx.core.view.WindowInsetsControllerCompat import arrow.core.Either import arrow.core.raise.ensure @@ -64,8 +61,10 @@ import com.hippo.ehviewer.gallery.ArchivePageLoader import com.hippo.ehviewer.gallery.EhPageLoader import com.hippo.ehviewer.gallery.PageLoader2 import com.hippo.ehviewer.ui.composing +import com.hippo.ehviewer.ui.theme.EhTheme import com.hippo.ehviewer.ui.tools.Await import com.hippo.ehviewer.ui.tools.DialogState +import com.hippo.ehviewer.ui.tools.EmptyWindowInsets import com.hippo.ehviewer.util.displayString import com.hippo.files.toOkioPath import com.ramcosta.composedestinations.annotation.Destination @@ -75,6 +74,7 @@ import eu.kanade.tachiyomi.ui.reader.PageIndicatorText import eu.kanade.tachiyomi.ui.reader.ReaderAppBars import eu.kanade.tachiyomi.ui.reader.ReaderContentOverlay import eu.kanade.tachiyomi.ui.reader.ReaderPageSheetMeta +import eu.kanade.tachiyomi.ui.reader.model.ReaderPage import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.lang.withIOContext @@ -93,6 +93,14 @@ sealed interface ReaderScreenArgs : Parcelable { data class Archive(val uri: Uri) : ReaderScreenArgs } +@Composable +private fun Background( + color: Color, + content: @Composable () -> Unit, +) = Box(Modifier.fillMaxSize().background(color), contentAlignment = Alignment.Center) { + EhTheme(useDarkTheme = color != Color.White, content = content) +} + @Destination @Composable fun AnimatedVisibilityScope.ReaderScreen(args: ReaderScreenArgs, navigator: DestinationsNavigator) = composing(navigator) { @@ -124,7 +132,7 @@ fun AnimatedVisibilityScope.ReaderScreen(args: ReaderScreenArgs, navigator: Dest }.fold({ it.displayString() }, { it }) }, placeholder = { - Box(Modifier.fillMaxSize().background(bgColor), contentAlignment = Alignment.Center) { + Background(bgColor) { CircularProgressIndicator() } }, @@ -135,7 +143,7 @@ fun AnimatedVisibilityScope.ReaderScreen(args: ReaderScreenArgs, navigator: Dest ReaderScreen(pageLoader, info, navigator) } } else { - Box(Modifier.fillMaxSize().background(bgColor), contentAlignment = Alignment.Center) { + Background(bgColor) { Text( text = error, color = MaterialTheme.colorScheme.error, @@ -203,57 +211,60 @@ fun AnimatedVisibilityScope.ReaderScreen(pageLoader: PageLoader2, info: BaseGall Settings.showNavigationOverlayNewUser.value = false mutableStateOf(showOnStart) } - GalleryPager( - type = readingMode, - pagerState = pagerState, - lazyListState = lazyListState, - pageLoader = pageLoader, - showNavigationOverlay = showNavigationOverlay, - onNavigationModeChange = { showNavigationOverlay = true }, - onSelectPage = { page -> - if (Settings.readerLongTapAction.value) { - launch { - dialog { cont -> - fun dispose() = cont.resume(Unit) - val state = rememberModalBottomSheetState() - ModalBottomSheet( - onDismissRequest = { dispose() }, - modifier = Modifier.windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Top)), - sheetState = state, - contentWindowInsets = { WindowInsets(0) }, - ) { - ReaderPageSheetMeta( - retry = { pageLoader.retryPage(page.index) }, - retryOrigin = { pageLoader.retryPage(page.index, true) }, - share = { launchIO { with(pageLoader) { shareImage(page, info) } } }, - copy = { launchIO { with(pageLoader) { copy(page) } } }, - save = { launchIO { with(pageLoader) { save(page) } } }, - saveTo = { launchIO { with(pageLoader) { saveTo(page) } } }, - dismiss = { launch { state.hide().also { dispose() } } }, - ) - } + val onSelectPage = { page: ReaderPage -> + if (Settings.readerLongTapAction.value) { + launch { + dialog { cont -> + fun dispose() = cont.resume(Unit) + val state = rememberModalBottomSheetState() + ModalBottomSheet( + onDismissRequest = { dispose() }, + modifier = Modifier.windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Top)), + sheetState = state, + contentWindowInsets = { WindowInsets(0) }, + ) { + ReaderPageSheetMeta( + retry = { pageLoader.retryPage(page.index) }, + retryOrigin = { pageLoader.retryPage(page.index, true) }, + share = { launchIO { with(pageLoader) { shareImage(page, info) } } }, + copy = { launchIO { with(pageLoader) { copy(page) } } }, + save = { launchIO { with(pageLoader) { save(page) } } }, + saveTo = { launchIO { with(pageLoader) { saveTo(page) } } }, + dismiss = { launch { state.hide().also { dispose() } } }, + ) } } } - }, - onMenuRegionClick = { appbarVisible = !appbarVisible }, - modifier = Modifier.background(bgColor).pointerInput(syncState) { - awaitEachGesture { - waitForUpOrCancellation() - syncState.reset() - showNavigationOverlay = false - } - }, - contentPadding = if (fullscreen) { + } + } + EhTheme(useDarkTheme = bgColor != Color.White) { + val insets = if (fullscreen) { if (cutoutShort) { - PaddingValues(0.dp) + EmptyWindowInsets } else { - WindowInsets.displayCutout.asPaddingValues() + WindowInsets.displayCutout } } else { - WindowInsets.systemBars.asPaddingValues() - }, - ) + WindowInsets.systemBars + } + GalleryPager( + type = readingMode, + pagerState = pagerState, + lazyListState = lazyListState, + pageLoader = pageLoader, + showNavigationOverlay = showNavigationOverlay, + onNavigationModeChange = { showNavigationOverlay = true }, + onSelectPage = onSelectPage, + onMenuRegionClick = { appbarVisible = !appbarVisible }, + modifier = Modifier.background(bgColor).pointerInput(syncState) { + awaitEachGesture { + waitForUpOrCancellation() + syncState.reset() + showNavigationOverlay = false + } + }.fillMaxSize().windowInsetsPadding(insets), + ) + } val brightness by Settings.customBrightness.collectAsState() val brightnessValue by Settings.customBrightnessValue.collectAsState() val colorOverlayEnabled by Settings.colorFilter.collectAsState() diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/WebtoonViewer.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/WebtoonViewer.kt index 83c529a47..7545a8272 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/WebtoonViewer.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/WebtoonViewer.kt @@ -36,7 +36,6 @@ fun WebtoonViewer( navigator: () -> NavigationRegions, onSelectPage: (ReaderPage) -> Unit, onMenuRegionClick: () -> Unit, - contentPadding: PaddingValues, modifier: Modifier = Modifier, ) { val scope = rememberCoroutineScope() @@ -72,17 +71,14 @@ fun WebtoonViewer( val info = lazyListState.layoutInfo.visibleItemsInfo.find { info -> info.offset <= ofs.y && info.offset + info.size > ofs.y } - if (info == null && withGaps) { - // Maybe user long-click on gaps? ¯\_(ツ)_/¯ - return@zoomable + if (info != null) { + onSelectPage(items[info.index]) } - info ?: error("Internal error finding long click item!!! offset:$ofs") - onSelectPage(items[info.index]) }, onDoubleClick = DoubleTapZoom, ), state = lazyListState, - contentPadding = contentPadding + PaddingValues(horizontal = sidePadding), + contentPadding = PaddingValues(horizontal = sidePadding), verticalArrangement = Arrangement.spacedBy(if (withGaps) 15.dp else 0.dp), ) { items(items, key = { it.index }) { page -> diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/theme/Theme.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/theme/Theme.kt index 3288f8114..a7e8fa7b8 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/theme/Theme.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/theme/Theme.kt @@ -1,6 +1,5 @@ package com.hippo.ehviewer.ui.theme -import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.scrollbar.LocalScrollbarStyle import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme @@ -19,8 +18,7 @@ import com.hippo.ehviewer.ui.tools.scrollbarStyle import com.hippo.ehviewer.util.isAtLeastS @Composable -fun EhTheme(content: @Composable () -> Unit) { - val useDarkTheme = isSystemInDarkTheme() +fun EhTheme(useDarkTheme: Boolean, content: @Composable () -> Unit) { val amoled by Settings.blackDarkTheme.collectAsState() val context = LocalContext.current val colors = if (useDarkTheme) { diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/WindowInsets.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/WindowInsets.kt new file mode 100644 index 000000000..cccf0b66c --- /dev/null +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/WindowInsets.kt @@ -0,0 +1,5 @@ +package com.hippo.ehviewer.ui.tools + +import androidx.compose.foundation.layout.WindowInsets + +val EmptyWindowInsets = WindowInsets(0, 0, 0, 0)