From fdbf9f0f71eeb19573159162811e2afc6561259d Mon Sep 17 00:00:00 2001 From: DatLag Date: Sat, 4 May 2024 13:46:26 +0200 Subject: [PATCH] switch between anime and manga --- .../commonMain/graphql/AiringQuery.graphql | 1 - .../dev/datlag/aniflow/other/StateSaver.kt | 13 ++++- .../screen/initial/home/HomeComponent.kt | 4 ++ .../screen/initial/home/HomeScreen.kt | 53 +++++++++++++++++++ .../initial/home/HomeScreenComponent.kt | 19 +++++++ .../screen/initial/settings/SettingsScreen.kt | 23 -------- .../navigation/screen/medium/MediumScreen.kt | 13 +++-- gradle/libs.versions.toml | 6 +-- 8 files changed, 99 insertions(+), 33 deletions(-) diff --git a/anilist/src/commonMain/graphql/AiringQuery.graphql b/anilist/src/commonMain/graphql/AiringQuery.graphql index 5a5c45f..0f9b0c6 100644 --- a/anilist/src/commonMain/graphql/AiringQuery.graphql +++ b/anilist/src/commonMain/graphql/AiringQuery.graphql @@ -9,7 +9,6 @@ query AiringQuery( Page(page: $page, perPage: $perPage) { airingSchedules(sort: $sort, airingAt_greater: $airingAtGreater) { airingAt, - timeUntilAiring, episode, media { id, diff --git a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/other/StateSaver.kt b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/other/StateSaver.kt index 41a5734..c83fa50 100644 --- a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/other/StateSaver.kt +++ b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/other/StateSaver.kt @@ -1,9 +1,13 @@ package dev.datlag.aniflow.other import androidx.compose.ui.graphics.Color +import com.mayakapps.kache.InMemoryKache +import com.mayakapps.kache.KacheStrategy import dev.datlag.aniflow.anilist.* import dev.datlag.aniflow.anilist.state.SeasonState import dev.datlag.aniflow.settings.model.AppSettings +import dev.datlag.tooling.async.scopeCatching +import dev.datlag.tooling.async.suspendCatching import dev.datlag.tooling.compose.ioDispatcher import kotlinx.coroutines.delay import kotlinx.coroutines.flow.* @@ -20,8 +24,13 @@ data object StateSaver { var homeOverview: Int = 0 var homeOverviewOffset: Int = 0 - var mediaOverview: Int = 0 - var mediaOverviewOffset: Int = 0 + private val mediumOverview = mutableMapOf>() + + fun mediumOverview(id: Int): Pair = mediumOverview.getOrElse(id) { 0 to 0 } + + fun mediumOverview(id: Int, index: Int, offset: Int) { + mediumOverview[id] = index to offset + } var settingsOverview: Int = 0 var settingsOverviewOffset: Int = 0 diff --git a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeComponent.kt b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeComponent.kt index 80bff08..679d336 100644 --- a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeComponent.kt +++ b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeComponent.kt @@ -7,6 +7,7 @@ import dev.datlag.aniflow.anilist.PopularSeasonRepository import dev.datlag.aniflow.anilist.TrendingRepository import dev.datlag.aniflow.anilist.model.Medium import dev.datlag.aniflow.anilist.state.SeasonState +import dev.datlag.aniflow.anilist.type.MediaType import dev.datlag.aniflow.settings.model.AppSettings import dev.datlag.aniflow.trace.TraceStateMachine import dev.datlag.aniflow.ui.navigation.Component @@ -18,6 +19,7 @@ import kotlinx.coroutines.flow.StateFlow import dev.datlag.aniflow.settings.model.TitleLanguage as SettingsTitle interface HomeComponent : ContentHolderComponent { + val viewing: Value val titleLanguage: Flow val airingState: Flow @@ -29,4 +31,6 @@ interface HomeComponent : ContentHolderComponent { fun details(medium: Medium) fun trace(channel: ByteArray) + fun viewAnime() + fun viewManga() } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeScreen.kt b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeScreen.kt index 97af1fc..886103d 100644 --- a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeScreen.kt +++ b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeScreen.kt @@ -9,8 +9,11 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.MenuBook import androidx.compose.material.icons.filled.Camera import androidx.compose.material.icons.filled.CameraEnhance +import androidx.compose.material.icons.filled.MenuBook +import androidx.compose.material.icons.filled.PlayCircleFilled import androidx.compose.material3.* import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass @@ -19,6 +22,7 @@ import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import com.arkivanov.decompose.extensions.compose.subscribeAsState @@ -33,6 +37,7 @@ import dev.chrisbanes.haze.haze import dev.datlag.aniflow.LocalHaze import dev.datlag.aniflow.LocalPaddingValues import dev.datlag.aniflow.SharedRes +import dev.datlag.aniflow.anilist.type.MediaType import dev.datlag.aniflow.common.asMedium import dev.datlag.aniflow.common.isScrollingUp import dev.datlag.aniflow.common.plus @@ -141,6 +146,54 @@ private fun MainView(component: HomeComponent, modifier: Modifier = Modifier) { contentPadding = LocalPaddingValues.current?.plus(padding) ?: padding, verticalArrangement = Arrangement.spacedBy(8.dp) ) { + item { + val type by component.viewing.subscribeAsState() + val isManga = remember(type) { + type == MediaType.MANGA + } + + Box( + modifier = Modifier.fillParentMaxWidth().height(200.dp), + contentAlignment = Alignment.BottomEnd + ) { + Row( + modifier = Modifier.padding(16.dp).background(Color.Black.copy(alpha = 0.3F), CircleShape), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceAround + ) { + IconButton( + onClick = { + component.viewAnime() + } + ) { + Icon( + imageVector = Icons.Default.PlayCircleFilled, + contentDescription = null, + tint = if (isManga) { + LocalContentColor.current + } else { + MaterialTheme.colorScheme.primary + } + ) + } + IconButton( + onClick = { + component.viewManga() + } + ) { + Icon( + imageVector = Icons.AutoMirrored.Filled.MenuBook, + contentDescription = null, + tint = if (isManga) { + MaterialTheme.colorScheme.primary + } else { + LocalContentColor.current + } + ) + } + } + } + } item { Text( modifier = Modifier.padding(horizontal = 16.dp), diff --git a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeScreenComponent.kt b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeScreenComponent.kt index 271e2cc..39054ed 100644 --- a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeScreenComponent.kt +++ b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/home/HomeScreenComponent.kt @@ -4,11 +4,14 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import com.arkivanov.decompose.ComponentContext import com.arkivanov.decompose.router.slot.* +import com.arkivanov.decompose.value.MutableValue import com.arkivanov.decompose.value.Value +import com.arkivanov.decompose.value.update import dev.datlag.aniflow.LocalDI import dev.datlag.aniflow.anilist.* import dev.datlag.aniflow.anilist.model.Medium import dev.datlag.aniflow.anilist.state.SeasonState +import dev.datlag.aniflow.anilist.type.MediaType import dev.datlag.aniflow.common.onRender import dev.datlag.aniflow.other.StateSaver import dev.datlag.aniflow.settings.Settings @@ -61,6 +64,8 @@ class HomeScreenComponent( context = ioDispatcher() ) + override val viewing = MutableValue(MediaType.UNKNOWN__) + @Composable override fun render() { onRender { @@ -81,4 +86,18 @@ class HomeScreenComponent( traceStateMachine.dispatch(TraceStateMachine.Action.Load(channel)) } } + + override fun viewAnime() { + viewing.update { MediaType.ANIME } + trendingRepository.viewAnime() + popularSeasonRepository.viewAnime() + popularNextSeasonRepository.viewAnime() + } + + override fun viewManga() { + viewing.update { MediaType.MANGA } + trendingRepository.viewManga() + popularSeasonRepository.viewManga() + popularNextSeasonRepository.viewManga() + } } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/settings/SettingsScreen.kt b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/settings/SettingsScreen.kt index 44d36ad..16ca737 100644 --- a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/settings/SettingsScreen.kt +++ b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/initial/settings/SettingsScreen.kt @@ -1,48 +1,26 @@ package dev.datlag.aniflow.ui.navigation.screen.initial.settings import androidx.compose.foundation.Image -import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.filled.More import androidx.compose.material.icons.filled.* -import androidx.compose.material.icons.rounded.Title import androidx.compose.material3.* import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi -import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass -import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ColorFilter -import androidx.compose.ui.graphics.painter.ColorPainter -import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalUriHandler -import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import coil3.compose.AsyncImage -import coil3.compose.rememberAsyncImagePainter -import com.maxkeppeker.sheets.core.models.base.IconSource -import com.maxkeppeker.sheets.core.models.base.rememberUseCaseState -import com.maxkeppeler.sheets.option.OptionDialog -import com.maxkeppeler.sheets.option.models.DisplayMode -import com.maxkeppeler.sheets.option.models.Option -import com.maxkeppeler.sheets.option.models.OptionConfig -import com.maxkeppeler.sheets.option.models.OptionSelection -import com.mikepenz.markdown.m3.Markdown import dev.chrisbanes.haze.haze import dev.datlag.aniflow.LocalHaze import dev.datlag.aniflow.LocalPaddingValues import dev.datlag.aniflow.SharedRes -import dev.datlag.aniflow.common.htmlToAnnotatedString import dev.datlag.aniflow.common.plus -import dev.datlag.aniflow.common.toComposeColor -import dev.datlag.aniflow.common.toComposeString import dev.datlag.aniflow.other.Constants import dev.datlag.aniflow.other.StateSaver import dev.datlag.aniflow.ui.navigation.screen.initial.settings.component.* @@ -50,7 +28,6 @@ import dev.datlag.tooling.compose.onClick import dev.datlag.tooling.decompose.lifecycle.collectAsStateWithLifecycle import dev.icerock.moko.resources.compose.painterResource -@OptIn(ExperimentalLayoutApi::class, ExperimentalMaterial3WindowSizeClassApi::class, ExperimentalMaterial3Api::class) @Composable fun SettingsScreen(component: SettingsComponent) { val padding = PaddingValues(16.dp) diff --git a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/medium/MediumScreen.kt b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/medium/MediumScreen.kt index 1c486d5..9f60158 100644 --- a/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/medium/MediumScreen.kt +++ b/composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/medium/MediumScreen.kt @@ -40,6 +40,7 @@ import dev.datlag.aniflow.other.UserHelper import dev.datlag.aniflow.ui.custom.EditFAB import dev.datlag.aniflow.ui.navigation.screen.medium.component.* import dev.datlag.tooling.decompose.lifecycle.collectAsStateWithLifecycle +import kotlinx.coroutines.launch import org.kodein.di.instance @OptIn(ExperimentalMaterial3Api::class, ExperimentalHazeMaterialsApi::class, ExperimentalFoundationApi::class) @@ -57,9 +58,10 @@ fun MediumScreen(component: MediumComponent) { val scrollState = TopAppBarDefaults.exitUntilCollapsedScrollBehavior( state = appBarState ) + val (index, offset) = StateSaver.List.mediumOverview(component.initialMedium.id) val listState = rememberLazyListState( - initialFirstVisibleItemIndex = StateSaver.List.mediaOverview, - initialFirstVisibleItemScrollOffset = StateSaver.List.mediaOverviewOffset + initialFirstVisibleItemIndex = index, + initialFirstVisibleItemScrollOffset = offset ) Scaffold( @@ -211,8 +213,11 @@ fun MediumScreen(component: MediumComponent) { DisposableEffect(listState) { onDispose { - StateSaver.List.mediaOverview = listState.firstVisibleItemIndex - StateSaver.List.mediaOverviewOffset = listState.firstVisibleItemScrollOffset + StateSaver.List.mediumOverview( + id = component.initialMedium.id, + index = listState.firstVisibleItemIndex, + offset = listState.firstVisibleItemScrollOffset + ) } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f672dca..8be70d5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,7 @@ app = "1.1.1" aboutlibraries = "11.1.3" activity = "1.9.0" android = "8.2.2" -android-core = "1.13.0" +android-core = "1.13.1" android-credentials = "1.3.0-alpha02" apollo = "4.0.0-beta.6" appcompat = "1.6.1" @@ -13,7 +13,7 @@ compose = "1.6.2" complete-kotlin = "1.1.0" coroutines = "1.8.0" crashlytics-plugin = "2.9.9" -datastore = "1.1.0" +datastore = "1.1.1" datetime = "0.6.0-RC.2" decompose = "3.0.0" desugar = "2.0.4" @@ -37,7 +37,7 @@ ksp = "1.9.23-1.0.20" ktor = "2.3.10" ktorfit = "1.13.0" markdown-renderer = "0.16.0" -moko-resources = "0.24.0-beta-2" +moko-resources = "0.24.0-beta-3" multidex = "2.0.1" napier = "2.7.1" oidc = "0.9.2"