@@ -9,15 +9,9 @@ import androidx.compose.foundation.clickable
99import androidx.compose.foundation.focusable
1010import androidx.compose.foundation.interaction.MutableInteractionSource
1111import androidx.compose.foundation.layout.*
12- import androidx.compose.material.CircularProgressIndicator
13- import androidx.compose.material.Icon
14- import androidx.compose.material.IconButton
15- import androidx.compose.material.MaterialTheme
12+ import androidx.compose.material.*
1613import androidx.compose.material.icons.Icons
17- import androidx.compose.material.icons.filled.FastForward
18- import androidx.compose.material.icons.filled.FastRewind
19- import androidx.compose.material.icons.filled.Pause
20- import androidx.compose.material.icons.filled.PlayArrow
14+ import androidx.compose.material.icons.filled.*
2115import androidx.compose.runtime.*
2216import androidx.compose.ui.Alignment
2317import androidx.compose.ui.Modifier
@@ -28,6 +22,7 @@ import androidx.compose.ui.geometry.Offset
2822import androidx.compose.ui.graphics.Brush
2923import androidx.compose.ui.graphics.StrokeCap
3024import androidx.compose.ui.unit.dp
25+ import dev.silenium.multimedia.compose.util.LocalFullscreenProvider
3126import dev.silenium.multimedia.compose.util.deferredFlowStateOf
3227import dev.silenium.multimedia.core.annotation.InternalMultimediaApi
3328import kotlinx.coroutines.launch
@@ -47,6 +42,9 @@ fun VideoSurfaceControls(
4742 val loading by player.property<Boolean >(" seeking" )
4843 val backgroundColor = MaterialTheme .colors.surface
4944 val focus = remember(focusRequester) { focusRequester ? : FocusRequester () }
45+ var menuOpen by remember { mutableStateOf(false ) }
46+ val fullscreenProvider = LocalFullscreenProvider .current
47+
5048 Box (modifier = modifier) {
5149 StateIndicatorIcon (player, Modifier .align(Alignment .Center ))
5250 if (loading != false ) {
@@ -149,6 +147,52 @@ fun VideoSurfaceControls(
149147 }
150148 VolumeSlider (player, coroutineScope)
151149 Spacer (modifier = Modifier .weight(1f ))
150+ Box (modifier = Modifier .padding(horizontal = 4 .dp)) {
151+ IconButton (
152+ onClick = { menuOpen = ! menuOpen },
153+ ) {
154+ Icon (
155+ Icons .Default .Settings ,
156+ contentDescription = " Menu" ,
157+ tint = MaterialTheme .colors.onSurface,
158+ )
159+ }
160+ DropdownMenu (menuOpen, onDismissRequest = { menuOpen = false }) {
161+ DropdownMenuItem (onClick = { player.config.pixelPerfect = ! player.config.pixelPerfect }) {
162+ Checkbox (
163+ player.config.pixelPerfect,
164+ onCheckedChange = {
165+ player.config.pixelPerfect = it
166+ },
167+ )
168+ Text (" Pixel-Perfect Rendering" )
169+ }
170+ }
171+ }
172+ IconButton (
173+ onClick = {
174+ fullscreenProvider.toggleFullscreen()
175+ },
176+ modifier = Modifier .padding(horizontal = 4 .dp),
177+ ) {
178+ AnimatedContent (fullscreenProvider.isFullscreen, transitionSpec = {
179+ ContentTransform (fadeIn(), fadeOut())
180+ }) { it ->
181+ if (it) {
182+ Icon (
183+ Icons .Default .FullscreenExit ,
184+ contentDescription = " Exit Fullscreen" ,
185+ tint = MaterialTheme .colors.onSurface
186+ )
187+ } else {
188+ Icon (
189+ Icons .Default .Fullscreen ,
190+ contentDescription = " Enter Fullscreen" ,
191+ tint = MaterialTheme .colors.onSurface
192+ )
193+ }
194+ }
195+ }
152196 }
153197 }
154198 }
0 commit comments