diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/LoadingPlaceholder.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/LoadingPlaceholder.kt index 1ac21a80..455e7e75 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/LoadingPlaceholder.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/LoadingPlaceholder.kt @@ -37,7 +37,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme @Composable @@ -64,7 +64,7 @@ internal fun LoadingPlaceholder(aspectRatio: Float = 3F / 1F) { @Preview(device = "spec:width=1080px,height=600px,dpi=440,orientation=landscape") @Composable private fun VideoPlayerLoaidingPlaceholderPreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { LoadingPlaceholder() } } \ No newline at end of file diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/NewPlayerUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/NewPlayerUI.kt index a9eae8d4..570716bb 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/NewPlayerUI.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/NewPlayerUI.kt @@ -25,6 +25,9 @@ import android.os.Build import android.util.Log import androidx.activity.compose.BackHandler import androidx.annotation.OptIn +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.ColorScheme +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.adaptive.currentWindowSize import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -35,6 +38,8 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat +import androidx.compose.material3.Typography + import androidx.media3.common.util.UnstableApi import net.newpipe.newplayer.data.NewPlayerException @@ -43,15 +48,16 @@ import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel import net.newpipe.newplayer.uiModel.NewPlayerViewModel import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy import net.newpipe.newplayer.ui.audioplayer.AudioPlayerUI -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme import net.newpipe.newplayer.ui.videoplayer.VideoPlayerUi import net.newpipe.newplayer.ui.common.LockScreenOrientation import net.newpipe.newplayer.ui.common.activity -import net.newpipe.newplayer.ui.common.findActivity import net.newpipe.newplayer.ui.common.getDefaultBrightness import net.newpipe.newplayer.ui.common.isInPowerSaveMode import net.newpipe.newplayer.ui.common.setScreenBrightness -import net.newpipe.newplayer.ui.common.window +import net.newpipe.newplayer.ui.theme.NewPlayerTypography +import net.newpipe.newplayer.ui.theme.NewPlayerDarkColorScheme +import net.newpipe.newplayer.ui.theme.NewPlayerLightColorScheme private const val TAG = "VideoPlayerUI" @@ -65,122 +71,138 @@ private const val TAG = "VideoPlayerUI" * or views are hidden and only NewPlayerUI is visible. You can read more about this in * the [NewPlayerViewModel], since the [viewModel] is responsible to tell your UI how to behave * in such cases. + * + * @param viewModel the NewPlayerViewModel that should control this NewPlayerUi. + * @param lightColorScheme is the color scheme used by non video ui related composables, when the system is in light mode. + * @param darkColorScheme is the color scheme used by the video ui related composables, and the rest of the ui if the system is in dark mode. + * @param the typography used by NewPlayer */ @OptIn(UnstableApi::class) @Composable fun NewPlayerUI( viewModel: NewPlayerViewModel?, + lightColorScheme: ColorScheme = NewPlayerLightColorScheme, + darkColorScheme: ColorScheme = NewPlayerDarkColorScheme, + typography: Typography = NewPlayerTypography ) { - if (viewModel !is InternalNewPlayerViewModel?) { - throw NewPlayerException( - "The view model given to NewPlayerUI must be of type InternalNewPlayerViewModel. " - + "This can not be implemented externally, so do not extend NewPlayerViewModel" - ) - } - - if (viewModel == null) { - LoadingPlaceholder() - } else if (viewModel.newPlayer == null) { - LoadingPlaceholder(viewModel.uiState.collectAsState().value.embeddedUiRatio) - } else { - val uiState by viewModel.uiState.collectAsState() + MaterialTheme(colorScheme = darkColorScheme, typography = typography) { + if (viewModel !is InternalNewPlayerViewModel?) { + throw NewPlayerException( + "The view model given to NewPlayerUI must be of type InternalNewPlayerViewModel. " + + "This can not be implemented externally, so do not extend NewPlayerViewModel" + ) + } - // find out whether application is light or dark mode from LocalContext.current - val view = LocalView.current - val activity = activity() - val window = activity.window + if (viewModel == null) { + LoadingPlaceholder() + } else if (viewModel.newPlayer == null) { + LoadingPlaceholder(viewModel.uiState.collectAsState().value.embeddedUiRatio) + } else { + val uiState by viewModel.uiState.collectAsState() - // Setup fullscreen + // find out whether application is light or dark mode from LocalContext.current + val view = LocalView.current + val activity = activity() + val window = activity.window + // Setup fullscreen - LaunchedEffect(uiState.uiMode.fullscreen) { - if (uiState.uiMode.fullscreen) { - WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = - false - } else { - uiState.embeddedUiConfig?.let { + val isInDarkTheme = isSystemInDarkTheme() + LaunchedEffect(uiState.uiMode.forceSysUiDarkThemeMode, key2 = isInDarkTheme) { + if (uiState.uiMode.forceSysUiDarkThemeMode) { WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = - it.systemBarInLightMode + false + } else { + uiState.embeddedUiConfig?.let { + WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = isInDarkTheme + } } } - } - if (uiState.uiMode.fullscreen) { - BackHandler { - viewModel.onBackPressed() + if (uiState.uiMode.fullscreen) { + BackHandler { + viewModel.onBackPressed() + } } - } - // setup immersive mode - LaunchedEffect( - key1 = uiState.uiMode.systemInsetsVisible, - ) { - val windowInsetsController = WindowCompat.getInsetsController(window, window.decorView) - windowInsetsController.systemBarsBehavior = - WindowInsetsControllerCompat.BEHAVIOR_DEFAULT - - if (uiState.uiMode.systemInsetsVisible) { - windowInsetsController.show(WindowInsetsCompat.Type.systemBars()) - } else { - windowInsetsController.hide(WindowInsetsCompat.Type.systemBars()) + // setup immersive mode + LaunchedEffect( + key1 = uiState.uiMode.systemInsetsVisible, + ) { + val windowInsetsController = + WindowCompat.getInsetsController(window, window.decorView) + windowInsetsController.systemBarsBehavior = + WindowInsetsControllerCompat.BEHAVIOR_DEFAULT + + if (uiState.uiMode.systemInsetsVisible) { + windowInsetsController.show(WindowInsetsCompat.Type.systemBars()) + } else { + windowInsetsController.hide(WindowInsetsCompat.Type.systemBars()) + } } - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - val isInPowerSaveMode = isInPowerSaveMode() - LaunchedEffect(key1 = isInPowerSaveMode) { - viewModel.deviceInPowerSaveMode = isInPowerSaveMode + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + val isInPowerSaveMode = isInPowerSaveMode() + LaunchedEffect(key1 = isInPowerSaveMode) { + viewModel.deviceInPowerSaveMode = isInPowerSaveMode + } } - } - if (uiState.uiMode.fitScreenRotation) { - if (uiState.contentRatio < 1) { - LockScreenOrientation(orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) + if (uiState.uiMode.fitScreenRotation) { + if (uiState.contentRatio < 1) { + LockScreenOrientation(orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) + } else { + LockScreenOrientation(orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) + } } else { - LockScreenOrientation(orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) - } - } else { - uiState.embeddedUiConfig?.let { - LockScreenOrientation(orientation = it.screenOrientation) + uiState.embeddedUiConfig?.let { + LockScreenOrientation(orientation = it.screenOrientation) + } } - } - - val defaultBrightness = activity.getDefaultBrightness() - LaunchedEffect(key1 = uiState.brightness) { - Log.d(TAG, "New Brightness: ${uiState.brightness}") - setScreenBrightness( - if (uiState.brightness < 0) defaultBrightness else uiState.brightness, activity - ) - } + val defaultBrightness = activity.getDefaultBrightness() + LaunchedEffect(key1 = uiState.brightness) { + Log.d(TAG, "New Brightness: ${uiState.brightness}") - when (uiState.uiMode) { - - UIModeState.FULLSCREEN_VIDEO, - UIModeState.FULLSCREEN_VIDEO_CONTROLLER_UI, - UIModeState.FULLSCREEN_VIDEO_CHAPTER_SELECT, - UIModeState.FULLSCREEN_VIDEO_STREAM_SELECT, - UIModeState.EMBEDDED_VIDEO, - UIModeState.EMBEDDED_VIDEO_CONTROLLER_UI, - UIModeState.EMBEDDED_VIDEO_STREAM_SELECT, - UIModeState.EMBEDDED_VIDEO_CHAPTER_SELECT, - UIModeState.PIP -> { - VideoPlayerUi(viewModel = viewModel, uiState = uiState) - } - - UIModeState.FULLSCREEN_AUDIO, - UIModeState.EMBEDDED_AUDIO, - UIModeState.AUDIO_STREAM_SELECT, - UIModeState.AUDIO_CHAPTER_SELECT -> { - val windowSize = currentWindowSize() - AudioPlayerUI( - viewModel = viewModel, uiState = uiState, - isLandScape = windowSize.height < windowSize.width + setScreenBrightness( + if (uiState.brightness < 0) defaultBrightness else uiState.brightness, activity ) } - else -> { - LoadingPlaceholder(uiState.embeddedUiRatio) + when (uiState.uiMode) { + + UIModeState.FULLSCREEN_VIDEO, + UIModeState.FULLSCREEN_VIDEO_CONTROLLER_UI, + UIModeState.FULLSCREEN_VIDEO_CHAPTER_SELECT, + UIModeState.FULLSCREEN_VIDEO_STREAM_SELECT, + UIModeState.EMBEDDED_VIDEO, + UIModeState.EMBEDDED_VIDEO_CONTROLLER_UI, + UIModeState.EMBEDDED_VIDEO_STREAM_SELECT, + UIModeState.EMBEDDED_VIDEO_CHAPTER_SELECT, + UIModeState.PIP -> { + VideoPlayerUi(viewModel = viewModel, uiState = uiState) + } + + UIModeState.FULLSCREEN_AUDIO, + UIModeState.EMBEDDED_AUDIO, + UIModeState.AUDIO_STREAM_SELECT, + UIModeState.AUDIO_CHAPTER_SELECT -> { + val windowSize = currentWindowSize() + MaterialTheme( + colorScheme = + if (isInDarkTheme) darkColorScheme else lightColorScheme, + typography = typography + ) { + AudioPlayerUI( + viewModel = viewModel, uiState = uiState, + isLandScape = windowSize.height < windowSize.width + ) + } + } + + else -> { + LoadingPlaceholder(uiState.embeddedUiRatio) + } } } } @@ -191,7 +213,7 @@ fun NewPlayerUI( @Preview(device = "spec:width=1080px,height=700px,dpi=440,orientation=landscape") @Composable private fun PlayerUIPreviewEmbedded() { - VideoPlayerTheme { + VideoPlayerDarkTheme { NewPlayerUI(viewModel = NewPlayerViewModelDummy()) } } diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/NewPlayerView.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/NewPlayerView.kt index 07c02c9a..a9fdeb94 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/NewPlayerView.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/NewPlayerView.kt @@ -30,8 +30,9 @@ import dagger.hilt.android.AndroidEntryPoint import net.newpipe.newplayer.R import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel import net.newpipe.newplayer.uiModel.NewPlayerViewModel -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme import net.newpipe.newplayer.data.NewPlayerException +import net.newpipe.newplayer.ui.theme.VideoPlayerLightTheme /** @@ -49,7 +50,7 @@ class NewPlayerView : FrameLayout { applyViewModel() } - private val composeView:ComposeView + private val composeView: ComposeView @JvmOverloads constructor( @@ -67,9 +68,7 @@ class NewPlayerView : FrameLayout { composeView.apply { setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) setContent { - VideoPlayerTheme { - NewPlayerUI(viewModel = viewModel as InternalNewPlayerViewModel?) - } + NewPlayerUI(viewModel = viewModel as InternalNewPlayerViewModel?) } } } diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlaybackControllerUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlaybackControllerUI.kt index e2336795..da8f5384 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlaybackControllerUI.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlaybackControllerUI.kt @@ -52,7 +52,7 @@ import net.newpipe.newplayer.R import net.newpipe.newplayer.uiModel.NewPlayerUIState import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme @androidx.annotation.OptIn(UnstableApi::class) @Composable @@ -200,7 +200,7 @@ internal fun AudioPlaybackControllerUI( @Preview(device = "id:pixel_6") @Composable private fun AudioPlayerControllerPreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { AudioPlaybackControllerUI( viewModel = NewPlayerViewModelDummy(), uiState = NewPlayerUIState.DUMMY.copy(playList = emptyList(), isLoading = false) diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlayerEmbeddedUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlayerEmbeddedUI.kt index 4e2966bc..aa5158f4 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlayerEmbeddedUI.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlayerEmbeddedUI.kt @@ -46,7 +46,7 @@ import net.newpipe.newplayer.uiModel.NewPlayerUIState import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy import net.newpipe.newplayer.uiModel.UIModeState -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme import net.newpipe.newplayer.ui.videoplayer.CONTROLLER_UI_BACKGROUND_COLOR import net.newpipe.newplayer.ui.videoplayer.PreviewBackgroundSurface import net.newpipe.newplayer.ui.common.Thumbnail @@ -59,7 +59,7 @@ import net.newpipe.newplayer.ui.common.getTimeStringFromMs /** @hide */ internal fun AudioPlayerEmbeddedUI(viewModel: InternalNewPlayerViewModel, uiState: NewPlayerUIState) { - val locale = getLocale()!! + val locale = getLocale() val embeddedUIConfig = getEmbeddedUiConfig() @@ -119,7 +119,7 @@ internal fun AudioPlayerEmbeddedUI(viewModel: InternalNewPlayerViewModel, uiStat top = 0.5.dp, bottom = 0.5.dp ), - color = MaterialTheme.colorScheme.onBackground, + color = MaterialTheme.colorScheme.onPrimary, text = getTimeStringFromMs( uiState.durationInMs, locale, @@ -162,7 +162,7 @@ internal fun AudioPlayerEmbeddedUI(viewModel: InternalNewPlayerViewModel, uiStat @Preview(device = "spec:width=1080px,height=1080px,dpi=440,orientation=landscape") @Composable private fun AudioPlayerEmbeddedPreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { PreviewBackgroundSurface { AudioPlayerEmbeddedUI( viewModel = NewPlayerViewModelDummy(), diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlayerUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlayerUI.kt index cf4f627b..21a4095e 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlayerUI.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlayerUI.kt @@ -26,54 +26,24 @@ import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut -import androidx.compose.animation.slideInHorizontally -import androidx.compose.animation.slideInVertically -import androidx.compose.animation.slideOutHorizontally -import androidx.compose.animation.slideOutVertically import androidx.compose.foundation.background -import androidx.compose.foundation.basicMarquee -import androidx.compose.foundation.layout.Arrangement 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.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.windowInsetsPadding -import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.Card -import androidx.compose.material3.CardDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text 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.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.media3.common.util.UnstableApi -import net.newpipe.newplayer.R -import net.newpipe.newplayer.ui.common.NewPlayerSeeker -import net.newpipe.newplayer.ui.common.thumb_preview.ThumbPreview -import net.newpipe.newplayer.ui.common.Thumbnail -import net.newpipe.newplayer.ui.common.getInsets -import net.newpipe.newplayer.ui.common.getLocale -import net.newpipe.newplayer.ui.common.getTimeStringFromMs -import net.newpipe.newplayer.ui.seeker.SeekerDefaults import net.newpipe.newplayer.ui.selection_ui.ChapterSelectUI -import net.newpipe.newplayer.ui.selection_ui.ReorderableStreamItemsList -import net.newpipe.newplayer.ui.selection_ui.StreamSelectTopBar import net.newpipe.newplayer.ui.selection_ui.StreamSelectUI -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme +import net.newpipe.newplayer.ui.common.getInsets import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel import net.newpipe.newplayer.uiModel.NewPlayerUIState import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy @@ -174,7 +144,7 @@ internal fun AudioPlayerUI( @Preview(device = "id:pixel_6", showSystemUi = true) @Composable private fun AudioPlayerUIPortraitPreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { AudioPlayerUI( viewModel = NewPlayerViewModelDummy(), uiState = NewPlayerUIState.DUMMY.copy( @@ -189,7 +159,7 @@ private fun AudioPlayerUIPortraitPreview() { @Preview(device = "id:pixel_6", showSystemUi = true) @Composable private fun AudioPlayerUIPortraitPreviewWithPlaylist() { - VideoPlayerTheme { + VideoPlayerDarkTheme { AudioPlayerUI( viewModel = NewPlayerViewModelDummy(), uiState = NewPlayerUIState.DUMMY.copy( @@ -205,7 +175,7 @@ private fun AudioPlayerUIPortraitPreviewWithPlaylist() { @Preview(device = "spec:parent=pixel_6,orientation=landscape", showSystemUi = true) @Composable private fun AudioPlayerUILandscapePreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { AudioPlayerUI( viewModel = NewPlayerViewModelDummy(), uiState = NewPlayerUIState.DUMMY.copy(uiMode = UIModeState.FULLSCREEN_AUDIO), @@ -218,7 +188,7 @@ private fun AudioPlayerUILandscapePreview() { @Preview(device = "spec:parent=pixel_6,orientation=landscape", showSystemUi = true) @Composable private fun AudioPlayerUILandscapePreviewWithPlaylist() { - VideoPlayerTheme { + VideoPlayerDarkTheme { AudioPlayerUI( viewModel = NewPlayerViewModelDummy(), uiState = NewPlayerUIState.DUMMY.copy( @@ -234,7 +204,7 @@ private fun AudioPlayerUILandscapePreviewWithPlaylist() { @Preview(device = "spec:parent=pixel_6,orientation=portrait", showSystemUi = true) @Composable private fun AudioPlayerUIEmbeddedPreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { AudioPlayerUI( viewModel = NewPlayerViewModelDummy(), uiState = NewPlayerUIState.DUMMY.copy(uiMode = UIModeState.EMBEDDED_AUDIO), diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/BottomUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/BottomUI.kt index 726a3690..6416a327 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/BottomUI.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/BottomUI.kt @@ -58,7 +58,7 @@ import net.newpipe.newplayer.uiModel.NewPlayerUIState import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy import net.newpipe.newplayer.uiModel.UIModeState -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme import net.newpipe.newplayer.ui.videoplayer.pip.supportsPip import net.newpipe.newplayer.ui.common.getEmbeddedUiConfig import net.newpipe.newplayer.ui.common.showNotYetImplementedToast @@ -225,7 +225,7 @@ private fun Menu(viewModel: InternalNewPlayerViewModel, uiState: NewPlayerUIStat @Preview(device = "id:pixel_6") @Composable private fun AudioBottomUIPreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { Box(modifier = Modifier.fillMaxWidth()) { AudioBottomUI( viewModel = NewPlayerViewModelDummy(), diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/LandscapeLayout.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/LandscapeLayout.kt index 08a35797..09bdac34 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/LandscapeLayout.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/LandscapeLayout.kt @@ -24,7 +24,7 @@ import androidx.compose.ui.unit.dp import androidx.media3.common.util.UnstableApi import net.newpipe.newplayer.ui.selection_ui.ReorderableStreamItemsList import net.newpipe.newplayer.ui.selection_ui.StreamSelectTopBar -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel import net.newpipe.newplayer.uiModel.NewPlayerUIState import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy @@ -113,7 +113,7 @@ private fun LandscapeCoverArtOrPlaylistUI( @Preview(device = "spec:parent=pixel_6,orientation=landscape") @Composable private fun AudioPlayerUILandscapePreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { Box( modifier = Modifier .wrapContentSize() @@ -132,7 +132,7 @@ private fun AudioPlayerUILandscapePreview() { @Preview(device = "spec:parent=pixel_6,orientation=landscape") @Composable private fun AudioPlayerUILandscapePreviewWithPlaylist() { - VideoPlayerTheme { + VideoPlayerDarkTheme { Box( modifier = Modifier .wrapContentSize() diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/PortraitLayout.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/PortraitLayout.kt index 3c35d994..c637f412 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/PortraitLayout.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/PortraitLayout.kt @@ -22,7 +22,7 @@ import androidx.compose.ui.unit.dp import androidx.media3.common.util.UnstableApi import net.newpipe.newplayer.ui.selection_ui.ReorderableStreamItemsList import net.newpipe.newplayer.ui.selection_ui.StreamSelectTopBar -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel import net.newpipe.newplayer.uiModel.NewPlayerUIState import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy @@ -97,7 +97,7 @@ private fun PortraitCoverArtOrPlaylistUI( @Preview(device = "id:pixel_6") @Composable private fun AudioPlayerUIPortraitPreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { Box( modifier = Modifier .wrapContentSize() @@ -117,7 +117,7 @@ private fun AudioPlayerUIPortraitPreview() { @Preview(device = "id:pixel_6") @Composable private fun AudioPlayerUIPortraitPreviewWithPlaylist() { - VideoPlayerTheme { + VideoPlayerDarkTheme { Box( modifier = Modifier .wrapContentSize() diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/ProgressUi.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/ProgressUi.kt index 2aea37f5..1f56d3ec 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/ProgressUi.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/ProgressUi.kt @@ -20,7 +20,7 @@ import net.newpipe.newplayer.ui.common.thumb_preview.ThumbPreview import net.newpipe.newplayer.ui.common.getLocale import net.newpipe.newplayer.ui.common.getTimeStringFromMs import net.newpipe.newplayer.ui.seeker.SeekerDefaults -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel import net.newpipe.newplayer.uiModel.NewPlayerUIState import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy @@ -33,7 +33,7 @@ internal fun ProgressUI( viewModel: InternalNewPlayerViewModel, uiState: NewPlayerUIState ) { - val locale = getLocale()!! + val locale = getLocale() Column(modifier = modifier) { Box( @@ -77,7 +77,7 @@ internal fun ProgressUI( @Preview(device = "id:pixel_6") @Composable private fun AudioPlayerProgressUIPreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { ProgressUI( viewModel = NewPlayerViewModelDummy(), uiState = NewPlayerUIState.DUMMY.copy(playList = emptyList(), isLoading = false) diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/common/thumb_preview/ThumbPreview.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/common/thumb_preview/ThumbPreview.kt index 6f3e8c70..2275451f 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/common/thumb_preview/ThumbPreview.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/common/thumb_preview/ThumbPreview.kt @@ -66,9 +66,10 @@ import androidx.media3.common.util.UnstableApi import net.newpipe.newplayer.R import net.newpipe.newplayer.data.Chapter import net.newpipe.newplayer.ui.seeker.SeekerDefaults -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme import net.newpipe.newplayer.uiModel.NewPlayerUIState + /** @hide */ internal const val PREVIEW_BOX_PADDING = 4 internal const val PREVIEW_TEXT_TO_HEIGHT_RATIO = 18 / 9 @@ -233,7 +234,7 @@ private fun ThumbPreviewPreview() { BitmapFactory.decodeResource(LocalContext.current.resources, R.mipmap.thumbnail_preview) - VideoPlayerTheme { + VideoPlayerDarkTheme { Column( modifier = Modifier .fillMaxSize() diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/common/utils.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/common/utils.kt index 9dc61ed3..36c15752 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/common/utils.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/common/utils.kt @@ -127,9 +127,9 @@ internal fun setScreenBrightness(value: Float, activity: Activity) { /** @hide */ @Composable @ReadOnlyComposable -internal fun getLocale(): Locale? { +internal fun getLocale(): Locale { val configuration = LocalConfiguration.current - return ConfigurationCompat.getLocales(configuration).get(0) + return ConfigurationCompat.getLocales(configuration).get(0) ?: Locale.getDefault() } @Composable diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/seeker/SeekerDefaults.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/seeker/SeekerDefaults.kt index 76f74562..62658b47 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/seeker/SeekerDefaults.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/seeker/SeekerDefaults.kt @@ -31,7 +31,6 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.compositeOver import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import net.newpipe.newplayer.ui.theme.VideoPlayerColorScheme /** @hide */ diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/ChapterItem.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/ChapterItem.kt index a044fbd0..7356a43a 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/ChapterItem.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/ChapterItem.kt @@ -34,6 +34,7 @@ import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -50,10 +51,11 @@ import androidx.compose.ui.unit.sp import net.newpipe.newplayer.data.Chapter import net.newpipe.newplayer.data.NewPlayerException import net.newpipe.newplayer.R -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme import net.newpipe.newplayer.ui.common.Thumbnail import net.newpipe.newplayer.ui.common.getLocale import net.newpipe.newplayer.ui.common.getTimeStringFromMs +import net.newpipe.newplayer.ui.theme.VideoPlayerLightTheme /** @hide */ @@ -80,7 +82,7 @@ internal fun ChapterItem( onClicked: (Int) -> Unit, isCurrentChapter: Boolean ) { - val locale = getLocale()!! + val locale = getLocale() Box( modifier = modifier .height(80.dp) @@ -94,7 +96,7 @@ internal fun ChapterItem( ) { Surface( modifier = Modifier.fillMaxSize(), - color = Color.White.copy(alpha = 0.2f), + color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.2f), ) {} } @@ -136,7 +138,7 @@ internal fun ChapterItem( @Preview(device = "spec:width=1080px,height=300px,dpi=440,orientation=landscape") @Composable private fun ChapterItemPreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { Surface(modifier = Modifier.fillMaxSize(), color = Color.DarkGray) { ChapterItem( id = 0, diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/ChapterSelectTopBar.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/ChapterSelectTopBar.kt index 2a7c8512..cd90a314 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/ChapterSelectTopBar.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/ChapterSelectTopBar.kt @@ -38,7 +38,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import net.newpipe.newplayer.R -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme /** @hide */ @OptIn(ExperimentalMaterial3Api::class) @@ -63,7 +63,7 @@ internal fun ChapterSelectTopBar(modifier: Modifier = Modifier, onClose: () -> U @Preview(device = "spec:width=1080px,height=150px,dpi=440,orientation=landscape") @Composable private fun ChapterTopBarPreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { Surface(modifier = Modifier.fillMaxSize(), color = Color.DarkGray) { ChapterSelectTopBar(modifier = Modifier.fillMaxSize()) {} } diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/ChapterSelectUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/ChapterSelectUI.kt index fc0c51b2..0ab7a820 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/ChapterSelectUI.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/ChapterSelectUI.kt @@ -39,7 +39,7 @@ import androidx.media3.common.util.UnstableApi import net.newpipe.newplayer.uiModel.NewPlayerUIState import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme import net.newpipe.newplayer.ui.common.getEmbeddedUiConfig import net.newpipe.newplayer.ui.common.getInsets @@ -114,7 +114,7 @@ internal fun ChapterSelectUI( @Preview(device = "id:pixel_5") @Composable private fun VideoPlayerChannelSelectUIPreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { Surface(modifier = Modifier.fillMaxSize(), color = Color.DarkGray) { ChapterSelectUI( viewModel = NewPlayerViewModelDummy(), diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamItem.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamItem.kt index f3d5fbb1..0285b009 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamItem.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamItem.kt @@ -64,7 +64,7 @@ import androidx.media3.common.util.UnstableApi import net.newpipe.newplayer.R import net.newpipe.newplayer.uiModel.NewPlayerUIState import net.newpipe.newplayer.ui.videoplayer.CONTROLLER_UI_BACKGROUND_COLOR -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme import net.newpipe.newplayer.ui.common.ReorderHapticFeedback import net.newpipe.newplayer.ui.common.ReorderHapticFeedbackType import net.newpipe.newplayer.ui.common.Thumbnail @@ -88,7 +88,7 @@ internal fun StreamItem( isDragging: Boolean, isCurrentlyPlaying: Boolean ) { - val locale = getLocale()!! + val locale = getLocale() val interactionSource = remember { MutableInteractionSource() } @@ -140,7 +140,7 @@ internal fun StreamItem( ) { Surface( modifier = Modifier.fillMaxSize(), - color = Color.White.copy(alpha = 0.2f), + color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.2f), ) {} } @@ -178,8 +178,9 @@ internal fun StreamItem( text = getTimeStringFromMs( playlistItem.mediaMetadata.durationMs ?: 0L, locale, - leadingZerosForMinutes = false + leadingZerosForMinutes = false, ), + color = MaterialTheme.colorScheme.onPrimary, fontSize = 14.sp, ) } @@ -246,7 +247,7 @@ internal fun StreamItem( @Preview(device = "spec:width=1080px,height=400px,dpi=440,orientation=landscape") @Composable private fun StreamItemPreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { Surface(modifier = Modifier.fillMaxSize(), color = Color.DarkGray) { Box(modifier = Modifier.fillMaxSize()) { StreamItem( @@ -262,4 +263,4 @@ private fun StreamItemPreview() { } } } -} \ No newline at end of file +} diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamSelectTopBar.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamSelectTopBar.kt index cba5cc90..b89875f7 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamSelectTopBar.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamSelectTopBar.kt @@ -45,7 +45,7 @@ import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy import net.newpipe.newplayer.ui.common.RepeatModeButton import net.newpipe.newplayer.ui.common.ShuffleModeButton -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme import net.newpipe.newplayer.ui.common.getEmbeddedUiConfig import net.newpipe.newplayer.ui.common.getLocale import net.newpipe.newplayer.ui.common.getPlaylistDurationInMS @@ -68,7 +68,7 @@ internal fun StreamSelectTopBar( TopAppBar(modifier = modifier, colors = topAppBarColors(containerColor = Color.Transparent), title = { - val locale = getLocale()!! + val locale = getLocale() val duration = getPlaylistDurationInMS(uiState.playList) val durationString = getTimeStringFromMs(timeSpanInMs = duration, locale) val playbackPositionString = getTimeStringFromMs( @@ -121,7 +121,7 @@ internal fun StreamSelectTopBar( @Preview(device = "spec:width=1080px,height=150px,dpi=440,orientation=landscape") @Composable private fun StreamSelectTopBarPreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { Surface(modifier = Modifier.fillMaxSize(), color = Color.DarkGray) { StreamSelectTopBar( modifier = Modifier.fillMaxSize(), diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamSelectUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamSelectUI.kt index cb47d42f..1404e903 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamSelectUI.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamSelectUI.kt @@ -43,7 +43,7 @@ import androidx.media3.common.util.UnstableApi import net.newpipe.newplayer.uiModel.NewPlayerUIState import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme import net.newpipe.newplayer.ui.common.ReorderHapticFeedbackType import net.newpipe.newplayer.ui.common.getInsets import net.newpipe.newplayer.ui.common.rememberReorderHapticFeedback @@ -145,7 +145,7 @@ internal fun ReorderableStreamItemsList( @Preview(device = "id:pixel_5") @Composable private fun VideoPlayerStreamSelectUIPreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { Surface(modifier = Modifier.fillMaxSize(), color = Color.DarkGray) { StreamSelectUI( viewModel = NewPlayerViewModelDummy(), diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/theme/Color.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/theme/Color.kt deleted file mode 100644 index 28e04e87..00000000 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/theme/Color.kt +++ /dev/null @@ -1,131 +0,0 @@ -/* NewPlayer - * - * @author Christian Schabesberger - * - * Copyright (C) NewPipe e.V. 2024 - * - * NewPlayer is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * NewPlayer is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with NewPlayer. If not, see . - */ - -package net.newpipe.newplayer.ui.theme - -import androidx.annotation.OptIn -import androidx.compose.runtime.Composable -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.tooling.preview.Preview -import androidx.media3.common.util.UnstableApi -import net.newpipe.newplayer.uiModel.UIModeState -import net.newpipe.newplayer.uiModel.NewPlayerUIState -import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy -import net.newpipe.newplayer.ui.audioplayer.AudioPlayerUI -import net.newpipe.newplayer.ui.videoplayer.PreviewBackgroundSurface -import net.newpipe.newplayer.ui.videoplayer.VideoPlayerControllerUI - -val video_player_primary = Color(0xFFE53935) - -// The color of buttons, and the LoadingCircle -val video_player_onPrimary = Color(0xFFF8F8F8) - -val video_player_primaryContainer = Color(0xFFFFFF00) -val video_player_onPrimaryContainer = Color(0xFFFFDDB3) -val video_player_secondary = Color(0xFFDDC2A1) -val video_player_onSecondary = Color(0xFF3E2D16) -val video_player_secondaryContainer = Color(0xFF56442A) -val video_player_onSecondaryContainer = Color(0xFFFBDEBC) -val video_player_tertiary = Color(0xFFB8CEA1) -val video_player_onTertiary = Color(0xFF243515) -val video_player_tertiaryContainer = Color(0xFF3A4C2A) -val video_player_onTertiaryContainer = Color(0xFFD4EABB) - -val video_player_error = Color(0xFFFFB4AB) -val video_player_errorContainer = Color(0xFF93000A) -val video_player_onError = Color(0xFF690005) -val video_player_onErrorContainer = Color(0xFFFFDAD6) - -// background color -val video_player_background = Color(0xFF1F1B16) - -// Font color on background -val video_player_onBackground = Color(0xFFEAE1D9) - -val video_player_surface = Color(0xFF000000) - -// The color of the Text and icons -val video_player_onSurface = Color(0xFFF8F8F8) - -// The color of the menu Icons -val video_player_onSurfaceVariant = Color(0xFFF8F8F8) - -// The background color of the seekbar -val video_player_surfaceVariant = Color(0xFF4F4539) - -val video_player_outline = Color(0xFF9C8F80) -val video_player_inverseOnSurface = Color(0xFF1F1B16) -val video_player_inverseSurface = Color(0xFFEAE1D9) -val video_player_inversePrimary = Color(0xFF825500) -val video_player_shadow = Color(0xFF000000) -val video_player_surfaceTint = Color(0xFFFFB951) -val video_player_outlineVariant = Color(0xFF4F4539) -val video_player_scrim = Color(0xFF000000) - -@OptIn(UnstableApi::class) -@Preview(device = "spec:width=1080px,height=600px,dpi=440,orientation=landscape") -@Composable -/** @hide */ -internal fun VideoPlayerControllerUIPreviewEmbeddedColorPreview() { - VideoPlayerTheme { - PreviewBackgroundSurface { - VideoPlayerControllerUI( - viewModel = NewPlayerViewModelDummy(), - uiState = NewPlayerUIState.DUMMY.copy( - uiMode = UIModeState.EMBEDDED_VIDEO_CONTROLLER_UI, - playing = true, - seekerPosition = 0.3f, - isLoading = false, - durationInMs = 9 * 60 * 1000, - playbackPositionInMs = 6 * 60 * 1000, - bufferedPercentage = 0.4f, - fastSeekSeconds = 10, - ), - ) - } - } -} - - -@OptIn(UnstableApi::class) -@Preview(device = "id:pixel_6") -@Composable -/** @hide */ -internal fun AudioPlayerUIColorPreview() { - VideoPlayerTheme { - PreviewBackgroundSurface { - AudioPlayerUI( - viewModel = NewPlayerViewModelDummy(), - uiState = NewPlayerUIState.DUMMY.copy( - uiMode = UIModeState.FULLSCREEN_AUDIO, - playing = true, - seekerPosition = 0.3f, - isLoading = false, - durationInMs = 9 * 60 * 1000, - playbackPositionInMs = 6 * 60 * 1000, - bufferedPercentage = 0.4f, - fastSeekSeconds = 10, - ), - isLandScape = false - ) - } - } -} - diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/theme/DarkColor.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/theme/DarkColor.kt new file mode 100644 index 00000000..6b5c5f26 --- /dev/null +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/theme/DarkColor.kt @@ -0,0 +1,50 @@ +package net.newpipe.newplayer.ui.theme + +import androidx.compose.ui.graphics.Color + +val video_player_primary_dark = Color(0xFFE53935) + +// The color of buttons, and the LoadingCircle +val video_player_onPrimary_dark = Color(0xFFF8F8F8) + +val video_player_primaryContainer_dark = Color(0xFFFFFF00) +val video_player_onPrimaryContainer_dark = Color(0xFFFFDDB3) +val video_player_secondary_dark = Color(0xFFDDC2A1) +val video_player_onSecondary_dark = Color(0xFF3E2D16) +val video_player_secondaryContainer_dark = Color(0xFF56442A) +val video_player_onSecondaryContainer_dark = Color(0xFFFBDEBC) +val video_player_tertiary_dark = Color(0xFFB8CEA1) +val video_player_onTertiary_dark = Color(0xFF243515) +val video_player_tertiaryContainer_dark = Color(0xFF3A4C2A) +val video_player_onTertiaryContainer_dark = Color(0xFFD4EABB) + +val video_player_error_dark = Color(0xFFFFB4AB) +val video_player_errorContainer_dark = Color(0xFF93000A) +val video_player_onError_dark = Color(0xFF690005) +val video_player_onErrorContainer_dark = Color(0xFFFFDAD6) + +// background color +val video_player_background_dark = Color(0xFF1F1B16) + +// Font color on background +val video_player_onBackground_dark = Color(0xFFEAE1D9) + +val video_player_surface_dark = Color(0xFF000000) + +// The color of the Text and icons +val video_player_onSurface_dark = Color(0xFFF8F8F8) + +// The color of the menu Icons +val video_player_onSurfaceVariant_dark = Color(0xFFF8F8F8) + +// The background color of the seekbar +val video_player_surfaceVariant_dark = Color(0xFF4F4539) + +val video_player_outline_dark = Color(0xFF9C8F80) +val video_player_inverseOnSurface_dark = Color(0xFF1F1B16) +val video_player_inverseSurface_dark = Color(0xFFEAE1D9) +val video_player_inversePrimary_dark = Color(0xFF825500) +val video_player_shadow_dark = Color(0xFF000000) +val video_player_surfaceTint_dark = Color(0xFFFFB951) +val video_player_outlineVariant_dark = Color(0xFF4F4539) +val video_player_scrim_dark = Color(0xFF000000) diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/theme/DarkTheme.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/theme/DarkTheme.kt new file mode 100644 index 00000000..859b1726 --- /dev/null +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/theme/DarkTheme.kt @@ -0,0 +1,50 @@ +package net.newpipe.newplayer.ui.theme + +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme + +import androidx.compose.runtime.Composable + +val NewPlayerDarkColorScheme = darkColorScheme( + primary = video_player_primary_dark, + onPrimary = video_player_onPrimary_dark, + primaryContainer = video_player_primaryContainer_dark, + onPrimaryContainer = video_player_onPrimaryContainer_dark, + secondary = video_player_secondary_dark, + onSecondary = video_player_onSecondary_dark, + secondaryContainer = video_player_secondaryContainer_dark, + onSecondaryContainer = video_player_onSecondaryContainer_dark, + tertiary = video_player_tertiary_dark, + onTertiary = video_player_onTertiary_dark, + tertiaryContainer = video_player_tertiaryContainer_dark, + onTertiaryContainer = video_player_onTertiaryContainer_dark, + error = video_player_error_dark, + errorContainer = video_player_errorContainer_dark, + onError = video_player_onError_dark, + onErrorContainer = video_player_onErrorContainer_dark, + background = video_player_background_dark, + onBackground = video_player_onBackground_dark, + surface = video_player_surface_dark, + onSurface = video_player_onSurface_dark, + surfaceVariant = video_player_surfaceVariant_dark, + onSurfaceVariant = video_player_onSurfaceVariant_dark, + outline = video_player_outline_dark, + inverseOnSurface = video_player_inverseOnSurface_dark, + inverseSurface = video_player_inverseSurface_dark, + inversePrimary = video_player_inversePrimary_dark, + surfaceTint = video_player_surfaceTint_dark, + outlineVariant = video_player_outlineVariant_dark, + scrim = video_player_scrim_dark, +) + +@Composable +/** @hide */ +internal fun VideoPlayerDarkTheme( + content: @Composable () -> Unit +) { + MaterialTheme( + colorScheme = NewPlayerDarkColorScheme, + typography = NewPlayerTypography, + content = content + ) +} diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/theme/LightColor.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/theme/LightColor.kt new file mode 100644 index 00000000..6365261d --- /dev/null +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/theme/LightColor.kt @@ -0,0 +1,42 @@ +package net.newpipe.newplayer.ui.theme + +import androidx.compose.ui.graphics.Color + +val video_player_primary_light = Color(0xFFE53935) +val video_player_onPrimary_light = Color(0xFFFFFFFF) + +val video_player_primaryContainer_light = Color(0xFFFDEBEB) +val video_player_onPrimaryContainer_light = Color(0xFF410002) + +val video_player_secondary_light = Color(0xFF775656) +val video_player_onSecondary_light = Color(0xFFFFFFFF) +val video_player_secondaryContainer_light = Color(0xFFFDEBEB) +val video_player_onSecondaryContainer_light = Color(0xFF2C1515) + +val video_player_tertiary_light = Color(0xFF755A2F) +val video_player_onTertiary_light = Color(0xFFFFFFFF) +val video_player_tertiaryContainer_light = Color(0xFFFFDEA8) +val video_player_onTertiaryContainer_light = Color(0xFF281800) + +val video_player_error_light = Color(0xFFBA1A1A) +val video_player_errorContainer_light = Color(0xFFFFDAD6) +val video_player_onError_light = Color(0xFFFFFFFF) +val video_player_onErrorContainer_light = Color(0xFF410002) + +val video_player_background_light = Color(0xFFFCFCFC) +val video_player_onBackground_light = Color(0xFF211A1A) + +val video_player_surface_light = Color(0xFFFCFCFC) +val video_player_onSurface_light = Color(0xFF211A1A) + +val video_player_surfaceVariant_light = Color(0xFFF4DDDD) +val video_player_onSurfaceVariant_light = Color(0xFF524343) + +val video_player_outline_light = Color(0xFF857373) +val video_player_inverseOnSurface_light = Color(0xFFFBEEEE) +val video_player_inverseSurface_light = Color(0xFF362F2F) +val video_player_inversePrimary_light = Color(0xFFFFB3B0) +val video_player_shadow_light = Color(0xFF000000) +val video_player_surfaceTint_light = Color(0xFFE53935) +val video_player_outlineVariant_light = Color(0xFFD7C1C1) +val video_player_scrim_light = Color(0xFF000000) diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/theme/LightTheme.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/theme/LightTheme.kt new file mode 100644 index 00000000..9fa5bb32 --- /dev/null +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/theme/LightTheme.kt @@ -0,0 +1,49 @@ +package net.newpipe.newplayer.ui.theme + +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable + +val NewPlayerLightColorScheme = lightColorScheme( + primary = video_player_primary_light, + onPrimary = video_player_onPrimary_light, + primaryContainer = video_player_primaryContainer_light, + onPrimaryContainer = video_player_onPrimaryContainer_light, + secondary = video_player_secondary_light, + onSecondary = video_player_onSecondary_light, + secondaryContainer = video_player_secondaryContainer_light, + onSecondaryContainer = video_player_onSecondaryContainer_light, + tertiary = video_player_tertiary_light, + onTertiary = video_player_onTertiary_light, + tertiaryContainer = video_player_tertiaryContainer_light, + onTertiaryContainer = video_player_onTertiaryContainer_light, + error = video_player_error_light, + errorContainer = video_player_errorContainer_light, + onError = video_player_onError_light, + onErrorContainer = video_player_onErrorContainer_light, + background = video_player_background_light, + onBackground = video_player_onBackground_light, + surface = video_player_surface_light, + onSurface = video_player_onSurface_light, + surfaceVariant = video_player_surfaceVariant_light, + onSurfaceVariant = video_player_onSurfaceVariant_light, + outline = video_player_outline_light, + inverseOnSurface = video_player_inverseOnSurface_light, + inverseSurface = video_player_inverseSurface_light, + inversePrimary = video_player_inversePrimary_light, + surfaceTint = video_player_surfaceTint_light, + outlineVariant = video_player_outlineVariant_light, + scrim = video_player_scrim_light, +) + +@Composable +/** @hide */ +internal fun VideoPlayerLightTheme( + content: @Composable () -> Unit +) { + MaterialTheme( + colorScheme = NewPlayerLightColorScheme, + typography = NewPlayerTypography, + content = content + ) +} diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/theme/Theme.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/theme/Theme.kt deleted file mode 100644 index dfb4a308..00000000 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/theme/Theme.kt +++ /dev/null @@ -1,70 +0,0 @@ -/* NewPlayer - * - * @author Christian Schabesberger - * - * Copyright (C) NewPipe e.V. 2024 - * - * NewPlayer is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * NewPlayer is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with NewPlayer. If not, see . - */ - -package net.newpipe.newplayer.ui.theme - -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.darkColorScheme - -import androidx.compose.runtime.Composable - -val VideoPlayerColorScheme = darkColorScheme( - primary = video_player_primary, - onPrimary = video_player_onPrimary, - primaryContainer = video_player_primaryContainer, - onPrimaryContainer = video_player_onPrimaryContainer, - secondary = video_player_secondary, - onSecondary = video_player_onSecondary, - secondaryContainer = video_player_secondaryContainer, - onSecondaryContainer = video_player_onSecondaryContainer, - tertiary = video_player_tertiary, - onTertiary = video_player_onTertiary, - tertiaryContainer = video_player_tertiaryContainer, - onTertiaryContainer = video_player_onTertiaryContainer, - error = video_player_error, - errorContainer = video_player_errorContainer, - onError = video_player_onError, - onErrorContainer = video_player_onErrorContainer, - background = video_player_background, - onBackground = video_player_onBackground, - surface = video_player_surface, - onSurface = video_player_onSurface, - surfaceVariant = video_player_surfaceVariant, - onSurfaceVariant = video_player_onSurfaceVariant, - outline = video_player_outline, - inverseOnSurface = video_player_inverseOnSurface, - inverseSurface = video_player_inverseSurface, - inversePrimary = video_player_inversePrimary, - surfaceTint = video_player_surfaceTint, - outlineVariant = video_player_outlineVariant, - scrim = video_player_scrim, -) - -@Composable -/** @hide */ -internal fun VideoPlayerTheme( - content: @Composable () -> Unit -) { - MaterialTheme( - colorScheme = VideoPlayerColorScheme, - typography = Typography, - content = content - ) -} \ No newline at end of file diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/theme/Type.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/theme/Type.kt index 9a42ddaa..217ea229 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/theme/Type.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/theme/Type.kt @@ -27,7 +27,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.sp // Set of Material typography styles to start with -val Typography = Typography( +val NewPlayerTypography = Typography( bodyLarge = TextStyle( fontFamily = FontFamily.Default, fontWeight = FontWeight.Normal, diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/VideoPlayerControllerUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/VideoPlayerControllerUI.kt index 6d29c5e7..68f5f894 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/VideoPlayerControllerUI.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/VideoPlayerControllerUI.kt @@ -54,7 +54,7 @@ import net.newpipe.newplayer.uiModel.NewPlayerUIState import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy import net.newpipe.newplayer.uiModel.UIModeState -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme import net.newpipe.newplayer.ui.videoplayer.controller.BottomUI import net.newpipe.newplayer.ui.videoplayer.controller.CenterUI import net.newpipe.newplayer.ui.videoplayer.controller.TopUI @@ -182,7 +182,7 @@ internal fun PreviewBackgroundSurface( @Preview(device = "spec:width=1080px,height=600px,dpi=440,orientation=landscape") @Composable private fun VideoPlayerControllerUIPreviewEmbedded() { - VideoPlayerTheme { + VideoPlayerDarkTheme { PreviewBackgroundSurface { VideoPlayerControllerUI( NewPlayerViewModelDummy(), NewPlayerUIState.DUMMY.copy( @@ -197,7 +197,7 @@ private fun VideoPlayerControllerUIPreviewEmbedded() { @Preview(device = "spec:width=2340px,height=1080px,dpi=440,orientation=landscape") @Composable private fun VideoPlayerControllerUIPreviewLandscape() { - VideoPlayerTheme { + VideoPlayerDarkTheme { PreviewBackgroundSurface { VideoPlayerControllerUI( NewPlayerViewModelDummy(), NewPlayerUIState.DUMMY.copy( @@ -212,7 +212,7 @@ private fun VideoPlayerControllerUIPreviewLandscape() { @Preview(device = "spec:width=2340px,height=1080px,dpi=440,orientation=portrait") @Composable private fun VideoPlayerControllerUIPreviewPortrait() { - VideoPlayerTheme { + VideoPlayerDarkTheme { PreviewBackgroundSurface { VideoPlayerControllerUI( NewPlayerViewModelDummy(), NewPlayerUIState.DUMMY.copy( diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/BottomUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/BottomUI.kt index d7c0edec..0c0f2d63 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/BottomUI.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/BottomUI.kt @@ -50,14 +50,13 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.media3.common.util.UnstableApi import net.newpipe.newplayer.R -import net.newpipe.newplayer.uiModel.EmbeddedUiConfig import net.newpipe.newplayer.uiModel.UIModeState import net.newpipe.newplayer.uiModel.NewPlayerUIState import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy import net.newpipe.newplayer.ui.common.NewPlayerSeeker import net.newpipe.newplayer.ui.common.thumb_preview.ThumbPreview -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme import net.newpipe.newplayer.ui.common.getEmbeddedUiConfig import net.newpipe.newplayer.ui.common.getLocale import net.newpipe.newplayer.ui.common.getTimeStringFromMs @@ -106,7 +105,7 @@ internal fun BottomUI( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween, ) { - val locale = getLocale()!! + val locale = getLocale() Text(text = getTimeStringFromMs(uiState.playbackPositionInMs, getLocale() ?: locale), modifier = Modifier.onGloballyPositioned { @@ -164,7 +163,7 @@ internal fun BottomUI( private fun VideoPlayerControllerBottomUIPreview() { var sliderPosition by remember { mutableFloatStateOf(0f) } - VideoPlayerTheme { + VideoPlayerDarkTheme { Surface(color = Color.Black) { BottomUI( modifier = Modifier, diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/CenterUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/CenterUI.kt index daf46443..dc5f6b9c 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/CenterUI.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/CenterUI.kt @@ -52,7 +52,7 @@ import net.newpipe.newplayer.R import net.newpipe.newplayer.uiModel.NewPlayerUIState import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme @OptIn(UnstableApi::class) @Composable @@ -145,7 +145,7 @@ private fun CenterControlButton( @Preview(device = "spec:width=1080px,height=600px,dpi=440,orientation=landscape") @Composable private fun VideoPlayerControllerUICenterUIPreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { Surface(color = Color.Black) { CenterUI( viewModel = NewPlayerViewModelDummy(), diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/Menu.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/Menu.kt index 7acb0804..348abf5c 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/Menu.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/Menu.kt @@ -62,7 +62,7 @@ import net.newpipe.newplayer.uiModel.NewPlayerUIState import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy import net.newpipe.newplayer.uiModel.UIModeState -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme import net.newpipe.newplayer.ui.videoplayer.pip.supportsPip import net.newpipe.newplayer.ui.common.getEmbeddedUiConfig import net.newpipe.newplayer.ui.common.showNotYetImplementedToast @@ -203,7 +203,7 @@ private fun CustomMenuItem(icon: ImageVector, text: Int, onClick: () -> Unit) { @Preview(device = "spec:width=1080px,height=1080px,dpi=440,orientation=landscape") @Composable private fun VideoPlayerControllerDropDownPreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { Box(Modifier.fillMaxSize()) { VideoPlayerMenu( viewModel = NewPlayerViewModelDummy(), diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/TopUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/TopUI.kt index 5f450709..e348562b 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/TopUI.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/TopUI.kt @@ -40,6 +40,7 @@ import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -65,10 +66,9 @@ import net.newpipe.newplayer.uiModel.NewPlayerUIState import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy import net.newpipe.newplayer.uiModel.UIModeState -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme -import net.newpipe.newplayer.ui.theme.video_player_onSurface import net.newpipe.newplayer.ui.common.getEmbeddedUiConfig import net.newpipe.newplayer.ui.common.showNotYetImplementedToast +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme @OptIn(UnstableApi::class) @Composable @@ -199,7 +199,7 @@ private fun TrackSelectionMenu(viewModel: InternalNewPlayerViewModel, uiState: N }, contentPadding = PaddingValues(0.dp), colors = ButtonDefaults.buttonColors( - containerColor = Color.Transparent, contentColor = video_player_onSurface + containerColor = Color.Transparent, contentColor = MaterialTheme.colorScheme.onSurface ), ) { Text( @@ -235,7 +235,7 @@ private fun TrackSelectionMenu(viewModel: InternalNewPlayerViewModel, uiState: N @Preview(device = "spec:parent=pixel_6,orientation=landscape") @Composable private fun VideoPlayerControllerTopUIPreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { Surface(color = Color.Black) { TopUI( modifier = Modifier, NewPlayerViewModelDummy(), NewPlayerUIState.DUMMY.copy( diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/EmbeddedGestureUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/EmbeddedGestureUI.kt index 24ff931a..376177eb 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/EmbeddedGestureUI.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/EmbeddedGestureUI.kt @@ -45,7 +45,7 @@ import net.newpipe.newplayer.uiModel.NewPlayerUIState import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy import net.newpipe.newplayer.uiModel.UIModeState -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme import net.newpipe.newplayer.ui.common.getEmbeddedUiConfig private const val TAG = "EmbeddedGestureUI" @@ -171,7 +171,7 @@ internal fun EmbeddedGestureUI( @Preview(device = "spec:width=600px,height=400px,dpi=440,orientation=landscape") @Composable private fun EmbeddedGestureUIPreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { Surface(modifier = Modifier.wrapContentSize(), color = Color.DarkGray) { EmbeddedGestureUI( modifier = Modifier, diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/FastSeekVisualFeedback.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/FastSeekVisualFeedback.kt index cc818377..3c3c34c6 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/FastSeekVisualFeedback.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/FastSeekVisualFeedback.kt @@ -47,7 +47,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import net.newpipe.newplayer.R -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme import net.newpipe.newplayer.ui.videoplayer.INDICATOR_BACKGROUND_COLOR @@ -175,7 +175,7 @@ private fun SeekerIcon(backwards: Boolean, description: String, color: Color) { @Preview(device = "spec:width=1080px,height=600px,dpi=440,orientation=landscape") @Composable private fun FastSeekVisualFeedbackPreviewBackwards() { - VideoPlayerTheme { + VideoPlayerDarkTheme { Surface(modifier = Modifier.wrapContentSize(), color = Color.Gray) { FastSeekVisualFeedback(seconds = 10, backwards = true) } @@ -185,7 +185,7 @@ private fun FastSeekVisualFeedbackPreviewBackwards() { @Preview(device = "spec:width=1080px,height=600px,dpi=440,orientation=landscape") @Composable private fun FastSeekVisualFeedbackPreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { Surface(modifier = Modifier.wrapContentSize(), color = Color.Gray) { FastSeekVisualFeedback(seconds = 10, backwards = false) } diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/FullscreenGestureUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/FullscreenGestureUI.kt index c6fe2e52..6e088bde 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/FullscreenGestureUI.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/FullscreenGestureUI.kt @@ -52,7 +52,7 @@ import net.newpipe.newplayer.uiModel.UIModeState import net.newpipe.newplayer.uiModel.NewPlayerUIState import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme import net.newpipe.newplayer.ui.common.getDefaultBrightness import net.newpipe.newplayer.ui.common.getEmbeddedUiConfig @@ -253,7 +253,7 @@ internal fun IndicatorAnimation(modifier: Modifier, visible: Boolean, content: @ @Preview(device = "spec:width=1080px,height=600px,dpi=440,orientation=landscape") @Composable private fun FullscreenGestureUIPreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { Surface(modifier = Modifier.wrapContentSize(), color = Color.DarkGray) { FullscreenGestureUI( modifier = Modifier, object : NewPlayerViewModelDummy() { @@ -289,7 +289,7 @@ private fun FullscreenGestureUIPreviewInteractive() { mutableStateOf(false) } - VideoPlayerTheme { + VideoPlayerDarkTheme { Surface(modifier = Modifier.wrapContentSize(), color = Color.Gray) { FullscreenGestureUI( modifier = Modifier, diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/VolumeCircle.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/VolumeCircle.kt index eefca452..be59e8df 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/VolumeCircle.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/VolumeCircle.kt @@ -46,7 +46,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import net.newpipe.newplayer.R -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme +import net.newpipe.newplayer.ui.theme.VideoPlayerDarkTheme import net.newpipe.newplayer.ui.videoplayer.INDICATOR_BACKGROUND_COLOR private const val TAG = "VolumeCircle" @@ -113,7 +113,7 @@ private fun getBrightnessIcon(volumeFraction: Float) = @Preview(device = "spec:width=1080px,height=600px,dpi=440,orientation=landscape") @Composable private fun VolumeCirclePreview() { - VideoPlayerTheme { + VideoPlayerDarkTheme { Surface(color = Color.White) { VolumeCircle(volumeFraction = 0.3f, isBrightness = false) } diff --git a/new-player/src/main/java/net/newpipe/newplayer/uiModel/UIModeState.kt b/new-player/src/main/java/net/newpipe/newplayer/uiModel/UIModeState.kt index 52c9d812..b41933dc 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/uiModel/UIModeState.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/uiModel/UIModeState.kt @@ -74,10 +74,17 @@ enum class UIModeState { AUDIO_CHAPTER_SELECT -> true AUDIO_STREAM_SELECT -> true PIP -> true - PLACEHOLDER -> false - EMBEDDED_VIDEO -> false - EMBEDDED_VIDEO_CONTROLLER_UI -> false - EMBEDDED_AUDIO -> false + else -> false + } + + val forceSysUiDarkThemeMode : Boolean + get() = + when (this) { + FULLSCREEN_VIDEO -> true + FULLSCREEN_VIDEO_CONTROLLER_UI -> true + FULLSCREEN_VIDEO_CHAPTER_SELECT -> true + FULLSCREEN_VIDEO_STREAM_SELECT -> true + else -> false } val videoControllerUiVisible: Boolean diff --git a/test-app/src/main/java/net/newpipe/newplayer/testapp/MainActivity.kt b/test-app/src/main/java/net/newpipe/newplayer/testapp/MainActivity.kt index 39caf9fe..49e62559 100644 --- a/test-app/src/main/java/net/newpipe/newplayer/testapp/MainActivity.kt +++ b/test-app/src/main/java/net/newpipe/newplayer/testapp/MainActivity.kt @@ -131,14 +131,14 @@ class MainActivity : AppCompatActivity() { removeSystemInsets() binding.embeddedPlayer.viewModel = null binding.fullscreenPlayer.viewModel = newPlayerViewModel - binding.buttonsLayout?.visibility = View.GONE + binding.buttonsLayout!!.visibility = View.GONE binding.embeddedPlayerLayout.visibility = View.GONE binding.fullscreenPlayer.visibility = View.VISIBLE } else { addSystemInsets() binding.fullscreenPlayer.viewModel = null binding.embeddedPlayer.viewModel = newPlayerViewModel - binding.buttonsLayout?.visibility = View.VISIBLE + binding.buttonsLayout!!.visibility = View.VISIBLE binding.embeddedPlayerLayout.visibility = View.VISIBLE binding.fullscreenPlayer.visibility = View.GONE }