From 509e6920d1b23a5f5683828cdab6edb75aaba667 Mon Sep 17 00:00:00 2001 From: DatLag Date: Mon, 20 Nov 2023 21:09:30 +0100 Subject: [PATCH] disable page scroll when details shown --- .../ui/screen/video/VideoScreen.android.kt | 2 +- .../ui/screen/initial/InitialComponent.kt | 3 +++ .../ui/screen/initial/InitialScreen.kt | 13 ++++++++++++ .../screen/initial/InitialScreenComponent.kt | 21 ++++++++++++++----- .../favorite/FavoriteScreenComponent.kt | 11 +++++++--- .../initial/home/HomeScreenComponent.kt | 11 +++++++--- .../initial/search/SearchScreenComponent.kt | 11 +++++++--- gradle/libs.versions.toml | 8 +++---- 8 files changed, 61 insertions(+), 19 deletions(-) diff --git a/app/shared/src/androidMain/kotlin/dev/datlag/burningseries/ui/screen/video/VideoScreen.android.kt b/app/shared/src/androidMain/kotlin/dev/datlag/burningseries/ui/screen/video/VideoScreen.android.kt index 5341db2b..9d1bdc25 100644 --- a/app/shared/src/androidMain/kotlin/dev/datlag/burningseries/ui/screen/video/VideoScreen.android.kt +++ b/app/shared/src/androidMain/kotlin/dev/datlag/burningseries/ui/screen/video/VideoScreen.android.kt @@ -63,7 +63,7 @@ actual fun VideoScreen(component: VideoComponent) { var streamIndex by remember(streamList) { mutableIntStateOf(0) } var sourceIndex by remember(streamIndex) { mutableIntStateOf(0) } - val headers = remember(streamIndex, sourceIndex) { + val headers = remember(streamIndex) { streamList[streamIndex].headers } val mediaItem = remember(streamList, streamIndex, sourceIndex) { diff --git a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/InitialComponent.kt b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/InitialComponent.kt index e9439e7e..a48c4457 100644 --- a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/InitialComponent.kt +++ b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/InitialComponent.kt @@ -6,6 +6,7 @@ import com.arkivanov.decompose.router.pages.ChildPages import com.arkivanov.decompose.value.Value import dev.datlag.burningseries.ui.navigation.Component import dev.icerock.moko.resources.StringResource +import kotlinx.coroutines.flow.StateFlow interface InitialComponent : Component { @@ -14,6 +15,8 @@ interface InitialComponent : Component { @OptIn(ExperimentalDecomposeApi::class) val pages: Value> + val scrollEnabled: StateFlow + fun selectPage(index: Int) data class PagerItem( diff --git a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/InitialScreen.kt b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/InitialScreen.kt index 440d4e6c..cecd28b0 100644 --- a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/InitialScreen.kt +++ b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/InitialScreen.kt @@ -2,6 +2,7 @@ package dev.datlag.burningseries.ui.screen.initial import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.layout.* +import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Search @@ -16,6 +17,7 @@ import com.arkivanov.decompose.ExperimentalDecomposeApi import com.arkivanov.decompose.extensions.compose.jetbrains.pages.Pages import com.moriatsushi.insetsx.ExperimentalSoftwareKeyboardApi import com.moriatsushi.insetsx.safeDrawingPadding +import dev.datlag.burningseries.common.lifecycle.collectAsStateWithLifecycle import dev.datlag.burningseries.ui.custom.ExpandedPages import dev.icerock.moko.resources.compose.stringResource @@ -62,10 +64,21 @@ private fun CompactScreen( } ) { Box(modifier = Modifier.padding(it)) { + val scrollEnabled by component.scrollEnabled.collectAsStateWithLifecycle() + Pages( pages = component.pages, onPageSelected = { index -> component.selectPage(index) + }, + pager = { modifier, state, key, pageContent -> + HorizontalPager( + modifier = modifier, + state = state, + key = key, + pageContent = pageContent, + userScrollEnabled = scrollEnabled + ) } ) { index, page -> selectedPage = index diff --git a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/InitialScreenComponent.kt b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/InitialScreenComponent.kt index c14ab864..89d721d9 100644 --- a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/InitialScreenComponent.kt +++ b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/InitialScreenComponent.kt @@ -8,6 +8,7 @@ import androidx.compose.runtime.Composable import com.arkivanov.decompose.ComponentContext import com.arkivanov.decompose.ExperimentalDecomposeApi import com.arkivanov.decompose.router.pages.* +import com.arkivanov.decompose.value.MutableValue import com.arkivanov.decompose.value.Value import dev.datlag.burningseries.common.ioDispatcher import dev.datlag.burningseries.common.ioScope @@ -22,8 +23,7 @@ import dev.datlag.burningseries.ui.navigation.Component import dev.datlag.burningseries.ui.screen.initial.favorite.FavoriteScreenComponent import dev.datlag.burningseries.ui.screen.initial.home.HomeScreenComponent import dev.datlag.burningseries.ui.screen.initial.search.SearchScreenComponent -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.flowOn +import kotlinx.coroutines.flow.* import org.kodein.di.DI import org.kodein.di.instance @@ -68,6 +68,14 @@ class InitialScreenComponent( createChild(config, context) } + private val homeScrollEnabled = MutableStateFlow(true) + private val favoriteScrollEnabled = MutableStateFlow(true) + private val searchScrollEnabled = MutableStateFlow(true) + + override val scrollEnabled: StateFlow = combine(homeScrollEnabled, favoriteScrollEnabled, searchScrollEnabled) { t1, t2, t3 -> + t1 && t2 && t3 + }.stateIn(ioScope(), SharingStarted.Lazily, homeScrollEnabled.value && favoriteScrollEnabled.value && searchScrollEnabled.value) + @Composable override fun render() { InitialScreen(this) @@ -81,17 +89,20 @@ class InitialScreenComponent( is View.Home -> HomeScreenComponent( componentContext = componentContext, di = di, - watchVideo = { watchVideo(it) } + watchVideo = { watchVideo(it) }, + scrollEnabled = { homeScrollEnabled.value = it } ) is View.Favorite -> FavoriteScreenComponent( componentContext = componentContext, di = di, - watchVideo = { watchVideo(it) } + watchVideo = { watchVideo(it) }, + scrollEnabled = { favoriteScrollEnabled.value = it } ) is View.Search -> SearchScreenComponent( componentContext = componentContext, di = di, - watchVideo = { watchVideo(it) } + watchVideo = { watchVideo(it) }, + scrollEnabled = { searchScrollEnabled.value = it } ) } } diff --git a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/favorite/FavoriteScreenComponent.kt b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/favorite/FavoriteScreenComponent.kt index b0dad4ee..9ff1cd21 100644 --- a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/favorite/FavoriteScreenComponent.kt +++ b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/favorite/FavoriteScreenComponent.kt @@ -23,7 +23,8 @@ import org.kodein.di.instance class FavoriteScreenComponent( componentContext: ComponentContext, override val di: DI, - private val watchVideo: (Collection) -> Unit + private val watchVideo: (Collection) -> Unit, + private val scrollEnabled: (Boolean) -> Unit ) : FavoriteComponent, ComponentContext by componentContext { private val database: BurningSeries by di.instance() @@ -64,7 +65,9 @@ class FavoriteScreenComponent( initialTitle = config.title, initialHref = config.href, initialCoverHref = config.coverHref, - onGoBack = navigation::dismiss, + onGoBack = { + navigation.dismiss(scrollEnabled) + }, watchVideo = { watchVideo(it) } ) } @@ -76,7 +79,9 @@ class FavoriteScreenComponent( } override fun itemClicked(config: FavoriteConfig) { - navigation.activate(config) + navigation.activate(config) { + scrollEnabled(false) + } } override fun searchQuery(text: String) { diff --git a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/home/HomeScreenComponent.kt b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/home/HomeScreenComponent.kt index 223a1e6a..d97d9122 100644 --- a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/home/HomeScreenComponent.kt +++ b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/home/HomeScreenComponent.kt @@ -21,7 +21,8 @@ import org.kodein.di.instance class HomeScreenComponent( componentContext: ComponentContext, override val di: DI, - private val watchVideo: (Collection) -> Unit + private val watchVideo: (Collection) -> Unit, + private val scrollEnabled: (Boolean) -> Unit ) : HomeComponent, ComponentContext by componentContext { private val homeStateMachine: HomeStateMachine by di.instance() @@ -39,7 +40,9 @@ class HomeScreenComponent( initialTitle = config.title, initialHref = config.href, initialCoverHref = config.coverHref, - onGoBack = navigation::dismiss, + onGoBack = { + navigation.dismiss(scrollEnabled) + }, watchVideo = { watchVideo(it) } ) } @@ -55,6 +58,8 @@ class HomeScreenComponent( } override fun itemClicked(config: HomeConfig) { - navigation.activate(config) + navigation.activate(config) { + scrollEnabled(false) + } } } \ No newline at end of file diff --git a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/search/SearchScreenComponent.kt b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/search/SearchScreenComponent.kt index 7fc9346c..052a4eee 100644 --- a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/search/SearchScreenComponent.kt +++ b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/ui/screen/initial/search/SearchScreenComponent.kt @@ -23,7 +23,8 @@ import org.kodein.di.instance class SearchScreenComponent( componentContext: ComponentContext, override val di: DI, - private val watchVideo: (Collection) -> Unit + private val watchVideo: (Collection) -> Unit, + private val scrollEnabled: (Boolean) -> Unit ) : SearchComponent, ComponentContext by componentContext { private val searchStateMachine: SearchStateMachine by di.instance() @@ -73,7 +74,9 @@ class SearchScreenComponent( initialTitle = config.title, initialHref = config.href, initialCoverHref = null, - onGoBack = navigation::dismiss, + onGoBack = { + navigation.dismiss(scrollEnabled) + }, watchVideo = { watchVideo(it) } ) } @@ -97,6 +100,8 @@ class SearchScreenComponent( } override fun itemClicked(config: SearchConfig) { - navigation.activate(config) + navigation.activate(config) { + scrollEnabled(false) + } } } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index beda42d0..f6bef1ff 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,7 @@ app = "5.0.0" aboutlibraries = "10.9.2" accompanist = "0.32.0" activity = "1.8.1" -android = "8.1.3" +android = "8.1.4" android-core = "1.12.0" appcompat = "1.6.1" appdirs = "1.2.2" @@ -22,7 +22,7 @@ grpc = "1.59.0" instesx = "0.1.0-alpha10" jsunpacker = "1.0.2" kamel = "0.8.3" -kodein = "7.20.2" +kodein = "7.21.0" kotlin = "1.9.20" ksp = "1.9.20-1.0.14" ktor = "2.3.6" @@ -30,7 +30,7 @@ ktorfit = "1.10.1" ktsoup = "0.3.0" lang = "3.13.0" material = "1.10.0" -media3 = "1.1.1" +media3 = "1.2.0" moko-resources = "0.23.0" multidex = "2.0.1" napier = "2.6.1" @@ -44,7 +44,7 @@ serialization-json = "1.6.0" splashscreen = "1.0.1" sqldelight = "2.0.0" turbine = "1.0.0" -versions = "0.49.0" +versions = "0.50.0" vlcj = "4.8.2" webview = "1.7.2" windowsize-multiplatform = "0.3.1"