Skip to content

Commit d8f826e

Browse files
authored
Merge pull request #6482 from Bnyro/master
feat: highlight current selection in player options sheets (audio lan…
2 parents a076b4c + 8eac9d8 commit d8f826e

File tree

5 files changed

+56
-29
lines changed

5 files changed

+56
-29
lines changed

app/src/main/java/com/github/libretube/api/obj/Subtitle.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.github.libretube.api.obj
22

3+
import android.content.Context
4+
import com.github.libretube.R
35
import kotlinx.serialization.Serializable
46

57
@Serializable
@@ -9,4 +11,10 @@ data class Subtitle(
911
val name: String? = null,
1012
val code: String? = null,
1113
val autoGenerated: Boolean? = null
12-
)
14+
) {
15+
fun getDisplayName(context: Context) = if (autoGenerated != true) {
16+
name!!
17+
} else {
18+
"$name (${context.getString(R.string.auto_generated)})"
19+
}
20+
}

app/src/main/java/com/github/libretube/obj/BottomSheetItem.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.github.libretube.obj
22

33
data class BottomSheetItem(
4-
val title: String,
4+
var title: String,
55
val drawable: Int? = null,
66
val getCurrent: () -> String? = { null },
77
val onClick: () -> Unit = {}

app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ import com.github.libretube.helpers.IntentHelper
8282
import com.github.libretube.helpers.NavBarHelper
8383
import com.github.libretube.helpers.NavigationHelper
8484
import com.github.libretube.helpers.PlayerHelper
85-
import com.github.libretube.helpers.PlayerHelper.autoPlayEnabled
8685
import com.github.libretube.helpers.PlayerHelper.checkForSegments
8786
import com.github.libretube.helpers.PlayerHelper.getVideoStats
8887
import com.github.libretube.helpers.PlayerHelper.isInSegment
@@ -1404,13 +1403,9 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions {
14041403

14051404
BaseBottomSheet()
14061405
.setSimpleItems(
1407-
subtitles.map {
1408-
if (it.autoGenerated != true) {
1409-
it.name!!
1410-
} else {
1411-
"${it.name} (${getString(R.string.auto_generated)})"
1412-
}
1413-
}
1406+
subtitles.map { it.getDisplayName(requireContext()) },
1407+
preselectedItem = subtitles.firstOrNull { it == viewModel.currentSubtitle }
1408+
?.getDisplayName(requireContext()) ?: getString(R.string.none)
14141409
) { index ->
14151410
val subtitle = subtitles.getOrNull(index) ?: return@setSimpleItems
14161411
updateCurrentSubtitle(subtitle)
@@ -1435,9 +1430,8 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions {
14351430
// Dialog for quality selection
14361431
BaseBottomSheet()
14371432
.setSimpleItems(
1438-
resolutions.map {
1439-
if (currentQuality == it.resolution) "${it.name}" else it.name
1440-
}
1433+
resolutions.map(VideoResolution::name),
1434+
preselectedItem = resolutions.firstOrNull { it.resolution == currentQuality }?.name
14411435
) { which ->
14421436
val newResolution = resolutions[which].resolution
14431437
setPlayerResolution(newResolution, true)
@@ -1463,27 +1457,28 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions {
14631457
}
14641458
val baseBottomSheet = BaseBottomSheet()
14651459

1466-
if (audioLanguagesAndRoleFlags.isEmpty()) {
1467-
baseBottomSheet.setSimpleItems(
1468-
listOf(getString(R.string.unknown_or_no_audio)),
1469-
null
1470-
)
1471-
} else if (audioLanguagesAndRoleFlags.size == 1 &&
1472-
audioLanguagesAndRoleFlags[0].first == null &&
1473-
!PlayerHelper.haveAudioTrackRoleFlagSet(
1474-
audioLanguagesAndRoleFlags[0].second
1475-
)
1460+
if (audioLanguagesAndRoleFlags.isEmpty() || (audioLanguagesAndRoleFlags.size == 1 &&
1461+
audioLanguagesAndRoleFlags[0].first == null &&
1462+
!PlayerHelper.haveAudioTrackRoleFlagSet(
1463+
audioLanguagesAndRoleFlags[0].second
1464+
))
14761465
) {
14771466
// Regardless of audio format or quality, if there is only one audio stream which has
14781467
// no language and no role flags, it should mean that there is only a single audio
14791468
// track which has no language or track type set in the video played
14801469
// Consider it as the default audio track (or unknown)
14811470
baseBottomSheet.setSimpleItems(
14821471
listOf(getString(R.string.default_or_unknown_audio_track)),
1483-
null
1472+
preselectedItem = getString(R.string.default_or_unknown_audio_track),
1473+
listener = null
14841474
)
14851475
} else {
1486-
baseBottomSheet.setSimpleItems(audioLanguages) { index ->
1476+
baseBottomSheet.setSimpleItems(audioLanguages, preselectedItem = audioLanguagesAndRoleFlags.firstOrNull {
1477+
val format = viewModel.player.audioFormat
1478+
format?.language == it.first && format?.roleFlags == it.second
1479+
}?.let {
1480+
PlayerHelper.getAudioTrackNameFromFormat(context, it)
1481+
},) { index ->
14871482
val selectedAudioFormat = audioLanguagesAndRoleFlags[index]
14881483
viewModel.trackSelector.updateParameters {
14891484
setPreferredAudioLanguage(selectedAudioFormat.first)

app/src/main/java/com/github/libretube/ui/sheets/BaseBottomSheet.kt

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.github.libretube.ui.sheets
22

33
import android.os.Bundle
4+
import android.util.Log
45
import android.view.LayoutInflater
56
import android.view.View
67
import android.view.ViewGroup
@@ -20,6 +21,7 @@ open class BaseBottomSheet : ExpandedBottomSheet() {
2021
private val binding get() = _binding!!
2122

2223
private var title: String? = null
24+
private var preselectedItem: String? = null
2325
private lateinit var items: List<BottomSheetItem>
2426
private lateinit var listener: (index: Int) -> Unit
2527

@@ -46,6 +48,13 @@ open class BaseBottomSheet : ExpandedBottomSheet() {
4648
}
4749
}
4850

51+
// set the selected item
52+
for (item in items) {
53+
Log.e(item.title, preselectedItem.toString())
54+
}
55+
for (item in items.filter { it.title == preselectedItem }) {
56+
item.title = "${item.title}"
57+
}
4958
binding.optionsRecycler.layoutManager = LinearLayoutManager(requireContext())
5059
binding.optionsRecycler.adapter = BottomSheetAdapter(items, listener)
5160
}
@@ -72,8 +81,14 @@ open class BaseBottomSheet : ExpandedBottomSheet() {
7281
this.title = title
7382
}
7483

75-
fun setSimpleItems(titles: List<String>, listener: (suspend (index: Int) -> Unit)?) =
84+
fun setSimpleItems(
85+
titles: List<String>,
86+
preselectedItem: String? = null,
87+
listener: (suspend (index: Int) -> Unit)?
88+
) = apply {
7689
setItems(titles.map { BottomSheetItem(it) }, listener)
90+
this.preselectedItem = preselectedItem
91+
}
7792

7893
companion object {
7994
private val titleTextSize = 7f.dpToPx().toFloat()

app/src/main/java/com/github/libretube/ui/views/CustomExoPlayerView.kt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,8 @@ abstract class CustomExoPlayerView(
267267
if (scrubbingTimeBar && !forceUpdate) return
268268

269269
val currentIndex = PlayerHelper.getCurrentChapterIndex(player.currentPosition, chapters)
270-
val newChapterName = currentIndex?.let { chapters[it].title.trim() } ?: context.getString(R.string.no_chapter)
270+
val newChapterName = currentIndex?.let { chapters[it].title.trim() }
271+
?: context.getString(R.string.no_chapter)
271272
chaptersViewModel.currentChapterIndex.updateIfChanged(currentIndex ?: return)
272273

273274
// change the chapter name textView text to the chapterName
@@ -601,7 +602,10 @@ abstract class CustomExoPlayerView(
601602
)
602603

603604
BaseBottomSheet()
604-
.setSimpleItems(aspectRatioModeNames) { index ->
605+
.setSimpleItems(
606+
aspectRatioModeNames,
607+
preselectedItem = aspectRatioModeNames[aspectRatioModes.indexOf(resizeMode)]
608+
) { index ->
605609
resizeMode = aspectRatioModes[index]
606610
}
607611
.show(supportFragmentManager)
@@ -611,7 +615,12 @@ abstract class CustomExoPlayerView(
611615
// repeat mode options dialog
612616
BaseBottomSheet()
613617
.setSimpleItems(
614-
PlayerHelper.repeatModes.map { context.getString(it.second) }
618+
PlayerHelper.repeatModes.map { context.getString(it.second) },
619+
preselectedItem = PlayerHelper.repeatModes
620+
.firstOrNull { it.first == PlayingQueue.repeatMode }
621+
?.second?.let {
622+
context.getString(it)
623+
}
615624
) { index ->
616625
PlayingQueue.repeatMode = PlayerHelper.repeatModes[index].first
617626
}

0 commit comments

Comments
 (0)