From 1fde8569ce988087e28fb40cb2685edec80bd642 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Fri, 9 Aug 2024 11:37:45 +0200 Subject: [PATCH] make brightnes change work --- .../newplayer/model/VideoPlayerUIState.kt | 4 +-- .../newplayer/model/VideoPlayerViewModel.kt | 2 +- .../model/VideoPlayerViewModelImpl.kt | 21 ++++++++++----- .../newplayer/ui/VideoPlayerControllerUI.kt | 22 ++++++++++------ .../net/newpipe/newplayer/ui/VideoPlayerUI.kt | 23 +++++++++++++--- .../net/newpipe/newplayer/ui/theme/Color.kt | 2 +- .../newplayer/ui/videoplayer/GestureUI.kt | 26 ++----------------- .../gesture_ui/FullscreenGestureUI.kt | 4 +-- .../ui/videoplayer/gesture_ui/VolumeCircle.kt | 11 +++----- .../java/net/newpipe/newplayer/utils/utils.kt | 9 +++---- 10 files changed, 63 insertions(+), 61 deletions(-) diff --git a/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerUIState.kt b/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerUIState.kt index d215aad..f788d7b 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerUIState.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerUIState.kt @@ -42,7 +42,7 @@ data class VideoPlayerUIState( val soundVolume: Float, // when null use system value - val brightnes: Float? + val brightness: Float? ) : Parcelable { companion object { val DEFAULT = VideoPlayerUIState( @@ -60,7 +60,7 @@ data class VideoPlayerUIState( playbackPositionInMs = 0, fastseekSeconds = 0, soundVolume = 0f, - brightnes = null + brightness = null ) } } \ No newline at end of file diff --git a/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModel.kt b/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModel.kt index 79081bf..9d5f5a6 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModel.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModel.kt @@ -50,7 +50,7 @@ interface VideoPlayerViewModel { fun embeddedDraggedDown(offset: Float) fun fastSeek(count: Int) fun finishFastSeek() - fun brightnesChange(changeRate: Float, currentValue: Float) + fun brightnessChange(changeRate: Float, systemBrightness: Float) fun volumeChange(changeRate: Float) interface Listener { diff --git a/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModelImpl.kt b/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModelImpl.kt index a4b6793..2e943f0 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModelImpl.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModelImpl.kt @@ -21,13 +21,11 @@ package net.newpipe.newplayer.model import android.app.Application -import android.content.Context.AUDIO_SERVICE import android.media.AudioManager import android.os.Build import android.os.Bundle import android.util.Log import androidx.annotation.RequiresApi -import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat.getSystemService import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.SavedStateHandle @@ -44,7 +42,6 @@ import kotlinx.coroutines.launch import net.newpipe.newplayer.utils.VideoSize import net.newpipe.newplayer.NewPlayer import net.newpipe.newplayer.ui.ContentScale -import kotlin.math.max val VIDEOPLAYER_UI_STATE = "video_player_ui_state" @@ -303,8 +300,20 @@ class VideoPlayerViewModelImpl @Inject constructor( } } - override fun brightnesChange(changeRate: Float, currentValue: Float) { - TODO("Not yet implemented") + override fun brightnessChange(changeRate: Float, systemBrightness: Float) { + if (mutableUiState.value.fullscreen) { + val currentBrightness = mutableUiState.value.brightness + ?: if (systemBrightness < 0f) 0.5f else systemBrightness + Log.d( + TAG, + "currentBrightnes: $currentBrightness, sytemBrightness: $systemBrightness, changeRate: $changeRate" + ) + + val newBrightness = (currentBrightness + changeRate).coerceIn(0f, 1f) + mutableUiState.update { + it.copy(brightness = newBrightness) + } + } } override fun volumeChange(changeRate: Float) { @@ -406,7 +415,7 @@ class VideoPlayerViewModelImpl @Inject constructor( println("dummy impl") } - override fun brightnesChange(changeRate: Float, currentValue: Float) { + override fun brightnessChange(changeRate: Float, currentValue: Float) { println("dummy impl") } diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/VideoPlayerControllerUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/VideoPlayerControllerUI.kt index ba44dd9..a3726df 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/VideoPlayerControllerUI.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/VideoPlayerControllerUI.kt @@ -21,6 +21,7 @@ package net.newpipe.newplayer.ui +import android.app.Activity import androidx.activity.compose.BackHandler import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.layout.Box @@ -44,6 +45,7 @@ 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.platform.LocalContext import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import net.newpipe.newplayer.ui.theme.VideoPlayerTheme @@ -51,6 +53,7 @@ import net.newpipe.newplayer.ui.videoplayer.BottomUI import net.newpipe.newplayer.ui.videoplayer.CenterUI import net.newpipe.newplayer.ui.videoplayer.TopUI import net.newpipe.newplayer.ui.videoplayer.GestureUI +import net.newpipe.newplayer.utils.getScreenBrightnes @Composable fun VideoPlayerControllerUI( @@ -78,18 +81,21 @@ fun VideoPlayerControllerUI( embeddedDraggedDownBy: (Float) -> Unit, fastSeek: (Int) -> Unit, finishFastSeek: () -> Unit, - brightnesChange: (Float, Float) -> Unit, + brightnessChange: (Float, Float) -> Unit, volumeChange: (Float) -> Unit ) { + val context = LocalContext.current + if (fullscreen) { BackHandler { switchToEmbeddedView() } } - val internalBrightnesChange = { rateChange: Float -> - + val internalBrightnessChange = { rateChange: Float -> + val systemBrightness = getScreenBrightnes(context as Activity) + brightnessChange(rateChange, systemBrightness) } val insets = @@ -114,7 +120,7 @@ fun VideoPlayerControllerUI( embeddedDraggedDownBy = embeddedDraggedDownBy, fastSeek = fastSeek, fastSeekFinished = finishFastSeek, - brightnesChange = internalBrightnesChange, + brightnessChange = internalBrightnessChange, volumeChange = volumeChange ) } @@ -155,7 +161,7 @@ fun VideoPlayerControllerUI( fastSeek = fastSeek, fastSeekFinished = finishFastSeek, volumeChange = volumeChange, - brightnesChange = internalBrightnesChange + brightnessChange = internalBrightnessChange ) Box(modifier = Modifier.fillMaxSize()) { @@ -254,7 +260,7 @@ fun VideoPlayerControllerUIPreviewEmbedded() { embeddedDraggedDownBy = {}, fastSeek = {}, finishFastSeek = {}, - internalBrightnesChange = { a, b ->}, + brightnessChange = { a, b ->}, volumeChange = {}) } } @@ -289,7 +295,7 @@ fun VideoPlayerControllerUIPreviewLandscape() { embeddedDraggedDownBy = {}, fastSeek = {}, finishFastSeek = {}, - internalBrightnesChange = { a, b -> }, + brightnessChange = { a, b -> }, volumeChange = {}) } } @@ -325,7 +331,7 @@ fun VideoPlayerControllerUIPreviewPortrait() { embeddedDraggedDownBy = {}, fastSeek = {}, finishFastSeek = {}, - internalBrightnesChange = { a, b -> }, + brightnessChange = { a, b -> }, volumeChange = {}) } } diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/VideoPlayerUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/VideoPlayerUI.kt index f043959..1564200 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/VideoPlayerUI.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/VideoPlayerUI.kt @@ -22,6 +22,7 @@ package net.newpipe.newplayer.ui import android.app.Activity import android.content.pm.ActivityInfo +import android.util.Log import android.view.SurfaceView import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.aspectRatio @@ -55,6 +56,10 @@ import net.newpipe.newplayer.model.VideoPlayerViewModel import net.newpipe.newplayer.model.VideoPlayerViewModelImpl import net.newpipe.newplayer.ui.theme.VideoPlayerTheme import net.newpipe.newplayer.utils.LockScreenOrientation +import net.newpipe.newplayer.utils.getScreenBrightnes +import net.newpipe.newplayer.utils.setScreenBrightnes + +private const val TAG = "VideoPlayerUI" @Composable fun VideoPlayerUI( @@ -90,7 +95,7 @@ fun VideoPlayerUI( } // Setup immersive mode - if (uiState.fullscreen && ! uiState.uiVissible) { + if (uiState.fullscreen && !uiState.uiVissible) { LaunchedEffect(key1 = true) { windowInsetsController.hide(WindowInsetsCompat.Type.systemBars()) } @@ -125,6 +130,16 @@ fun VideoPlayerUI( val screenRatio = displayMetrics.widthPixels.toFloat() / displayMetrics.heightPixels.toFloat() + val systemScreenBrightnes = getScreenBrightnes(activity) + + LaunchedEffect(key1 = uiState.brightness) { + Log.d(TAG, "New Brightnes: ${uiState.brightness}") + setScreenBrightnes( + uiState.brightness + ?: if (systemScreenBrightnes < 0f) 0.5f else systemScreenBrightnes, activity + ) + } + // Set UI Surface( modifier = Modifier.then( @@ -143,6 +158,7 @@ fun VideoPlayerUI( contentRatio = uiState.contentRatio ) } + VideoPlayerControllerUI( isPlaying = uiState.playing, fullscreen = uiState.fullscreen, @@ -153,7 +169,8 @@ fun VideoPlayerUI( playbackPositionInMs = uiState.playbackPositionInMs, bufferedPercentage = uiState.bufferedPercentage, fastSeekSeconds = uiState.fastseekSeconds, - brightnes = uiState.brightnes, + brightnes = uiState.brightness + ?: if (systemScreenBrightnes < 0f) 0.5f else systemScreenBrightnes, soundVolume = uiState.soundVolume, play = viewModel::play, pause = viewModel::pause, @@ -169,7 +186,7 @@ fun VideoPlayerUI( fastSeek = viewModel::fastSeek, finishFastSeek = viewModel::finishFastSeek, volumeChange = viewModel::volumeChange, - internalBrightnesChange = viewModel::brightnesChange + brightnessChange = viewModel::brightnessChange ) } } 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 index cebfc28..0f657aa 100644 --- 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 @@ -96,7 +96,7 @@ fun VideoPlayerControllerUIPreviewEmbeddedColorPreview() { embeddedDraggedDownBy = {}, fastSeek = {}, finishFastSeek = {}, - internalBrightnesChange = {}, + brightnessChange = {a, b ->}, volumeChange = {}) } } diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/GestureUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/GestureUI.kt index 756790d..ae28777 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/GestureUI.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/GestureUI.kt @@ -20,32 +20,10 @@ package net.newpipe.newplayer.ui.videoplayer -import android.util.Log -import androidx.compose.animation.AnimatedVisibility -import androidx.compose.animation.core.tween -import androidx.compose.animation.fadeIn -import androidx.compose.animation.fadeOut -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.wrapContentSize -import androidx.compose.material3.Surface import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.tooling.preview.Preview -import net.newpipe.newplayer.ui.theme.VideoPlayerTheme import net.newpipe.newplayer.ui.videoplayer.gesture_ui.EmbeddedGestureUI -import net.newpipe.newplayer.ui.videoplayer.gesture_ui.FastSeekVisualFeedback import net.newpipe.newplayer.ui.videoplayer.gesture_ui.FullscreenGestureUI -import net.newpipe.newplayer.ui.videoplayer.gesture_ui.FullscreenGestureUIPreview -import net.newpipe.newplayer.ui.videoplayer.gesture_ui.TouchSurface -import net.newpipe.newplayer.ui.videoplayer.gesture_ui.TouchedPosition private const val TAG = "TouchUi" @@ -72,7 +50,7 @@ fun GestureUI( fastSeek: (Int) -> Unit, fastSeekFinished: () -> Unit, volumeChange: (Float) -> Unit, - brightnesChange: (Float) -> Unit, + brightnessChange: (Float) -> Unit, ) { val defaultOnRegularTap = { if (uiVissible) { @@ -94,7 +72,7 @@ fun GestureUI( switchToEmbeddedView = switchToEmbeddedView, fastSeekFinished = fastSeekFinished, volumeChange = volumeChange, - brightnesChange = brightnesChange) + brightnesChange = brightnessChange) } else { EmbeddedGestureUI( fastSeekSeconds = fastSeekSeconds, 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 173cb04..fb505ec 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 @@ -23,8 +23,6 @@ package net.newpipe.newplayer.ui.videoplayer.gesture_ui 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.scaleIn import androidx.compose.animation.scaleOut import androidx.compose.foundation.layout.Box @@ -170,7 +168,7 @@ fun FullscreenGestureUI( VolumeCircle( volumeFraction = brightnes, modifier = Modifier.align(Alignment.Center), - isBrightnes = true + isBrightness = true ) } } 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 6ab1728..7ef46c9 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 @@ -23,9 +23,7 @@ package net.newpipe.newplayer.ui.videoplayer.gesture_ui import android.util.Log import androidx.compose.foundation.Canvas import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.VolumeDown import androidx.compose.material.icons.automirrored.filled.VolumeMute @@ -40,7 +38,6 @@ import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.shadow import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Size import androidx.compose.ui.graphics.Color @@ -60,7 +57,7 @@ private const val CIRCLE_SIZE = 100 fun VolumeCircle( modifier: Modifier = Modifier, volumeFraction: Float, - isBrightnes: Boolean = false + isBrightness: Boolean = false ) { assert(0f <= volumeFraction && volumeFraction <= 1f) { Log.e(TAG, "Volume fraction must be in ragne [0;1]. It was $volumeFraction") @@ -87,10 +84,10 @@ fun VolumeCircle( modifier = Modifier .align(Alignment.Center) .size(60.dp), - imageVector = (if (isBrightnes) getBrightnesIcon(volumeFraction = volumeFraction) + imageVector = (if (isBrightness) getBrightnesIcon(volumeFraction = volumeFraction) else getVolumeIcon(volumeFraction = volumeFraction)), contentDescription = stringResource( - id = if (isBrightnes) R.string.brightness_indicator + id = if (isBrightness) R.string.brightness_indicator else R.string.volume_indicator ) ) @@ -115,7 +112,7 @@ private fun getBrightnesIcon(volumeFraction: Float) = fun VolumeCirclePreview() { VideoPlayerTheme { Surface(color = Color.White) { - VolumeCircle(volumeFraction = 0.3f, isBrightnes = false) + VolumeCircle(volumeFraction = 0.3f, isBrightness = false) } } } \ No newline at end of file diff --git a/new-player/src/main/java/net/newpipe/newplayer/utils/utils.kt b/new-player/src/main/java/net/newpipe/newplayer/utils/utils.kt index 1b9b1ba..e6204b4 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/utils/utils.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/utils/utils.kt @@ -24,6 +24,7 @@ import android.annotation.SuppressLint import android.app.Activity import android.content.Context import android.content.ContextWrapper +import android.view.Window import android.view.WindowManager import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect @@ -44,18 +45,14 @@ fun LockScreenOrientation(orientation: Int) { } @SuppressLint("NewApi") -@Composable -fun getScreenBrightnes() : Float { - val activity = LocalContext.current.findActivity()!! +fun getScreenBrightnes(activity: Activity) : Float { val window = activity.window val layout = window.attributes as WindowManager.LayoutParams return layout.screenBrightness } @SuppressLint("NewApi") -@Composable -fun SetScreenBrightnes(value:Float) { - val activity = LocalContext.current.findActivity()!! +fun setScreenBrightnes(value:Float, activity: Activity) { val window = activity.window val layout = window.attributes as WindowManager.LayoutParams layout.screenBrightness = value