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

+ 23 - 0
tvlib/src/main/kotlin/org/mjdev/tvlib/extensions/ComposeExt.kt

@@ -26,10 +26,14 @@ import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.platform.LocalInspectionMode
 import androidx.compose.ui.platform.LocalInspectionMode
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.dp
+import androidx.tv.material3.DrawerState
+import androidx.tv.material3.DrawerValue
+import androidx.tv.material3.ExperimentalTvMaterial3Api
 import coil.ImageLoader
 import coil.ImageLoader
 import coil.decode.GifDecoder
 import coil.decode.GifDecoder
 import coil.decode.ImageDecoderDecoder
 import coil.decode.ImageDecoderDecoder
 import coil.request.CachePolicy
 import coil.request.CachePolicy
+import org.mjdev.tvlib.extensions.ContextExt.isATv
 
 
 @Suppress("MemberVisibilityCanBePrivate")
 @Suppress("MemberVisibilityCanBePrivate")
 object ComposeExt {
 object ComposeExt {
@@ -37,6 +41,25 @@ object ComposeExt {
     @Composable
     @Composable
     fun isEditMode() = LocalInspectionMode.current
     fun isEditMode() = LocalInspectionMode.current
 
 
+    @Composable
+    fun isLandscapeMode(): Boolean =
+        LocalConfiguration.current.orientation == Configuration.ORIENTATION_LANDSCAPE
+
+    @Composable
+    fun isPortraitMode(): Boolean =
+        LocalConfiguration.current.orientation == Configuration.ORIENTATION_PORTRAIT
+
+    @Composable
+    fun isAtv(): Boolean = LocalContext.current.isATv
+
+    @OptIn(ExperimentalTvMaterial3Api::class)
+    val DrawerState.isOpen: Boolean
+        get() = currentValue == DrawerValue.Open
+
+    @OptIn(ExperimentalTvMaterial3Api::class)
+    val DrawerState.isClosed: Boolean
+        get() = currentValue == DrawerValue.Closed
+
     @Composable
     @Composable
     inline fun <reified T> textFrom(text: T?): String = when (text) {
     inline fun <reified T> textFrom(text: T?): String = when (text) {
         null -> ""
         null -> ""

+ 56 - 51
tvlib/src/main/kotlin/org/mjdev/tvlib/ui/components/navigation/NavigationRow.kt

@@ -27,15 +27,17 @@ import androidx.compose.ui.focus.FocusState
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Shape
 import androidx.compose.ui.graphics.Shape
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.text.style.TextAlign
-import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.dp
 import androidx.tv.material3.DrawerState
 import androidx.tv.material3.DrawerState
 import androidx.tv.material3.DrawerValue
 import androidx.tv.material3.DrawerValue
 import androidx.tv.material3.ExperimentalTvMaterial3Api
 import androidx.tv.material3.ExperimentalTvMaterial3Api
 import androidx.tv.material3.rememberDrawerState
 import androidx.tv.material3.rememberDrawerState
+import org.mjdev.tvlib.annotations.TvPreview
 import org.mjdev.tvlib.extensions.ComposeExt.isEditMode
 import org.mjdev.tvlib.extensions.ComposeExt.isEditMode
 import org.mjdev.tvlib.extensions.ComposeExt.isFocused
 import org.mjdev.tvlib.extensions.ComposeExt.isFocused
+import org.mjdev.tvlib.extensions.ComposeExt.isLandscapeMode
+import org.mjdev.tvlib.extensions.ComposeExt.isOpen
 import org.mjdev.tvlib.extensions.ComposeExt.rememberFocusState
 import org.mjdev.tvlib.extensions.ComposeExt.rememberFocusState
 import org.mjdev.tvlib.extensions.ModifierExt.focusState
 import org.mjdev.tvlib.extensions.ModifierExt.focusState
 import org.mjdev.tvlib.extensions.ModifierExt.recomposeHighlighter
 import org.mjdev.tvlib.extensions.ModifierExt.recomposeHighlighter
@@ -44,7 +46,7 @@ import org.mjdev.tvlib.ui.components.icon.IconAny
 import org.mjdev.tvlib.ui.components.text.TextAny
 import org.mjdev.tvlib.ui.components.text.TextAny
 
 
 @OptIn(ExperimentalTvMaterial3Api::class)
 @OptIn(ExperimentalTvMaterial3Api::class)
-@Preview
+@TvPreview
 @Composable
 @Composable
 fun NavigationRow(
 fun NavigationRow(
     modifier: Modifier = Modifier,
     modifier: Modifier = Modifier,
@@ -67,62 +69,65 @@ fun NavigationRow(
     onClick: (id: Int) -> Unit = {},
     onClick: (id: Int) -> Unit = {},
 ) {
 ) {
     val isEdit = isEditMode()
     val isEdit = isEditMode()
-    FocusableBox(
-        modifier = modifier
-            .recomposeHighlighter()
-            .padding(margin)
-            .border(
-                BorderStroke(
-                    strokeWidth,
-                    if (isEdit || focusState.isFocused) focusedColor
-                    else unFocusedColor
-                ),
-                shape
-            )
-            .focusState(focusState),
-        shape = shape,
-        focusedColor = focusedColor.copy(alpha = 0.5f),
-        unFocusedColor = unFocusedColor,
-        onFocusChange = { state ->
-            if (state.isFocused || state.hasFocus) {
-                onFocus(id)
-            }
-        },
-        onClick = {
-            onClick(id)
-        },
-    ) {
-        Row(
-            modifier = Modifier
+    val isShown = isLandscapeMode() || drawerState.isOpen
+    if (isShown) {
+        FocusableBox(
+            modifier = modifier
                 .recomposeHighlighter()
                 .recomposeHighlighter()
-                .padding(padding),
-            horizontalArrangement = Arrangement.Start,
-            verticalAlignment = Alignment.CenterVertically,
+                .padding(margin)
+                .border(
+                    BorderStroke(
+                        strokeWidth,
+                        if (isEdit || focusState.isFocused) focusedColor
+                        else unFocusedColor
+                    ),
+                    shape
+                )
+                .focusState(focusState),
+            shape = shape,
+            focusedColor = focusedColor.copy(alpha = 0.5f),
+            unFocusedColor = unFocusedColor,
+            onFocusChange = { state ->
+                if (state.isFocused || state.hasFocus) {
+                    onFocus(id)
+                }
+            },
+            onClick = {
+                onClick(id)
+            },
         ) {
         ) {
-            Box(
+            Row(
                 modifier = Modifier
                 modifier = Modifier
-                    .padding(4.dp)
                     .recomposeHighlighter()
                     .recomposeHighlighter()
+                    .padding(padding),
+                horizontalArrangement = Arrangement.Start,
+                verticalAlignment = Alignment.CenterVertically,
             ) {
             ) {
-                IconAny(
-                    src = icon,
-                    contentDescription = null,
-                    tint = iconColor
-                )
-            }
-            AnimatedVisibility(
-                visible = (isEdit || (drawerState.currentValue == DrawerValue.Open))
-            ) {
-                TextAny(
-                    text = text,
-                    softWrap = false,
+                Box(
                     modifier = Modifier
                     modifier = Modifier
+                        .padding(4.dp)
                         .recomposeHighlighter()
                         .recomposeHighlighter()
-                        .padding(8.dp)
-                        .width(expandedWidth),
-                    color = textColor,
-                    textAlign = TextAlign.Left
-                )
+                ) {
+                    IconAny(
+                        src = icon,
+                        contentDescription = null,
+                        tint = iconColor
+                    )
+                }
+                AnimatedVisibility(
+                    visible = (isEdit || (drawerState.currentValue == DrawerValue.Open))
+                ) {
+                    TextAny(
+                        text = text,
+                        softWrap = false,
+                        modifier = Modifier
+                            .recomposeHighlighter()
+                            .padding(8.dp)
+                            .width(expandedWidth),
+                        color = textColor,
+                        textAlign = TextAlign.Left
+                    )
+                }
             }
             }
         }
         }
     }
     }

+ 14 - 10
tvlib/src/main/kotlin/org/mjdev/tvlib/ui/components/tv/Header.kt

@@ -32,6 +32,7 @@ import org.mjdev.tvlib.annotations.TvPreview
 import org.mjdev.tvlib.extensions.ComposeExt.isEditMode
 import org.mjdev.tvlib.extensions.ComposeExt.isEditMode
 import org.mjdev.tvlib.extensions.ModifierExt.recomposeHighlighter
 import org.mjdev.tvlib.extensions.ModifierExt.recomposeHighlighter
 import org.mjdev.tvlib.R
 import org.mjdev.tvlib.R
+import org.mjdev.tvlib.extensions.ComposeExt.isLandscapeMode
 import org.mjdev.tvlib.ui.components.badge.Badge
 import org.mjdev.tvlib.ui.components.badge.Badge
 
 
 @TvPreview
 @TvPreview
@@ -54,6 +55,7 @@ fun Header(
     onUserPicClick: () -> Unit = {},
     onUserPicClick: () -> Unit = {},
 ) {
 ) {
     val isEdit = isEditMode()
     val isEdit = isEditMode()
+    val isClockShown = isLandscapeMode()
     Box(
     Box(
         modifier = Modifier
         modifier = Modifier
             .recomposeHighlighter()
             .recomposeHighlighter()
@@ -69,16 +71,18 @@ fun Header(
             horizontalArrangement = Arrangement.End,
             horizontalArrangement = Arrangement.End,
             verticalAlignment = Alignment.CenterVertically,
             verticalAlignment = Alignment.CenterVertically,
         ) {
         ) {
-            Clock(
-                modifier = Modifier
-                    .wrapContentSize()
-                    .recomposeHighlighter(),
-                backgroundColor = Color.Black.copy(alpha = 0.2f),
-                contentPadding = contentPadding,
-                timeTextColor = color,
-                dateTextColor = color,
-                onClick = onClockClick,
-            )
+            if (isClockShown) {
+                Clock(
+                    modifier = Modifier
+                        .wrapContentSize()
+                        .recomposeHighlighter(),
+                    backgroundColor = Color.Black.copy(alpha = 0.2f),
+                    contentPadding = contentPadding,
+                    timeTextColor = color,
+                    dateTextColor = color,
+                    onClick = onClockClick,
+                )
+            }
             if (isEdit || (messagesCount > 0)) {
             if (isEdit || (messagesCount > 0)) {
                 Badge(
                 Badge(
                     modifier = Modifier
                     modifier = Modifier