From 577f6827dbda6f73a8ca3e015e2fa2a8119e9de6 Mon Sep 17 00:00:00 2001 From: Syer10 Date: Sun, 12 Feb 2023 17:52:36 -0500 Subject: [PATCH] Add chapter url opening to browser --- .../jui/domain/chapter/model/Chapter.kt | 3 ++- .../ca/gosyer/jui/domain/manga/model/Manga.kt | 8 +++++++ .../resources/MR/values/base/strings.xml | 2 +- .../ui/manga/components/MangaScreenContent.kt | 6 ++--- .../ca/gosyer/jui/ui/reader/ReaderMenu.kt | 23 +++++++++++++++++-- .../jui/ui/reader/ReaderMenuViewModel.kt | 12 +++++----- .../ca/gosyer/jui/ui/reader/ReaderSideMenu.kt | 16 ++++++++++++- 7 files changed, 56 insertions(+), 14 deletions(-) diff --git a/domain/src/commonMain/kotlin/ca/gosyer/jui/domain/chapter/model/Chapter.kt b/domain/src/commonMain/kotlin/ca/gosyer/jui/domain/chapter/model/Chapter.kt index 8df1d410..d489ae5d 100644 --- a/domain/src/commonMain/kotlin/ca/gosyer/jui/domain/chapter/model/Chapter.kt +++ b/domain/src/commonMain/kotlin/ca/gosyer/jui/domain/chapter/model/Chapter.kt @@ -12,7 +12,7 @@ import kotlinx.serialization.Serializable @Serializable @Immutable data class Chapter( - val id: Long = -1, // todo remove default + val id: Long, val url: String, val name: String, val uploadDate: Long, @@ -24,6 +24,7 @@ data class Chapter( val lastPageRead: Int, val index: Int, val fetchedAt: Long, + val realUrl: String?, val chapterCount: Int?, val pageCount: Int?, val lastReadAt: Int?, diff --git a/domain/src/commonMain/kotlin/ca/gosyer/jui/domain/manga/model/Manga.kt b/domain/src/commonMain/kotlin/ca/gosyer/jui/domain/manga/model/Manga.kt index 1e429aa1..0e044707 100644 --- a/domain/src/commonMain/kotlin/ca/gosyer/jui/domain/manga/model/Manga.kt +++ b/domain/src/commonMain/kotlin/ca/gosyer/jui/domain/manga/model/Manga.kt @@ -32,6 +32,7 @@ data class Manga( val status: MangaStatus, val inLibrary: Boolean, val source: Source?, + val updateStrategy: UpdateStrategy, val freshData: Boolean, val meta: MangaMeta, val realUrl: String?, @@ -67,3 +68,10 @@ enum class MangaStatus(@Transient val res: StringResource) { CANCELLED(MR.strings.status_cancelled), ON_HIATUS(MR.strings.status_on_hiatus); } + +@Serializable +@Stable +enum class UpdateStrategy { + ALWAYS_UPDATE, + ONLY_FETCH_ONCE +} \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/values/base/strings.xml b/i18n/src/commonMain/resources/MR/values/base/strings.xml index 49a78526..9a87c26d 100644 --- a/i18n/src/commonMain/resources/MR/values/base/strings.xml +++ b/i18n/src/commonMain/resources/MR/values/base/strings.xml @@ -44,7 +44,7 @@ Search… More actions Ok - Browser + Open in Browser Filter Mark as read Mark as unread diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/manga/components/MangaScreenContent.kt b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/manga/components/MangaScreenContent.kt index 9d9c7cfb..5cced256 100644 --- a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/manga/components/MangaScreenContent.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/manga/components/MangaScreenContent.kt @@ -33,7 +33,7 @@ import androidx.compose.material.icons.rounded.Favorite import androidx.compose.material.icons.rounded.FavoriteBorder import androidx.compose.material.icons.rounded.FlipToBack import androidx.compose.material.icons.rounded.Label -import androidx.compose.material.icons.rounded.OpenInBrowser +import androidx.compose.material.icons.rounded.Public import androidx.compose.material.icons.rounded.Refresh import androidx.compose.material.icons.rounded.RemoveDone import androidx.compose.material.icons.rounded.SelectAll @@ -347,8 +347,8 @@ private fun getActionItems( ).toImmutableList() ), ActionItem( - name = stringResource(MR.strings.action_browser), - icon = Icons.Rounded.OpenInBrowser, + name = stringResource(MR.strings.action_open_in_browser), + icon = Icons.Rounded.Public, enabled = openInBrowserEnabled, doAction = openInBrowser ) diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/ReaderMenu.kt b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/ReaderMenu.kt index bbdbb4e5..8e32a622 100644 --- a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/ReaderMenu.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/ReaderMenu.kt @@ -39,6 +39,7 @@ import androidx.compose.material.Surface import androidx.compose.material.Text import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.ChevronRight +import androidx.compose.material.icons.rounded.Public import androidx.compose.material.icons.rounded.Settings import androidx.compose.material.rememberModalBottomSheetState import androidx.compose.runtime.Composable @@ -64,6 +65,7 @@ import androidx.compose.ui.input.key.onKeyEvent import androidx.compose.ui.input.key.type import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.unit.dp import ca.gosyer.jui.core.lang.withIOContext import ca.gosyer.jui.domain.reader.model.Direction @@ -409,7 +411,24 @@ fun ThinReaderMenu( closable = true, onClose = onCloseRequest, actions = { - listOf( + val uriHandler = LocalUriHandler.current + listOfNotNull( + if (chapter.chapter.realUrl != null) { + ActionItem( + stringResource(MR.strings.action_open_in_browser), + Icons.Rounded.Public, + doAction = { + uriHandler.openUri( + chapter.chapter.realUrl ?: return@ActionItem + ) + scope.launch { + sheetState.show() + } + } + ) + } else { + null + }, ActionItem( stringResource(MR.strings.location_settings), Icons.Rounded.Settings, @@ -418,7 +437,7 @@ fun ThinReaderMenu( sheetState.show() } } - ) + ), ).toImmutableList() } ) diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/ReaderMenuViewModel.kt b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/ReaderMenuViewModel.kt index df13a96f..639ba9dc 100644 --- a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/ReaderMenuViewModel.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/ReaderMenuViewModel.kt @@ -93,25 +93,25 @@ class ReaderMenuViewModel @Inject constructor( private val _state = MutableStateFlow(ReaderChapter.State.Wait) val state = _state.asStateFlow() - val pages = viewerChapters.flatMapLatest { - val previousChapterPages = it.prevChapter + val pages = viewerChapters.flatMapLatest { viewerChapters -> + val previousChapterPages = viewerChapters.prevChapter ?.pages ?.map { (it as? PagesState.Success)?.pages } ?: flowOf(null) - val chapterPages = it.currChapter + val chapterPages = viewerChapters.currChapter ?.pages ?.map { (it as? PagesState.Success)?.pages } ?: flowOf(null) - val nextChapterPages = it.nextChapter + val nextChapterPages = viewerChapters.nextChapter ?.pages ?.map { (it as? PagesState.Success)?.pages } ?: flowOf(null) combine(previousChapterPages, chapterPages, nextChapterPages) { prev, cur, next -> ( prev.orEmpty() + - ReaderPageSeparator(it.prevChapter, it.currChapter) + + ReaderPageSeparator(viewerChapters.prevChapter, viewerChapters.currChapter) + cur.orEmpty() + - ReaderPageSeparator(it.currChapter, it.nextChapter) + + ReaderPageSeparator(viewerChapters.currChapter, viewerChapters.nextChapter) + next.orEmpty() ).toImmutableList() diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/ReaderSideMenu.kt b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/ReaderSideMenu.kt index f388e0be..f10032fb 100644 --- a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/ReaderSideMenu.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/ReaderSideMenu.kt @@ -34,6 +34,7 @@ import androidx.compose.material.ProgressIndicatorDefaults import androidx.compose.material.Slider import androidx.compose.material.Surface import androidx.compose.material.Text +import androidx.compose.material.TextButton import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.ChevronLeft import androidx.compose.material.icons.rounded.NavigateBefore @@ -48,6 +49,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.rotate +import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import ca.gosyer.jui.core.util.replace @@ -82,11 +84,13 @@ fun ReaderSideMenu( Column(Modifier.fillMaxSize()) { val pageCount = chapter.chapter.pageCount!! ReaderMenuToolbar(onCloseSideMenuClicked = onCloseSideMenuClicked) + Spacer(Modifier.height(4.dp)) ReaderModeSetting( readerModes = readerModes, selectedMode = selectedMode, onSetReaderMode = onSetReaderMode ) + Spacer(Modifier.height(4.dp)) ReaderProgressSlider( pages = pages, currentPage = currentPage, @@ -94,6 +98,16 @@ fun ReaderSideMenu( onNewPageClicked = onNewPageClicked, isRtL = false ) + Spacer(Modifier.height(4.dp)) + val uriHandler = LocalUriHandler.current + TextButton( + onClick = { uriHandler.openUri(chapter.chapter.realUrl ?: return@TextButton) }, + enabled = chapter.chapter.realUrl != null, + modifier = Modifier.fillMaxWidth().padding(horizontal = 4.dp) + ) { + Text(stringResource(MR.strings.action_open_in_browser)) + } + Spacer(Modifier.height(4.dp)) NavigateChapters( loadPrevChapter = onPrevChapterClicked, loadNextChapter = onNextChapterClicked @@ -214,7 +228,7 @@ fun ReaderSheet( selectedMode: String, onSetReaderMode: (String) -> Unit ) { - Column(Modifier.fillMaxWidth()) { + Column(Modifier.fillMaxSize()) { ReaderModeSetting(readerModes, selectedMode, onSetReaderMode) } }