Milan Jurkulak 3 лет назад
Родитель
Сommit
5fe8a394b3

+ 10 - 4
app/src/main/kotlin/org/mjdev/tvapp/base/activity/ComposableActivity.kt

@@ -31,6 +31,7 @@ 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
+import org.mjdev.tvapp.base.ui.components.complex.ScreenView
 import org.mjdev.tvapp.base.ui.components.navigation.EmptyScreen
 import org.mjdev.tvapp.base.ui.components.navigation.NavGraphBuilderEx
 import org.mjdev.tvapp.base.ui.components.navigation.NavHostEx
@@ -69,11 +70,16 @@ open class ComposableActivity : ComponentActivity() {
                     containerColor = backgroundColor
                 )
             ) {
-                NavHostEx(
-                    modifier = Modifier.fillMaxSize(),
+                ScreenView(
                     navController = navController,
-                    builder = navGraphBuilder
-                )
+                    backgroundColor = backgroundColor
+                ) {
+                    NavHostEx(
+                        modifier = Modifier.fillMaxSize(),
+                        navController = navController,
+                        builder = navGraphBuilder
+                    )
+                }
             }
         }
 

+ 4 - 1
app/src/main/kotlin/org/mjdev/tvapp/base/extensions/NavExt.kt

@@ -46,7 +46,10 @@ object NavExt {
         vararg navigators: Navigator<out NavDestination>
     ): NavHostControllerEx {
         val context = LocalContext.current
-        return rememberSaveable(inputs = navigators, saver = NavControllerSaver(context)) {
+        return rememberSaveable(
+            inputs = navigators,
+            saver = NavControllerSaver(context)
+        ) {
             createNavController(context)
         }.apply {
             for (navigator in navigators) {

+ 0 - 2
app/src/main/kotlin/org/mjdev/tvapp/base/ui/components/complex/ScreenView.kt

@@ -41,7 +41,6 @@ fun ScreenView(
             .background(backgroundColor, shape),
         contentAlignment = Alignment.BottomCenter,
     ) {
-
         if (navController.menuState.value) {
             Navigation(
                 navController = navController,
@@ -53,6 +52,5 @@ fun ScreenView(
         } else {
             content()
         }
-
     }
 }

+ 4 - 0
app/src/main/kotlin/org/mjdev/tvapp/base/ui/components/navigation/Navigation.kt

@@ -11,6 +11,7 @@ package org.mjdev.tvapp.base.ui.components.navigation
 import android.annotation.SuppressLint
 import androidx.compose.foundation.background
 import androidx.compose.foundation.border
+import androidx.compose.foundation.layout.BoxWithConstraints
 import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.runtime.Composable
@@ -50,7 +51,10 @@ fun Navigation(
 ) {
 
     val isEdit = isEditMode()
+
     if (isEdit) navigationState.openDrawer()
+    else navigationState.closeDrawer()
+
     navController.addMenuItem(*menuItems.toTypedArray())
 
     if (navController.menuState.value) {

+ 0 - 1
app/src/main/kotlin/org/mjdev/tvapp/base/ui/components/navigation/Screen.kt

@@ -89,7 +89,6 @@ open class Screen : NavController.OnDestinationChangedListener {
     @Composable
     @CallSuper
     open fun Compose() {
-
         val navController = rememberNavControllerEx()
 
         Compose(

+ 5 - 10
app/src/main/kotlin/org/mjdev/tvapp/base/ui/components/navigation/ScreenWithPages.kt

@@ -11,9 +11,8 @@ package org.mjdev.tvapp.base.ui.components.navigation
 import androidx.compose.runtime.Composable
 import androidx.navigation.NavBackStackEntry
 import org.mjdev.tvapp.base.annotations.TvPreview
-import org.mjdev.tvapp.base.ui.components.page.Pager
+import org.mjdev.tvapp.base.ui.components.page.TvPager
 import org.mjdev.tvapp.base.ui.components.page.PagerScope
-import org.mjdev.tvapp.base.ui.components.complex.ScreenView
 
 open class ScreenWithPages : Screen() {
 
@@ -31,15 +30,11 @@ open class ScreenWithPages : Screen() {
         backStackEntry: NavBackStackEntry?,
         args: Map<String, Any?>
     ) {
-        ScreenView(
+        TvPager(
             navController = navController,
-        ) {
-            Pager(
-                navController = navController,
-                startIndex = startPageIndex,
-                pages = pages
-            )
-        }
+            startIndex = startPageIndex,
+            pages = pages
+        )
     }
 
 }

+ 7 - 7
app/src/main/kotlin/org/mjdev/tvapp/base/ui/components/page/Page.kt

@@ -21,11 +21,13 @@ import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Shape
 import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.style.TextDirection.Companion.Content
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 import org.mjdev.tvapp.base.annotations.TvPreview
 import org.mjdev.tvapp.base.extensions.ModifierExt.touchable
+import org.mjdev.tvapp.base.ui.components.complex.TouchBox
 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.text.TextAny
@@ -47,7 +49,6 @@ open class Page {
     @Composable
     @CallSuper
     fun content() {
-
         Column(
             Modifier
                 .fillMaxSize()
@@ -56,16 +57,16 @@ open class Page {
                     freeFocus()
                 }
         ) {
-
-            Content()
-
+            TouchBox(
+                contentAlignment = Alignment.Center,
+            ) {
+                Content()
+            }
         }
-
     }
 
     @Composable
     open fun Content() {
-
         Column(
             modifier = Modifier.fillMaxSize(),
             verticalArrangement = Arrangement.Center,
@@ -78,7 +79,6 @@ open class Page {
                 color = Color.White,
             )
         }
-
     }
 
     override fun toString(): String = this::class.simpleName ?: "Page[]"

+ 1 - 1
app/src/main/kotlin/org/mjdev/tvapp/base/ui/components/page/Pager.kt → app/src/main/kotlin/org/mjdev/tvapp/base/ui/components/page/TvPager.kt

@@ -37,7 +37,7 @@ import org.mjdev.tvapp.base.ui.components.page.Page.Companion.EMPTY_PAGE
 @SuppressLint("AutoboxingStateValueProperty")
 @TvPreview
 @Composable
-fun Pager(
+fun TvPager(
     navController: NavHostControllerEx = rememberNavControllerEx(),
     startIndex: Int = 0,
     roundCornerSize: Dp = 0.dp,

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

@@ -0,0 +1,69 @@
+/*
+ * 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
+)

+ 4 - 5
app/src/main/kotlin/org/mjdev/tvapp/ui/pages/AboutPage.kt

@@ -8,6 +8,7 @@
 
 package org.mjdev.tvapp.ui.pages
 
+import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Row
@@ -48,9 +49,11 @@ class AboutPage : Page() {
                 .padding(16.dp)
         ) {
             Card(
+                modifier = Modifier
+                    .fillMaxSize()
+                    .background(backgroundColor, background),
                 onClick = {},
                 onLongClick = {},
-                modifier = Modifier.fillMaxSize(),
                 shape = CardDefaults.shape(),
                 colors = CardDefaults.colors(
                     containerColor = Color(0xff242424)
@@ -63,13 +66,11 @@ class AboutPage : Page() {
                     horizontalArrangement = Arrangement.Start,
                     verticalAlignment = Alignment.CenterVertically,
                     content = {
-
                         CircleImage(
                             modifier = Modifier.size(128.dp),
                             contentPadding = 10.dp,
                             src = R.drawable.milanj
                         )
-
                         CardContent(
                             modifier = Modifier.fillMaxWidth(),
                             title = {
@@ -91,12 +92,10 @@ class AboutPage : Page() {
                                 )
                             }
                         )
-
                     }
                 )
             }
         }
-
     }
 
 }

+ 1 - 1
app/src/main/kotlin/org/mjdev/tvapp/ui/pages/MainPage.kt

@@ -91,7 +91,7 @@ class MainPage : Page() {
         ScrollableTvLazyRow(
             modifier = Modifier
                 .fillMaxSize()
-                .background(Color.DarkGray),
+                .background(backgroundColor, background),
             verticalArrangement = Arrangement.spacedBy(32.dp),
             contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp)
         ) {

+ 63 - 0
app/src/main/kotlin/org/mjdev/tvapp/ui/pages/PluginsPage.kt

@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) Milan Jurkulák 2023.
+ * Contact:
+ * e: mimoccc@gmail.com
+ * e: mj@mjdev.org
+ * w: https://mjdev.org
+ */
+
+package org.mjdev.tvapp.ui.pages
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Info
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.unit.dp
+import androidx.tv.material3.Card
+import androidx.tv.material3.CardDefaults
+import androidx.tv.material3.ExperimentalTvMaterial3Api
+import org.mjdev.tvapp.R
+import org.mjdev.tvapp.base.annotations.TvPreview
+import org.mjdev.tvapp.base.ui.components.page.Page
+
+class PluginsPage : Page() {
+
+    override val title: Int = R.string.title_about
+    override val icon: ImageVector = Icons.Default.Info
+
+    @OptIn(ExperimentalTvMaterial3Api::class)
+    @TvPreview
+    @Composable
+    override fun Content() {
+        Card(
+            modifier = Modifier
+                .fillMaxSize()
+                .background(backgroundColor, background),
+            onClick = {},
+            onLongClick = {},
+            shape = CardDefaults.shape(),
+            colors = CardDefaults.colors(
+                containerColor = Color(0xff242424)
+            ),
+        ) {
+            Row(
+                modifier = Modifier
+                    .fillMaxSize()
+                    .padding(16.dp),
+                horizontalArrangement = Arrangement.Start,
+                verticalAlignment = Alignment.CenterVertically,
+                content = {
+                }
+            )
+        }
+    }
+
+}

+ 0 - 7
app/src/main/kotlin/org/mjdev/tvapp/ui/pages/SubscriptionPage.kt

@@ -40,13 +40,11 @@ class SubscriptionPage : Page() {
     @TvPreview
     @Composable
     override fun Content () {
-
         Box(
             modifier = Modifier
                 .fillMaxSize()
                 .padding(16.dp)
         ) {
-
             Card(
                 onClick = {},
                 onLongClick = {},
@@ -56,7 +54,6 @@ class SubscriptionPage : Page() {
                     containerColor = Color(0xff242424)
                 ),
             ) {
-
                 Row(
                     modifier = Modifier
                         .fillMaxSize()
@@ -64,7 +61,6 @@ class SubscriptionPage : Page() {
                     horizontalArrangement = Arrangement.Start,
                     verticalAlignment = Alignment.CenterVertically,
                     content = {
-
                         CardContent(
                             modifier = Modifier.fillMaxWidth(),
                             title = {
@@ -82,12 +78,9 @@ class SubscriptionPage : Page() {
                             description = {
                             }
                         )
-
                     }
                 )
-
             }
-
         }
     }
 

+ 42 - 47
app/src/main/kotlin/org/mjdev/tvapp/ui/screens/SplashScreen.kt

@@ -36,7 +36,6 @@ import org.mjdev.tvapp.R
 import org.mjdev.tvapp.base.annotations.TvPreview
 import org.mjdev.tvapp.base.extensions.ComposeExt.isEditMode
 import org.mjdev.tvapp.base.ui.components.navigation.NavHostControllerEx
-import org.mjdev.tvapp.base.ui.components.complex.ScreenView
 import org.mjdev.tvapp.base.ui.components.navigation.Screen
 import org.mjdev.tvapp.base.ui.components.icon.IconAny
 import org.mjdev.tvapp.base.ui.components.text.TextAny
@@ -75,53 +74,49 @@ class SplashScreen : Screen() {
             navController.open<MainScreen>()
         }
 
-        ScreenView(
-            backgroundColor = backgroundColor
+        Box(
+            modifier = Modifier
+                .scale(scale.value)
+                .fillMaxSize(),
+            contentAlignment = Alignment.Center
         ) {
-            Box(
-                modifier = Modifier
-                    .scale(scale.value)
-                    .fillMaxSize(),
-                contentAlignment = Alignment.Center
-            ) {
-                IconAny(
-                    modifier = Modifier.size(128.dp),
-                    src = Icons.Sharp.Tv,
-                    tint = Color.White.copy(alpha = 0.5f)
-                )
-                TextAny(
-                    text = R.string.app_name,
-                    fontSize = 64.sp,
-                    fontWeight = FontWeight.Bold,
-                    color = Color.White,
-                    modifier = Modifier.padding(10.dp),
-                    style = MaterialTheme.typography.bodyMedium.copy(
-                        shadow = Shadow(
-                            color = Color.Gray,
-                            offset = Offset(5f, 5f),
-                            blurRadius = 10f
-                        )
-                    ),
-                )
-            }
-            Box(
-                modifier = Modifier
-                    .fillMaxSize()
-                    .padding(
-                        0.dp,
-                        0.dp,
-                        0.dp,
-                        4.dp
-                    ),
-                contentAlignment = Alignment.BottomCenter
-            ) {
-                TextAny(
-                    text = R.string.author,
-                    fontSize = 14.sp,
-                    fontWeight = FontWeight.Bold,
-                    color = Color.White.copy(alpha = 0.5f)
-                )
-            }
+            IconAny(
+                modifier = Modifier.size(128.dp),
+                src = Icons.Sharp.Tv,
+                tint = Color.White.copy(alpha = 0.5f)
+            )
+            TextAny(
+                text = R.string.app_name,
+                fontSize = 64.sp,
+                fontWeight = FontWeight.Bold,
+                color = Color.White,
+                modifier = Modifier.padding(10.dp),
+                style = MaterialTheme.typography.bodyMedium.copy(
+                    shadow = Shadow(
+                        color = Color.Gray,
+                        offset = Offset(5f, 5f),
+                        blurRadius = 10f
+                    )
+                ),
+            )
+        }
+        Box(
+            modifier = Modifier
+                .fillMaxSize()
+                .padding(
+                    0.dp,
+                    0.dp,
+                    0.dp,
+                    4.dp
+                ),
+            contentAlignment = Alignment.BottomCenter
+        ) {
+            TextAny(
+                text = R.string.author,
+                fontSize = 14.sp,
+                fontWeight = FontWeight.Bold,
+                color = Color.White.copy(alpha = 0.5f)
+            )
         }
 
     }