[update] Fullscreen mode

This commit is contained in:
acite
2025-09-27 19:04:27 +08:00
parent dcef25a526
commit e6b69ef14a
4 changed files with 84 additions and 9 deletions

View File

@@ -26,6 +26,7 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.VolumeUp
import androidx.compose.material.icons.filled.Brightness4
import androidx.compose.material.icons.filled.FastForward
import androidx.compose.material.icons.filled.Fullscreen
import androidx.compose.material.icons.filled.Pause
import androidx.compose.material.icons.filled.PlayArrow
import androidx.compose.material3.Icon
@@ -397,6 +398,22 @@ fun PortalCorePlayer(modifier: Modifier, videoPlayerViewModel: VideoPlayerViewMo
.align(Alignment.CenterVertically)
.padding(start = 12.dp)
)
IconButton(
onClick = {
videoPlayerViewModel.isLandscape = true
},
Modifier
.size(36.dp)
.align(Alignment.CenterVertically)
) {
Icon(
Icons.Default.Fullscreen,
contentDescription = "FullScreen",
tint = Color.White,
modifier = Modifier.size(32.dp)
)
}
}
}

View File

@@ -2,6 +2,7 @@ package com.acitelight.aether.view
import android.app.Activity
import android.content.Context
import android.content.pm.ActivityInfo
import android.content.res.Configuration
import android.media.AudioManager
import android.view.View
@@ -71,6 +72,7 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.SliderDefaults
import androidx.compose.material3.Tab
import androidx.compose.material3.TabRow
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.mutableStateOf
@@ -136,23 +138,32 @@ fun moveBrit(db: Float, activity: Activity, videoPlayerViewModel: VideoPlayerVie
activity.window.attributes = attr
}
@Composable
fun isLandscape(): Boolean {
val configuration = LocalConfiguration.current
return configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
}
@Composable
fun VideoPlayer(
videoPlayerViewModel: VideoPlayerViewModel = hiltViewModel<VideoPlayerViewModel>(),
videoId: String,
navController: NavHostController
) {
val context = LocalContext.current
val activity = (context as? Activity)!!
DisposableEffect(Unit) {
onDispose {
activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
}
}
val colorScheme = MaterialTheme.colorScheme
videoPlayerViewModel.init(videoId)
activity.requestedOrientation =
if(videoPlayerViewModel.isLandscape)
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
else
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
if (videoPlayerViewModel.startPlaying) {
if (isLandscape()) {
if (videoPlayerViewModel.isLandscape) {
Box {
VideoPlayerLandscape(videoPlayerViewModel)
AnimatedVisibility(

View File

@@ -4,6 +4,7 @@ import android.app.Activity
import android.content.Context
import android.media.AudioManager
import android.view.View
import androidx.activity.compose.BackHandler
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
@@ -16,6 +17,7 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
@@ -24,9 +26,14 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.automirrored.filled.VolumeUp
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.ArrowBackIosNew
import androidx.compose.material.icons.filled.Brightness4
import androidx.compose.material.icons.filled.FastForward
import androidx.compose.material.icons.filled.Fullscreen
import androidx.compose.material.icons.filled.FullscreenExit
import androidx.compose.material.icons.filled.Pause
import androidx.compose.material.icons.filled.PlayArrow
import androidx.compose.material3.Icon
@@ -80,6 +87,10 @@ fun VideoPlayerLandscape(videoPlayerViewModel: VideoPlayerViewModel) {
)
}
BackHandler {
videoPlayerViewModel.isLandscape = false
}
ToggleFullScreen(true)
Box(Modifier.fillMaxSize())
{
@@ -343,11 +354,28 @@ fun VideoPlayerLandscape(videoPlayerViewModel: VideoPlayerViewModel) {
)
)
{
IconButton(
onClick = {
videoPlayerViewModel.isLandscape = false
},
Modifier
.padding(top = 12.dp)
.padding(start = 46.dp)
.size(36.dp)
.align(Alignment.CenterVertically)
) {
Icon(
Icons.AutoMirrored.Filled.ArrowBack,
contentDescription = "Back",
tint = Color.White,
modifier = Modifier.size(32.dp)
)
}
Text(
text = name,
fontWeight = FontWeight.Bold,
modifier = Modifier
.padding(horizontal = 46.dp).padding(top = 12.dp)
modifier = Modifier.padding(top = 12.dp)
.align(Alignment.CenterVertically),
fontSize = 18.sp
)
@@ -418,6 +446,24 @@ fun VideoPlayerLandscape(videoPlayerViewModel: VideoPlayerViewModel) {
modifier = Modifier.size(42.dp)
)
}
Spacer(Modifier.weight(1f))
IconButton(
onClick = {
videoPlayerViewModel.isLandscape = false
},
Modifier
.size(36.dp)
.align(Alignment.CenterVertically)
) {
Icon(
Icons.Default.FullscreenExit,
contentDescription = "Exit FullScreen",
tint = Color.White,
modifier = Modifier.size(32.dp)
)
}
}
}
}

View File

@@ -60,6 +60,7 @@ class VideoPlayerViewModel @Inject constructor(
val recentManager: RecentManager,
val videoLibrary: VideoLibrary,
) : ViewModel() {
var isLandscape by mutableStateOf(false)
var tabIndex by mutableIntStateOf(0)
var isPlaying by mutableStateOf(true)
var playProcess by mutableFloatStateOf(0.0f)