From e93eeea497d25e17534c4ec6c2b9bf957763e91b Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Sat, 4 Jan 2025 20:37:17 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=80=20Improve=20ErrorPlaceholder=20in?= =?UTF-8?q?=20Reader?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Disabled onClick actions when error is shown * Better structure --- .../presentation/reader/ReaderContent.kt | 115 ++++++++++-------- .../reader/ReaderErrorPlaceholder.kt | 47 +++++++ .../reader/ReaderLoadingIndicator.kt | 61 ---------- .../reader/ReaderLoadingPlaceholder.kt | 27 ++++ .../presentation/reader/ReaderScaffold.kt | 11 +- .../book_story/ui/reader/ReaderEvent.kt | 5 +- .../book_story/ui/reader/ReaderModel.kt | 29 ++--- 7 files changed, 152 insertions(+), 143 deletions(-) create mode 100644 app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderErrorPlaceholder.kt delete mode 100644 app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLoadingIndicator.kt create mode 100644 app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLoadingPlaceholder.kt diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderContent.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderContent.kt index a8aabc3f..bbe2249f 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderContent.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderContent.kt @@ -91,60 +91,67 @@ fun ReaderContent( dismissBottomSheet = dismissBottomSheet ) - ReaderScaffold( - book = book, - text = text, - listState = listState, - currentChapter = currentChapter, - nestedScrollConnection = nestedScrollConnection, - fastColorPresetChange = fastColorPresetChange, - perceptionExpander = perceptionExpander, - perceptionExpanderPadding = perceptionExpanderPadding, - perceptionExpanderThickness = perceptionExpanderThickness, - currentChapterProgress = currentChapterProgress, - isLoading = isLoading, - errorMessage = errorMessage, - checkpoint = checkpoint, - showMenu = showMenu, - lockMenu = lockMenu, - contentPadding = contentPadding, - verticalPadding = verticalPadding, - horizontalGesture = horizontalGesture, - horizontalGestureScroll = horizontalGestureScroll, - horizontalGestureSensitivity = horizontalGestureSensitivity, - highlightedReading = highlightedReading, - highlightedReadingThickness = highlightedReadingThickness, - paragraphHeight = paragraphHeight, - sidePadding = sidePadding, - bottomBarPadding = bottomBarPadding, - backgroundColor = backgroundColor, - fontColor = fontColor, - fontFamily = fontFamily, - lineHeight = lineHeight, - fontStyle = fontStyle, - textAlignment = textAlignment, - horizontalAlignment = horizontalAlignment, - fontSize = fontSize, - letterSpacing = letterSpacing, - paragraphIndentation = paragraphIndentation, - doubleClickTranslation = doubleClickTranslation, - fullscreenMode = fullscreenMode, - selectPreviousPreset = selectPreviousPreset, - selectNextPreset = selectNextPreset, - menuVisibility = menuVisibility, - leave = leave, - restoreCheckpoint = restoreCheckpoint, - scroll = scroll, - changeProgress = changeProgress, - openShareApp = openShareApp, - openWebBrowser = openWebBrowser, - openTranslator = openTranslator, - openDictionary = openDictionary, - showSettingsBottomSheet = showSettingsBottomSheet, - showChaptersDrawer = showChaptersDrawer, - navigateBack = navigateBack, - navigateToBookInfo = navigateToBookInfo - ) + if (isLoading || errorMessage == null) { + ReaderScaffold( + book = book, + text = text, + listState = listState, + currentChapter = currentChapter, + nestedScrollConnection = nestedScrollConnection, + fastColorPresetChange = fastColorPresetChange, + perceptionExpander = perceptionExpander, + perceptionExpanderPadding = perceptionExpanderPadding, + perceptionExpanderThickness = perceptionExpanderThickness, + currentChapterProgress = currentChapterProgress, + isLoading = isLoading, + checkpoint = checkpoint, + showMenu = showMenu, + lockMenu = lockMenu, + contentPadding = contentPadding, + verticalPadding = verticalPadding, + horizontalGesture = horizontalGesture, + horizontalGestureScroll = horizontalGestureScroll, + horizontalGestureSensitivity = horizontalGestureSensitivity, + highlightedReading = highlightedReading, + highlightedReadingThickness = highlightedReadingThickness, + paragraphHeight = paragraphHeight, + sidePadding = sidePadding, + bottomBarPadding = bottomBarPadding, + backgroundColor = backgroundColor, + fontColor = fontColor, + fontFamily = fontFamily, + lineHeight = lineHeight, + fontStyle = fontStyle, + textAlignment = textAlignment, + horizontalAlignment = horizontalAlignment, + fontSize = fontSize, + letterSpacing = letterSpacing, + paragraphIndentation = paragraphIndentation, + doubleClickTranslation = doubleClickTranslation, + fullscreenMode = fullscreenMode, + selectPreviousPreset = selectPreviousPreset, + selectNextPreset = selectNextPreset, + menuVisibility = menuVisibility, + leave = leave, + restoreCheckpoint = restoreCheckpoint, + scroll = scroll, + changeProgress = changeProgress, + openShareApp = openShareApp, + openWebBrowser = openWebBrowser, + openTranslator = openTranslator, + openDictionary = openDictionary, + showSettingsBottomSheet = showSettingsBottomSheet, + showChaptersDrawer = showChaptersDrawer, + navigateBack = navigateBack, + navigateToBookInfo = navigateToBookInfo + ) + } else { + ReaderErrorPlaceholder( + errorMessage = errorMessage, + leave = leave, + navigateBack = navigateBack + ) + } ReaderDrawer( drawer = drawer, diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderErrorPlaceholder.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderErrorPlaceholder.kt new file mode 100644 index 00000000..ceeecd7c --- /dev/null +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderErrorPlaceholder.kt @@ -0,0 +1,47 @@ +package ua.acclorite.book_story.presentation.reader + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import ua.acclorite.book_story.R +import ua.acclorite.book_story.domain.ui.UIText +import ua.acclorite.book_story.presentation.core.components.placeholder.ErrorPlaceholder +import ua.acclorite.book_story.presentation.core.util.LocalActivity +import ua.acclorite.book_story.ui.reader.ReaderEvent + +@Composable +fun ReaderErrorPlaceholder( + errorMessage: UIText, + leave: (ReaderEvent.OnLeave) -> Unit, + navigateBack: () -> Unit +) { + val activity = LocalActivity.current + Box( + modifier = Modifier + .fillMaxSize() + .background(MaterialTheme.colorScheme.surface), + contentAlignment = Alignment.Center + ) { + ErrorPlaceholder( + errorMessage = errorMessage.asString(), + icon = painterResource(id = R.drawable.error), + actionTitle = stringResource(id = R.string.go_back), + action = { + leave( + ReaderEvent.OnLeave( + activity = activity, + navigate = { + navigateBack() + } + ) + ) + } + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLoadingIndicator.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLoadingIndicator.kt deleted file mode 100644 index dc76a014..00000000 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLoadingIndicator.kt +++ /dev/null @@ -1,61 +0,0 @@ -package ua.acclorite.book_story.presentation.reader - -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.size -import androidx.compose.material3.MaterialTheme -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.dp -import ua.acclorite.book_story.R -import ua.acclorite.book_story.domain.ui.UIText -import ua.acclorite.book_story.presentation.core.components.placeholder.ErrorPlaceholder -import ua.acclorite.book_story.presentation.core.components.progress_indicator.CircularProgressIndicator -import ua.acclorite.book_story.presentation.core.util.LocalActivity -import ua.acclorite.book_story.ui.reader.ReaderEvent - -@Composable -fun ReaderLoadingIndicator( - isLoading: Boolean, - errorMessage: UIText?, - leave: (ReaderEvent.OnLeave) -> Unit, - navigateBack: () -> Unit -) { - val activity = LocalActivity.current - - if (isLoading || errorMessage != null) { - Box( - modifier = Modifier - .fillMaxSize() - .background(MaterialTheme.colorScheme.surface), - contentAlignment = Alignment.Center - ) { - if (!isLoading) { - ErrorPlaceholder( - errorMessage = errorMessage!!.asString(), - icon = painterResource(id = R.drawable.error), - actionTitle = stringResource(id = R.string.go_back), - action = { - leave( - ReaderEvent.OnLeave( - activity = activity, - navigate = { - navigateBack() - } - ) - ) - } - ) - } else { - CircularProgressIndicator( - modifier = Modifier.size(48.dp), - strokeWidth = 4.5.dp - ) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLoadingPlaceholder.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLoadingPlaceholder.kt new file mode 100644 index 00000000..d96c9946 --- /dev/null +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderLoadingPlaceholder.kt @@ -0,0 +1,27 @@ +package ua.acclorite.book_story.presentation.reader + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.size +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import ua.acclorite.book_story.presentation.core.components.progress_indicator.CircularProgressIndicator + +@Composable +fun ReaderLoadingPlaceholder() { + Box( + modifier = Modifier + .fillMaxSize() + .background(MaterialTheme.colorScheme.surface), + contentAlignment = Alignment.Center + ) { + CircularProgressIndicator( + modifier = Modifier.size(48.dp), + strokeWidth = 4.5.dp + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderScaffold.kt b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderScaffold.kt index b5dfb6d0..f88b5988 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderScaffold.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/reader/ReaderScaffold.kt @@ -26,7 +26,6 @@ import ua.acclorite.book_story.domain.reader.ReaderHorizontalGesture import ua.acclorite.book_story.domain.reader.ReaderText import ua.acclorite.book_story.domain.reader.ReaderText.Chapter import ua.acclorite.book_story.domain.reader.ReaderTextAlignment -import ua.acclorite.book_story.domain.ui.UIText import ua.acclorite.book_story.presentation.core.components.common.AnimatedVisibility import ua.acclorite.book_story.ui.reader.ReaderEvent import ua.acclorite.book_story.ui.settings.SettingsEvent @@ -45,7 +44,6 @@ fun ReaderScaffold( perceptionExpanderThickness: Dp, currentChapterProgress: Float, isLoading: Boolean, - errorMessage: UIText?, checkpoint: Checkpoint, showMenu: Boolean, lockMenu: Boolean, @@ -178,11 +176,8 @@ fun ReaderScaffold( perceptionExpanderColor = fontColor ) - ReaderLoadingIndicator( - isLoading = isLoading, - errorMessage = errorMessage, - leave = leave, - navigateBack = navigateBack - ) + if (isLoading) { + ReaderLoadingPlaceholder() + } } } \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderEvent.kt b/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderEvent.kt index 359b050a..c1b08781 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderEvent.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderEvent.kt @@ -1,6 +1,5 @@ package ua.acclorite.book_story.ui.reader -import android.content.Context import androidx.activity.ComponentActivity import androidx.compose.runtime.Immutable import ua.acclorite.book_story.domain.reader.ReaderText.Chapter @@ -8,9 +7,7 @@ import ua.acclorite.book_story.domain.reader.ReaderText.Chapter @Immutable sealed class ReaderEvent { - data class OnLoadText( - val context: Context - ) : ReaderEvent() + data object OnLoadText : ReaderEvent() data class OnMenuVisibility( val show: Boolean, diff --git a/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderModel.kt b/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderModel.kt index 7be9693c..13562f20 100644 --- a/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/ui/reader/ReaderModel.kt @@ -140,8 +140,7 @@ class ReaderModel @Inject constructor( yield() systemBarsVisibility( - show = shouldShow, - fullscreenMode = event.fullscreenMode, + show = shouldShow || !event.fullscreenMode, activity = event.activity ) _state.update { @@ -482,11 +481,7 @@ class ReaderModel @Inject constructor( activity = activity ) ) - onEvent( - ReaderEvent.OnLoadText( - context = activity - ) - ) + onEvent(ReaderEvent.OnLoadText) } } @@ -599,18 +594,20 @@ class ReaderModel @Inject constructor( } } - private fun systemBarsVisibility( + private suspend fun systemBarsVisibility( show: Boolean, - fullscreenMode: Boolean, activity: ComponentActivity ) { - WindowCompat.getInsetsController( - activity.window, - activity.window.decorView - ).apply { - systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE - if (show || !fullscreenMode) show(WindowInsetsCompat.Type.systemBars()) - else hide(WindowInsetsCompat.Type.systemBars()) + withContext(Dispatchers.Main) { + WindowCompat.getInsetsController( + activity.window, + activity.window.decorView + ).apply { + systemBarsBehavior = + WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE + if (show) show(WindowInsetsCompat.Type.systemBars()) + else hide(WindowInsetsCompat.Type.systemBars()) + } } }