diff --git a/navi-uitron/src/main/java/com/navi/uitron/model/ui/PagerProperty.kt b/navi-uitron/src/main/java/com/navi/uitron/model/ui/PagerProperty.kt index bd7f342..0d38386 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/model/ui/PagerProperty.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/model/ui/PagerProperty.kt @@ -23,6 +23,7 @@ data class PagerProperty( var initialPagerPosition: Int? = null, var isScrollGestureDetectionNeeded: Boolean? = null, var scrollPageAnimationSpec: AnimationSpec? = null, + var stopScrollAtLastPage: Boolean? = null, ) : BaseProperty() { companion object { @@ -47,6 +48,7 @@ data class PagerProperty( pagerProperty?.initialPagerPosition?.let { initialPagerPosition = it } pagerProperty?.isScrollGestureDetectionNeeded?.let { isScrollGestureDetectionNeeded = it } pagerProperty?.scrollPageAnimationSpec?.let { scrollPageAnimationSpec = it } + pagerProperty?.stopScrollAtLastPage?.let { stopScrollAtLastPage = it } } data class SpacingStyle(var type: String? = null, var spacing: Int? = null) diff --git a/navi-uitron/src/main/java/com/navi/uitron/provider/container/PagerIndicatorV2ViewRenderer.kt b/navi-uitron/src/main/java/com/navi/uitron/provider/container/PagerIndicatorV2ViewRenderer.kt index 27b4eff..d02f840 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/provider/container/PagerIndicatorV2ViewRenderer.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/provider/container/PagerIndicatorV2ViewRenderer.kt @@ -18,9 +18,7 @@ class PagerIndicatorV2ViewRenderer : IUiTronRenderer { @Composable override fun RenderUiTronView(uiTronRenderConfig: UiTronRenderConfig) { (uiTronRenderConfig.composeView.property as? PagerIndicatorProperty)?.let { - PagerIndicatorV2Renderer( - childrenComposeViews = uiTronRenderConfig.composeView.childrenViews.orEmpty() - ) + PagerIndicatorV2Renderer() .Render( property = it, uiTronData = diff --git a/navi-uitron/src/main/java/com/navi/uitron/render/PagerIndicatorV2Renderer.kt b/navi-uitron/src/main/java/com/navi/uitron/render/PagerIndicatorV2Renderer.kt index 9a3f17b..e2c660a 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/render/PagerIndicatorV2Renderer.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/render/PagerIndicatorV2Renderer.kt @@ -22,6 +22,11 @@ import androidx.compose.material.ContentAlpha import androidx.compose.material.LocalContentAlpha import androidx.compose.material.LocalContentColor import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha @@ -39,7 +44,6 @@ import com.navi.uitron.model.data.EmptyData import com.navi.uitron.model.data.UiTronData import com.navi.uitron.model.ui.PagerIndicatorProperty import com.navi.uitron.model.ui.UiTronShape -import com.navi.uitron.model.ui.UiTronView import com.navi.uitron.modifer.ModifierBuilder import com.navi.uitron.utils.ShapeType import com.navi.uitron.utils.ShapeUtil @@ -64,8 +68,7 @@ import com.navi.uitron.viewmodel.UiTronViewModel import kotlin.math.absoluteValue import kotlin.math.sign -class PagerIndicatorV2Renderer(private val childrenComposeViews: List) : - Renderer { +class PagerIndicatorV2Renderer() : Renderer { @Composable override fun Render( @@ -76,6 +79,8 @@ class PagerIndicatorV2Renderer(private val childrenComposeViews: List + LaunchedEffect(uiTronViewModel.stateHolder.getPagerStateV2(key)) { + uiTronViewModel.stateHolder.getPagerStateV2(key)?.value?.let { pagerState = it } + } + } - if (property.visible.orTrue() && pagerState?.pageCount.orZero() > 1) { + if (property.visible.orTrue() && pagerState.pageCount.orZero() > 1) { val rootView = LocalView.current.rootView if (property.orientation == PagerIndicatorProperty.ORIENTATION_VERTICAL) { VerticalPagerIndicator( - pagerState = pagerState ?: rememberPagerState { childrenComposeViews.size }, + pagerState = pagerState, modifier = if (UiTronSdkManager.isModifierBuilderEnabled()) { ModifierBuilder( @@ -177,7 +182,7 @@ class PagerIndicatorV2Renderer(private val childrenComposeViews: List, @@ -77,6 +78,8 @@ class PagerRendererV2( super.Render(property, uiTronData, uiTronViewModel, modifier) var pagerData = uiTronData as? PagerData val shouldStopAutoScroll = remember { mutableStateOf(false) } + val initialPagerState = rememberPagerState { childrenComposeViews.size } + val pagerState by remember { mutableStateOf(initialPagerState) } if (property.isStateFul.orFalse()) { val state = uiTronViewModel.handle @@ -91,13 +94,15 @@ class PagerRendererV2( .collectAsStateWithLifecycle() pagerData = updatedDataState.value ?: pagerData } + + property.pagerStateKey?.let { key -> + LaunchedEffect(Unit) { + uiTronViewModel.stateHolder.updatePagerStateV2(key, MutableStateFlow(pagerState)) + } + } + if (property.visible.orTrue()) { val rootView = LocalView.current.rootView - val pagerState = - uiTronViewModel.stateHolder.getOrUpdatePagerV2State( - key = property.pagerStateKey, - pageCount = childrenComposeViews.size, - ) ?: rememberPagerState { childrenComposeViews.size } property.spacingStyle?.let { interceptChildrenPaddingByStyle(property, childrenComposeViews) } @@ -283,6 +288,7 @@ class PagerRendererV2( property, uiTronViewModel, pagerData, + scrollDelay = property.scrollDelay.orZero(), shouldStopAutoScroll, ) } @@ -336,9 +342,9 @@ class PagerRendererV2( property: PagerProperty, uiTronViewModel: UiTronViewModel, pagerData: PagerData?, + scrollDelay: Long, shouldStopAutoScroll: MutableState, ) { - val updatedStopAutoScrollState = rememberUpdatedState(shouldStopAutoScroll.value) LaunchedEffect(key1 = pagerState.currentPage) { snapshotFlow { pagerState.currentPage } @@ -348,10 +354,10 @@ class PagerRendererV2( } val isDraggedState = pagerState.interactionSource.collectIsDraggedAsState() - LaunchedEffect(key1 = isDraggedState.value) { - if (property.scrollDelay.orZero() > 0) { + LaunchedEffect(key1 = isDraggedState.value, key2 = scrollDelay) { + if (scrollDelay > 0) { while (true) { - delay(property.scrollDelay.orZero()) + delay(scrollDelay) try { if (updatedStopAutoScrollState.value) { customLoop@ while (true) { @@ -363,11 +369,22 @@ class PagerRendererV2( } with(pagerState) { if (!isDraggedState.value && !updatedStopAutoScrollState.value) { - val target = if (currentPage < pageCount - 1) currentPage + 1 else 0 - animateScrollToPage( - page = target, - animationSpec = animatedSpec(property.scrollPageAnimationSpec), - ) + if (currentPage < pageCount - 1) { + val target = currentPage + 1 + animateScrollToPage( + page = target, + animationSpec = + animatedSpec(property.scrollPageAnimationSpec), + ) + } else if (property.stopScrollAtLastPage.orFalse()) { + shouldStopAutoScroll.value = true + } else { + animateScrollToPage( + page = 0, + animationSpec = + animatedSpec(property.scrollPageAnimationSpec), + ) + } } } } catch (e: CancellationException) { diff --git a/navi-uitron/src/main/java/com/navi/uitron/viewmodel/ComposeStateHolder.kt b/navi-uitron/src/main/java/com/navi/uitron/viewmodel/ComposeStateHolder.kt index f99e75b..ea4e963 100644 --- a/navi-uitron/src/main/java/com/navi/uitron/viewmodel/ComposeStateHolder.kt +++ b/navi-uitron/src/main/java/com/navi/uitron/viewmodel/ComposeStateHolder.kt @@ -11,13 +11,14 @@ import androidx.compose.foundation.ScrollState import androidx.compose.foundation.lazy.grid.LazyGridState import androidx.compose.foundation.lazy.grid.rememberLazyGridState import androidx.compose.foundation.pager.PagerState as FoundationPagerState -import androidx.compose.foundation.pager.rememberPagerState as FoundationRememberPagerState import androidx.compose.foundation.rememberScrollState import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateMapOf import com.google.accompanist.pager.ExperimentalPagerApi import com.google.accompanist.pager.PagerState as AccompanistPagerState import com.google.accompanist.pager.rememberPagerState as AccompanistRememberPagerState import javax.inject.Inject +import kotlinx.coroutines.flow.MutableStateFlow @OptIn(ExperimentalPagerApi::class) class ComposeStateHolder @Inject constructor() { @@ -25,7 +26,8 @@ class ComposeStateHolder @Inject constructor() { private val pagerStateMap: MutableMap by lazy { mutableMapOf() } private val scrollStateMap: MutableMap by lazy { mutableMapOf() } private val gridStateMap: MutableMap by lazy { mutableMapOf() } - private val pagerV2StateMap: MutableMap by lazy { mutableMapOf() } + private val pagerV2StateMap: + MutableMap> by lazy { mutableStateMapOf() } @Composable fun getOrUpdatePagerState(key: String?): AccompanistPagerState? { @@ -42,9 +44,12 @@ class ComposeStateHolder @Inject constructor() { return getOrUpdateState(key, gridStateMap, rememberLazyGridState()) } - @Composable - fun getOrUpdatePagerV2State(key: String?, pageCount: Int): FoundationPagerState? { - return getOrUpdateState(key, pagerV2StateMap, FoundationRememberPagerState { pageCount }) + fun updatePagerStateV2(key: String, state: MutableStateFlow) { + pagerV2StateMap[key] = state + } + + fun getPagerStateV2(key: String): MutableStateFlow? { + return pagerV2StateMap[key] } private fun getOrUpdateState(