Skip to content

Commit

Permalink
fix: content colors for tv.
Browse files Browse the repository at this point in the history
  • Loading branch information
oxyroid committed Jan 13, 2024
1 parent 03288c1 commit 1203c63
Show file tree
Hide file tree
Showing 27 changed files with 317 additions and 227 deletions.
4 changes: 2 additions & 2 deletions androidApp/src/main/java/com/m3u/androidApp/ui/AppNavHost.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import com.m3u.features.playlist.navigation.playlistScreen
import com.m3u.features.playlist.navigation.playlistTvScreen
import com.m3u.features.stream.PlayerActivity
import com.m3u.i18n.R.string
import com.m3u.material.ktx.isTvDevice
import com.m3u.material.ktx.isTelevision
import com.m3u.ui.Destination
import com.m3u.ui.Destination.Root.Setting.SettingFragment
import com.m3u.ui.LocalHelper
Expand All @@ -44,7 +44,7 @@ fun AppNavHost(
val context = LocalContext.current
val pref = LocalPref.current

val tv = isTvDevice()
val tv = isTelevision()
NavHost(
navController = navController,
startDestination = startDestination,
Expand Down
59 changes: 33 additions & 26 deletions androidApp/src/main/java/com/m3u/androidApp/ui/AppRootGraph.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,20 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.exclude
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.systemBars
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.rounded.ArrowBack
import androidx.compose.material3.Icon
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.NavigationBar
import androidx.compose.material3.NavigationBarItem
Expand All @@ -25,8 +30,8 @@ import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
Expand Down Expand Up @@ -83,7 +88,8 @@ internal fun AppRootGraph(
Text(
text = title,
maxLines = 1,
overflow = TextOverflow.Ellipsis
overflow = TextOverflow.Ellipsis,
modifier = Modifier.padding(horizontal = spacing.medium)
)
},
navigationIcon = {
Expand All @@ -97,26 +103,23 @@ internal fun AppRootGraph(
}
},
actions = {

CompositionLocalProvider(
androidx.tv.material3.LocalContentColor provides LocalContentColor.current
) {
actions.forEach { action ->
IconButton(
icon = action.icon,
contentDescription = action.contentDescription,
onClick = action.onClick
)
}
actions.forEach { action ->
IconButton(
icon = action.icon,
contentDescription = action.contentDescription,
onClick = action.onClick
)
}
Spacer(modifier = Modifier.width(spacing.medium))
},
modifier = Modifier.fillMaxWidth()
)
}

val topBarWithContent = @Composable {
val topBarWithContent = @Composable { windowInsets: WindowInsets ->
Scaffold(
topBar = topBar,
contentWindowInsets = windowInsets,
modifier = Modifier.fillMaxSize()
) { padding ->
Background {
Expand All @@ -139,7 +142,7 @@ internal fun AppRootGraph(
Modifier
.fillMaxWidth()
.weight(1f)
) { topBarWithContent() }
) { topBarWithContent(WindowInsets.systemBars.exclude(WindowInsets.navigationBars)) }
NavigationBar(
containerColor = currentContainerColor,
contentColor = currentContentColor,
Expand Down Expand Up @@ -171,7 +174,9 @@ internal fun AppRootGraph(
NavigationRail(
containerColor = currentContainerColor,
contentColor = currentContentColor,
modifier = Modifier.fillMaxHeight()
modifier = Modifier.fillMaxHeight(),
// keep header not null
header = {}
) {
items {
NavigationItemLayout(
Expand All @@ -197,17 +202,17 @@ internal fun AppRootGraph(
Modifier
.fillMaxHeight()
.weight(1f)
) { topBarWithContent() }
) { topBarWithContent(WindowInsets.systemBars) }
}
}
}

@Composable
private fun NavigationItemLayout(
private inline fun NavigationItemLayout(
currentRootDestination: Destination.Root?,
fob: Fob?,
rootDestination: Destination.Root,
navigateToRoot: (Destination.Root) -> Unit,
crossinline navigateToRoot: (Destination.Root) -> Unit,
block: @Composable (
selected: Boolean,
onClick: () -> Unit,
Expand All @@ -227,13 +232,15 @@ private fun NavigationItemLayout(
contentDescription = null
)
}
val label = @Composable {
Text(
text = stringResource(
if (usefob && fob != null) fob.iconTextId
else rootDestination.iconTextId
val label: @Composable () -> Unit = remember(usefob, fob) {
@Composable {
Text(
text = stringResource(
if (usefob && fob != null) fob.iconTextId
else rootDestination.iconTextId
)
)
)
}
}
val actualOnClick: () -> Unit = if (usefob) {
{ fob?.onClick?.invoke() }
Expand Down
4 changes: 2 additions & 2 deletions androidApp/src/main/java/com/m3u/androidApp/ui/RootGraph.kt
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import com.m3u.features.foryou.ForyouRoute
import com.m3u.features.setting.SettingRoute
import com.m3u.material.ktx.Edge
import com.m3u.material.ktx.blurEdge
import com.m3u.material.ktx.isTvDevice
import com.m3u.material.ktx.isTelevision
import com.m3u.ui.Destination
import com.m3u.ui.ResumeEvent
import kotlinx.collections.immutable.ImmutableList
Expand Down Expand Up @@ -104,7 +104,7 @@ private fun RootGraph(

HorizontalPager(
state = pagerState,
userScrollEnabled = !isTvDevice(),
userScrollEnabled = !isTelevision(),
modifier = modifier
.fillMaxSize()
.blurEdge(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import androidx.tv.foundation.lazy.grid.TvLazyVerticalGrid
import androidx.tv.foundation.lazy.grid.items
import com.m3u.core.architecture.pref.LocalPref
import com.m3u.data.database.model.Stream
import com.m3u.material.ktx.isTvDevice
import com.m3u.material.ktx.isTelevision
import com.m3u.material.ktx.plus
import com.m3u.material.model.LocalSpacing
import com.m3u.ui.LocalHelper
Expand Down Expand Up @@ -69,7 +69,7 @@ private fun FavouriteGalleryImpl(
val spacing = LocalSpacing.current
val pref = LocalPref.current
val helper = LocalHelper.current
val tv = isTvDevice()
val tv = isTelevision()
if (!tv) {
LazyVerticalStaggeredGrid(
columns = StaggeredGridCells.Fixed(rowCount),
Expand Down Expand Up @@ -143,7 +143,7 @@ private fun CompactFavouriteGalleryImpl(
val pref = LocalPref.current
val helper = LocalHelper.current

val tv = isTvDevice()
val tv = isTelevision()
if (!tv) {
LazyVerticalStaggeredGrid(
columns = StaggeredGridCells.Fixed(rowCount),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import com.m3u.data.database.model.Stream
import com.m3u.i18n.R.string
import com.m3u.material.components.Image
import com.m3u.material.components.TextBadge
import com.m3u.material.ktx.isTvDevice
import com.m3u.material.ktx.isTelevision
import com.m3u.material.model.LocalSpacing
import java.net.URI

Expand Down Expand Up @@ -78,7 +78,7 @@ private fun FavoriteItemImpl(
) {
val context = LocalContext.current
val spacing = LocalSpacing.current
val tv = isTvDevice()
val tv = isTelevision()

val scheme = remember(stream.url) {
URI(stream.url).scheme ?: context.getString(string.feat_playlist_scheme_unknown)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import com.m3u.core.architecture.pref.LocalPref
import com.m3u.data.database.model.Playlist
import com.m3u.features.foryou.model.PlaylistDetail
import com.m3u.i18n.R.string
import com.m3u.material.ktx.isTvDevice
import com.m3u.material.ktx.isTelevision
import com.m3u.material.ktx.plus
import com.m3u.material.model.LocalSpacing
import kotlinx.collections.immutable.ImmutableList
Expand Down Expand Up @@ -65,7 +65,7 @@ private fun PlaylistGalleryImpl(
modifier: Modifier = Modifier
) {
val spacing = LocalSpacing.current
val tv = isTvDevice()
val tv = isTelevision()
if (!tv) {
LazyVerticalGrid(
columns = GridCells.Fixed(rowCount),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import com.m3u.core.architecture.pref.LocalPref
import com.m3u.material.components.OuterRow
import com.m3u.material.ktx.isTvDevice
import com.m3u.material.ktx.isTelevision
import com.m3u.material.model.LocalSpacing
import androidx.tv.material3.Card as TvCard

Expand Down Expand Up @@ -75,7 +75,7 @@ private fun PlaylistItemImpl(
) {
val spacing = LocalSpacing.current
val theme = MaterialTheme.colorScheme
val tv = isTvDevice()
val tv = isTelevision()
val currentContentColor by animateColorAsState(
targetValue = theme.onSurface,
label = "playlist-item-content"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,13 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.KeyboardDoubleArrowUp
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
Expand All @@ -32,7 +36,6 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.google.accompanist.permissions.PermissionStatus
import com.google.accompanist.permissions.rememberPermissionState
import com.m3u.core.architecture.pref.LocalPref
import com.m3u.core.util.compose.observableStateOf
import com.m3u.core.wrapper.Event
import com.m3u.core.wrapper.Message
import com.m3u.data.database.model.Stream
Expand All @@ -41,13 +44,16 @@ import com.m3u.features.playlist.impl.TvPlaylistScreenImpl
import com.m3u.i18n.R.string
import com.m3u.material.components.Background
import com.m3u.material.ktx.interceptVolumeEvent
import com.m3u.material.ktx.isTvDevice
import com.m3u.material.ktx.isTelevision
import com.m3u.material.model.LocalSpacing
import com.m3u.ui.Destination
import com.m3u.ui.Fob
import com.m3u.ui.LocalHelper
import com.m3u.ui.Sort
import kotlinx.collections.immutable.ImmutableList
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach

@Composable
internal fun PlaylistRoute(
Expand All @@ -73,7 +79,6 @@ internal fun PlaylistRoute(

val message by viewModel.message.collectAsStateWithLifecycle()


// If you try to check or request the WRITE_EXTERNAL_STORAGE on Android 13+,
// it will always return false.
// So you'll have to skip the permission check/request completely on Android 13+.
Expand Down Expand Up @@ -167,22 +172,34 @@ private fun PlaylistScreen(
modifier: Modifier = Modifier
) {
val helper = LocalHelper.current
val currentOnScrollUp by rememberUpdatedState(onScrollUp)

val isAtTopState = remember {
observableStateOf(true) { newValue ->
helper.fob = if (newValue) null
else {
Fob(
icon = Icons.Rounded.KeyboardDoubleArrowUp,
rootDestination = Destination.Root.Foryou,
iconTextId = string.feat_playlist_scroll_up,
onClick = onScrollUp
)
mutableStateOf(true)
}

LaunchedEffect(Unit) {
snapshotFlow { isAtTopState.value }
.distinctUntilChanged()
.onEach { newValue ->
helper.fob = if (newValue) null
else {
Fob(
icon = Icons.Rounded.KeyboardDoubleArrowUp,
rootDestination = Destination.Root.Foryou,
iconTextId = string.feat_playlist_scroll_up,
onClick = currentOnScrollUp
)
}
}
}
.launchIn(this)
}

DisposableEffect(Unit) {
onDispose { helper.fob = null }
}

val tv = isTvDevice()
val tv = isTelevision()
if (!tv) {
PlaylistScreenImpl(
channels = channels,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
Expand Down Expand Up @@ -61,6 +62,8 @@ import com.m3u.ui.Sort
import com.m3u.ui.SortBottomSheet
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch

@Composable
Expand Down Expand Up @@ -169,11 +172,13 @@ internal fun PlaylistScreenImpl(
) {
PlaylistPager(channels) { streams ->
val state = rememberLazyStaggeredGridState()
LaunchedEffect(state.isAtTop) {
isAtTopState.value = state.isAtTop
LaunchedEffect(Unit) {
snapshotFlow { state.isAtTop }
.onEach { isAtTopState.value = it }
.launchIn(this)
}
EventHandler(scrollUp) {
state.animateScrollToItem(0)
state.scrollToItem(0)
}
val orientation = configuration.orientation
val actualRowCount = remember(orientation, rowCount) {
Expand Down
Loading

0 comments on commit 1203c63

Please sign in to comment.