Skip to content

Commit 9679e5d

Browse files
committed
fix(player): disable pre-play version dialog for movies; fix version picker overlay positioning in player
1 parent f40c1c3 commit 9679e5d

4 files changed

Lines changed: 69 additions & 59 deletions

File tree

app/src/main/java/com/makd/afinity/ui/item/ItemDetailScreen.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ fun ItemDetailScreen(
140140
val remoteSources = item.sources.filter {
141141
it.type == com.makd.afinity.data.models.media.AfinitySourceType.REMOTE
142142
}
143-
if (remoteSources.size > 1) {
143+
if (remoteSources.size > 1 && item !is AfinityMovie) {
144144
pendingPlayItem = item
145145
pendingPlaySelection = selection
146146
showVersionPickerForPlay = true

app/src/main/java/com/makd/afinity/ui/player/PlayerScreen.kt

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@ import android.graphics.Typeface
44
import androidx.activity.compose.BackHandler
55
import androidx.annotation.OptIn
66
import androidx.compose.foundation.background
7+
import androidx.compose.foundation.clickable
8+
import androidx.compose.foundation.interaction.MutableInteractionSource
79
import androidx.compose.foundation.isSystemInDarkTheme
810
import androidx.compose.foundation.layout.Box
911
import androidx.compose.foundation.layout.fillMaxSize
12+
import androidx.compose.foundation.layout.padding
1013
import androidx.compose.runtime.Composable
1114
import androidx.compose.runtime.DisposableEffect
1215
import androidx.compose.runtime.LaunchedEffect
@@ -20,6 +23,7 @@ import androidx.compose.runtime.setValue
2023
import androidx.compose.ui.Alignment
2124
import androidx.compose.ui.Modifier
2225
import androidx.compose.ui.graphics.Color
26+
import androidx.compose.ui.unit.dp
2327
import androidx.compose.ui.viewinterop.AndroidView
2428
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
2529
import androidx.lifecycle.compose.LocalLifecycleOwner
@@ -43,6 +47,7 @@ import com.makd.afinity.ui.player.components.MpvSurface
4347
import com.makd.afinity.ui.player.components.PlayerControls
4448
import com.makd.afinity.ui.player.components.PlayerIndicators
4549
import com.makd.afinity.ui.player.components.TrickplayPreview
50+
import com.makd.afinity.ui.player.components.VersionPickerSheet
4651
import com.makd.afinity.ui.player.utils.KeepScreenOn
4752
import com.makd.afinity.ui.player.utils.PlayerSystemBarsController
4853
import com.makd.afinity.ui.player.utils.ScreenBrightnessController
@@ -85,6 +90,7 @@ fun PlayerScreen(
8590
var seekOriginTime by remember { mutableLongStateOf(0L) }
8691
var dragStartVolume by remember { mutableIntStateOf(-1) }
8792
var dragStartBrightness by remember { mutableFloatStateOf(-1f) }
93+
var showVersionPicker by remember { mutableStateOf(false) }
8894
LocalLifecycleOwner.current
8995

9096
LaunchedEffect(item.id, mediaSourceId, isLiveChannel, liveStreamUrl) {
@@ -292,6 +298,7 @@ fun PlayerScreen(
292298
playlistQueue = playlistState.queue,
293299
currentPlaylistIndex = playlistState.currentIndex,
294300
onJumpToEpisode = viewModel::jumpToEpisode,
301+
onVersionToggleRequest = { showVersionPicker = !showVersionPicker },
295302
)
296303

297304
TrickplayPreview(
@@ -321,6 +328,37 @@ fun PlayerScreen(
321328
},
322329
modifier = Modifier.align(Alignment.Center),
323330
)
331+
332+
// Version picker — rendered here so align(BottomEnd) maps to the actual screen Box
333+
if (showVersionPicker && uiState.availableSources.size > 1) {
334+
Box(
335+
modifier =
336+
Modifier.fillMaxSize().clickable(
337+
interactionSource = remember { MutableInteractionSource() },
338+
indication = null,
339+
) { showVersionPicker = false }
340+
) {
341+
Box(
342+
modifier =
343+
Modifier.align(Alignment.BottomEnd)
344+
.padding(bottom = 110.dp, end = 56.dp)
345+
.clickable(
346+
interactionSource = remember { MutableInteractionSource() },
347+
indication = null,
348+
) { /* consume */ }
349+
) {
350+
VersionPickerSheet(
351+
sources = uiState.availableSources,
352+
currentSourceId = uiState.currentMediaSourceId,
353+
onVersionSelected = { source ->
354+
viewModel.handlePlayerEvent(PlayerEvent.SwitchVersion(source.id))
355+
showVersionPicker = false
356+
},
357+
onDismiss = { showVersionPicker = false },
358+
)
359+
}
360+
}
361+
}
324362
}
325363
}
326364

app/src/main/java/com/makd/afinity/ui/player/components/PlayerControls.kt

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -103,12 +103,12 @@ fun PlayerControls(
103103
playlistQueue: List<com.makd.afinity.data.models.media.AfinityItem> = emptyList(),
104104
currentPlaylistIndex: Int = -1,
105105
onJumpToEpisode: (java.util.UUID) -> Unit = {},
106+
onVersionToggleRequest: () -> Unit = {},
106107
) {
107108
var showAudioSelector by remember { mutableStateOf(false) }
108109
var showSubtitleSelector by remember { mutableStateOf(false) }
109110
var showSpeedDialog by remember { mutableStateOf(false) }
110111
var showEpisodeSwitcher by remember { mutableStateOf(false) }
111-
var showVersionSelector by remember { mutableStateOf(false) }
112112

113113
val currentItem = uiState.currentItem
114114

@@ -331,7 +331,7 @@ fun PlayerControls(
331331
onEpisodeSwitcherToggle = { showEpisodeSwitcher = !showEpisodeSwitcher },
332332
showEpisodeSwitcherButton =
333333
currentItem is AfinityEpisode && playlistQueue.size > 1,
334-
onVersionToggle = { showVersionSelector = !showVersionSelector },
334+
onVersionToggle = onVersionToggleRequest,
335335
showVersionButton = uiState.availableSources.size > 1,
336336
modifier = Modifier.align(Alignment.BottomCenter),
337337
)
@@ -587,27 +587,7 @@ fun PlayerControls(
587587
)
588588
}
589589

590-
if (showVersionSelector && uiState.availableSources.size > 1) {
591-
Box(
592-
modifier =
593-
Modifier.fillMaxSize().clickable(
594-
interactionSource = remember { MutableInteractionSource() },
595-
indication = null,
596-
) {
597-
showVersionSelector = false
598-
}
599-
) {
600-
VersionPickerSheet(
601-
sources = uiState.availableSources,
602-
currentSourceId = uiState.currentMediaSourceId,
603-
onVersionSelected = { source ->
604-
onPlayerEvent(PlayerEvent.SwitchVersion(source.id))
605-
showVersionSelector = false
606-
},
607-
onDismiss = { showVersionSelector = false },
608-
)
609-
}
610-
}
590+
611591
}
612592

613593
@OptIn(UnstableApi::class)

app/src/main/java/com/makd/afinity/ui/player/components/VersionPickerSheet.kt

Lines changed: 27 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,16 @@ import androidx.compose.foundation.clickable
55
import androidx.compose.foundation.layout.Arrangement
66
import androidx.compose.foundation.layout.Box
77
import androidx.compose.foundation.layout.Column
8-
import androidx.compose.foundation.layout.PaddingValues
98
import androidx.compose.foundation.layout.Row
109
import androidx.compose.foundation.layout.Spacer
11-
import androidx.compose.foundation.layout.WindowInsets
1210
import androidx.compose.foundation.layout.fillMaxWidth
11+
import androidx.compose.foundation.layout.heightIn
1312
import androidx.compose.foundation.layout.padding
1413
import androidx.compose.foundation.layout.size
1514
import androidx.compose.foundation.layout.width
16-
import androidx.compose.foundation.lazy.LazyColumn
17-
import androidx.compose.foundation.lazy.items
15+
import androidx.compose.foundation.rememberScrollState
1816
import androidx.compose.foundation.shape.RoundedCornerShape
17+
import androidx.compose.foundation.verticalScroll
1918
import androidx.compose.material3.Icon
2019
import androidx.compose.material3.MaterialTheme
2120
import androidx.compose.material3.Text
@@ -47,40 +46,33 @@ fun VersionPickerSheet(
4746
) {
4847
Box(
4948
modifier =
50-
Modifier.fillMaxWidth().padding(bottom = 110.dp, end = 56.dp),
51-
contentAlignment = Alignment.BottomEnd,
49+
Modifier
50+
.clickable(onClick = {}) // consume — do not propagate
51+
.background(Color.Black.copy(alpha = 0.95f), RoundedCornerShape(8.dp))
52+
.padding(12.dp)
53+
.width(240.dp)
54+
.heightIn(max = 180.dp),
5255
) {
53-
Box(
54-
modifier =
55-
Modifier
56-
.clickable(onClick = {}) // consume — do not propagate
57-
.background(Color.Black.copy(alpha = 0.95f), RoundedCornerShape(8.dp))
58-
.padding(12.dp)
59-
.width(240.dp),
56+
Column(
57+
modifier = Modifier.verticalScroll(rememberScrollState()),
58+
verticalArrangement = Arrangement.spacedBy(4.dp),
6059
) {
61-
Column(verticalArrangement = Arrangement.spacedBy(2.dp)) {
62-
Text(
63-
text = stringResource(R.string.player_version_title),
64-
style = MaterialTheme.typography.titleSmall,
65-
color = Color.White,
66-
modifier = Modifier.padding(bottom = 6.dp),
60+
Text(
61+
text = stringResource(R.string.player_version_title),
62+
style = MaterialTheme.typography.titleSmall,
63+
color = Color.White,
64+
modifier = Modifier.padding(bottom = 4.dp),
65+
)
66+
sources.forEach { source ->
67+
val isSelected = source.id == currentSourceId
68+
VersionItem(
69+
source = source,
70+
isSelected = isSelected,
71+
onClick = {
72+
onVersionSelected(source)
73+
onDismiss()
74+
},
6775
)
68-
LazyColumn(
69-
contentPadding = PaddingValues(bottom = 4.dp),
70-
verticalArrangement = Arrangement.spacedBy(4.dp),
71-
) {
72-
items(sources, key = { it.id }) { source ->
73-
val isSelected = source.id == currentSourceId
74-
VersionItem(
75-
source = source,
76-
isSelected = isSelected,
77-
onClick = {
78-
onVersionSelected(source)
79-
onDismiss()
80-
},
81-
)
82-
}
83-
}
8476
}
8577
}
8678
}

0 commit comments

Comments
 (0)