@@ -9,15 +9,9 @@ import androidx.compose.foundation.clickable
9
9
import androidx.compose.foundation.focusable
10
10
import androidx.compose.foundation.interaction.MutableInteractionSource
11
11
import 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.*
16
13
import 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.*
21
15
import androidx.compose.runtime.*
22
16
import androidx.compose.ui.Alignment
23
17
import androidx.compose.ui.Modifier
@@ -28,6 +22,7 @@ import androidx.compose.ui.geometry.Offset
28
22
import androidx.compose.ui.graphics.Brush
29
23
import androidx.compose.ui.graphics.StrokeCap
30
24
import androidx.compose.ui.unit.dp
25
+ import dev.silenium.multimedia.compose.util.LocalFullscreenProvider
31
26
import dev.silenium.multimedia.compose.util.deferredFlowStateOf
32
27
import dev.silenium.multimedia.core.annotation.InternalMultimediaApi
33
28
import kotlinx.coroutines.launch
@@ -47,6 +42,9 @@ fun VideoSurfaceControls(
47
42
val loading by player.property<Boolean >(" seeking" )
48
43
val backgroundColor = MaterialTheme .colors.surface
49
44
val focus = remember(focusRequester) { focusRequester ? : FocusRequester () }
45
+ var menuOpen by remember { mutableStateOf(false ) }
46
+ val fullscreenProvider = LocalFullscreenProvider .current
47
+
50
48
Box (modifier = modifier) {
51
49
StateIndicatorIcon (player, Modifier .align(Alignment .Center ))
52
50
if (loading != false ) {
@@ -149,6 +147,52 @@ fun VideoSurfaceControls(
149
147
}
150
148
VolumeSlider (player, coroutineScope)
151
149
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
+ }
152
196
}
153
197
}
154
198
}
0 commit comments