ソースを参照

pager preimplementation

Milan Jurkulak 3 年 前
親
コミット
e0b13b546e

+ 1 - 2
app/src/main/kotlin/org/mjdev/tvapp/activity/ActivityResultHandler.kt → app/src/main/kotlin/org/mjdev/tvapp/base/activity/ActivityResultHandler.kt

@@ -6,12 +6,11 @@
  *  w: https://mjdev.org
  */
 
-package org.mjdev.tvapp.activity
+package org.mjdev.tvapp.base.activity
 
 import android.content.Intent
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleEventObserver
-import org.mjdev.tvapp.base.activity.ComposableActivity
 
 /**
  * Activity result handler.

+ 0 - 1
app/src/main/kotlin/org/mjdev/tvapp/base/activity/ComposableActivity.kt

@@ -27,7 +27,6 @@ import androidx.core.view.WindowCompat
 import androidx.tv.material3.ExperimentalTvMaterial3Api
 import androidx.tv.material3.NonInteractiveSurfaceDefaults
 import androidx.tv.material3.Surface
-import org.mjdev.tvapp.activity.ActivityResultHandler
 import org.mjdev.tvapp.base.annotations.TvPreview
 import org.mjdev.tvapp.base.extensions.ContextExt.isATv
 import org.mjdev.tvapp.base.extensions.NavExt.rememberNavControllerEx

+ 17 - 3
app/src/main/kotlin/org/mjdev/tvapp/base/ui/components/page/PagerScope.kt

@@ -9,6 +9,9 @@
 package org.mjdev.tvapp.base.ui.components.page
 
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.MutableState
+import androidx.compose.runtime.mutableIntStateOf
+import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import org.mjdev.tvapp.base.extensions.ListExt.addUnique
 import org.mjdev.tvapp.base.ui.components.navigation.MenuItem
@@ -16,16 +19,21 @@ import org.mjdev.tvapp.base.ui.components.navigation.NavHostControllerEx
 
 class PagerScope(
     val navController: NavHostControllerEx,
-    pages: PagerScope.() -> Unit = {}
+    pages: PagerScope.() -> Unit = {},
 ) : ArrayList<Page>() {
 
+    val currentPage: MutableState<Int> = mutableIntStateOf(0)
+
     init {
         pages.invoke(this)
     }
 
-    fun page(page: Page) {
+    fun page(page: Page, isStartPage: Boolean = false) {
         page.navController = navController
         addUnique(page)
+        if (isStartPage) {
+            currentPage.value = size - 1
+        }
         page.let { p ->
             MenuItem(
                 menuText = p.title,
@@ -47,6 +55,12 @@ class PagerScope(
         }
     }
 
+    fun scrollToPage(index: Int) {
+        if (size > index && size > -1) {
+            currentPage.value = index
+        }
+    }
+
 }
 
 @Composable
@@ -56,6 +70,6 @@ fun rememberPagerScope(
 ) = remember {
     PagerScope(
         navController,
-        pages
+        pages,
     )
 }

+ 5 - 16
app/src/main/kotlin/org/mjdev/tvapp/base/ui/components/page/TvPager.kt

@@ -9,11 +9,9 @@
 package org.mjdev.tvapp.base.ui.components.page
 
 import android.annotation.SuppressLint
-import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.pager.VerticalPager
-import androidx.compose.foundation.pager.rememberPagerState
 import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
@@ -33,7 +31,6 @@ import org.mjdev.tvapp.base.ui.components.navigation.MenuItem
 import org.mjdev.tvapp.base.ui.components.navigation.NavHostControllerEx
 import org.mjdev.tvapp.base.ui.components.page.Page.Companion.EMPTY_PAGE
 
-@OptIn(ExperimentalFoundationApi::class)
 @SuppressLint("AutoboxingStateValueProperty")
 @TvPreview
 @Composable
@@ -51,10 +48,6 @@ fun TvPager(
     val currentPage = remember { mutableStateOf<Page?>(null) }
     val coroutineScope = rememberCoroutineScope()
     val pagerScope = rememberPagerScope(navController, pages)
-    val pagerState = rememberPagerState(
-        pageCount = { pagerScope.size },
-        initialPage = startIndex,
-    )
 
     val goToPage: (
         page: Page?
@@ -65,7 +58,7 @@ fun TvPager(
                 if (itemIndex > -1) {
                     if (currentPage.value != page) {
                         currentPage.value = page
-                        pagerState.animateScrollToPage(itemIndex)
+                        pagerScope.scrollToPage(itemIndex)
                     }
                 }
             }
@@ -82,20 +75,16 @@ fun TvPager(
 
     navController.addMenuClickListener(listener)
 
-    VerticalPager(
+    Box(
         modifier = Modifier
             .fillMaxSize()
             .background(backGroundColor, backGroundShape),
-        state = pagerState,
-        beyondBoundsPageCount = 0
-    ) { pageIndex ->
-
+    ) {
+        val pageIndex = pagerScope.currentPage.value
         val page = if (pagerScope.size > pageIndex) pagerScope[pageIndex]
         else if (isEdit) EMPTY_PAGE
         else null
-
         page?.content()
-
     }
 
 }

+ 0 - 69
app/src/main/kotlin/org/mjdev/tvapp/base/ui/components/page/VerticalTvPager.kt

@@ -1,69 +0,0 @@
-/*
- * Copyright (c) Milan Jurkulák 2023.
- *  Contact:
- *  e: mimoccc@gmail.com
- *  e: mj@mjdev.org
- *  w: https://mjdev.org
- */
-
-package org.mjdev.tvapp.base.ui.components.page
-
-import androidx.compose.foundation.ExperimentalFoundationApi
-import androidx.compose.foundation.gestures.Orientation
-import androidx.compose.foundation.gestures.snapping.SnapFlingBehavior
-import androidx.compose.foundation.layout.PaddingValues
-import androidx.compose.foundation.pager.PageSize
-import androidx.compose.foundation.pager.PagerDefaults
-import androidx.compose.foundation.pager.PagerScope
-import androidx.compose.foundation.pager.PagerState
-import androidx.compose.foundation.pager.VerticalPager
-import androidx.compose.foundation.pager.rememberPagerState
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
-import androidx.compose.ui.unit.Dp
-import androidx.compose.ui.unit.dp
-import org.mjdev.tvapp.base.annotations.TvPreview
-
-@OptIn(ExperimentalFoundationApi::class)
-@TvPreview
-@Composable
-fun VerticalTvPager(
-    modifier: Modifier = Modifier,
-    initialPage: Int = 0,
-    initialPageOffsetFraction: Float = 0f,
-    pageCount: () -> Int = { 0 },
-    state: PagerState = rememberPagerState(
-        initialPage = initialPage,
-        initialPageOffsetFraction = initialPageOffsetFraction,
-        pageCount = pageCount
-    ),
-    beyondBoundsPageCount: Int = 0,
-    contentPadding: Dp = 0.dp,
-    pageSize: PageSize = PageSize.Fill,
-    pageSpacing: Dp = 0.dp,
-    horizontalAlignment: Alignment.Horizontal = Alignment.End,
-    flingBehavior: SnapFlingBehavior = PagerDefaults.flingBehavior(state = state),
-    userScrollEnabled: Boolean = false,
-    reverseLayout: Boolean = false,
-    key: ((index: Int) -> Any)? = null,
-    pageNestedScrollConnection: NestedScrollConnection = PagerDefaults.pageNestedScrollConnection(
-        Orientation.Vertical
-    ),
-    pageContent: @Composable PagerScope.(page: Int) -> Unit = {},
-) = VerticalPager(
-    state = state,
-    modifier = modifier,
-    contentPadding = PaddingValues(contentPadding),
-    pageSize = pageSize,
-    beyondBoundsPageCount = beyondBoundsPageCount,
-    pageSpacing = pageSpacing,
-    horizontalAlignment = horizontalAlignment,
-    flingBehavior = flingBehavior,
-    userScrollEnabled = userScrollEnabled,
-    reverseLayout = reverseLayout,
-    key = key,
-    pageNestedScrollConnection = pageNestedScrollConnection,
-    pageContent = pageContent
-)

+ 1 - 1
app/src/main/kotlin/org/mjdev/tvapp/ui/screens/MainScreen.kt

@@ -39,7 +39,7 @@ class MainScreen : ScreenWithPages() {
         page(SearchPage())
 
         page(AboutPage())
-        page(MainPage())
+        page(MainPage(), isStartPage = true)
         page(SubscriptionPage())
 
         page(PluginsPage())