From 94454172dd17c96a1ff212fa59b2a1cbf15c8a5f Mon Sep 17 00:00:00 2001
From: Kai <git@seaoflaurels.com>
Date: Wed, 8 Jan 2025 20:43:38 -0600
Subject: [PATCH 1/2] Add UI to show when adaptive streams (HLS and DASH) are
 in auto mode

Changelog: added
---
 .../mainactivity/main/VideoDetailView.kt      | 44 ++++++++++++++-----
 .../views/video/FutoVideoPlayerBase.kt        | 14 +++---
 2 files changed, 40 insertions(+), 18 deletions(-)

diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt
index bc606582..4224d7e0 100644
--- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt
+++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt
@@ -1901,13 +1901,35 @@ class VideoDetailView : ConstraintLayout {
         return super.onInterceptTouchEvent(ev);
     }
 
-
     //Actions
     private fun showVideoSettings() {
         Logger.i(TAG, "showVideoSettings")
         _overlay_quality_selector?.selectOption("video", _lastVideoSource);
         _overlay_quality_selector?.selectOption("audio", _lastAudioSource);
         _overlay_quality_selector?.selectOption("subtitles", _lastSubtitleSource);
+
+        if (_lastVideoSource is IDashManifestSource || _lastVideoSource is IHLSManifestSource) {
+
+            val videoTracks =
+                _player.exoPlayer?.player?.currentTracks?.groups?.firstOrNull { it.mediaTrackGroup.type == C.TRACK_TYPE_VIDEO }
+
+            var selectedQuality: Format? = null
+
+            if (videoTracks != null) {
+                for (i in 0 until videoTracks.mediaTrackGroup.length) {
+                    if (videoTracks.mediaTrackGroup.getFormat(i).height == _player.targetTrackVideoHeight) {
+                        selectedQuality = videoTracks.mediaTrackGroup.getFormat(i)
+                    }
+                }
+            }
+
+            if (selectedQuality != null) {
+                _overlay_quality_selector?.selectOption("video", selectedQuality)
+            } else {
+                _overlay_quality_selector?.selectOption("video", "auto")
+            }
+        }
+
         val currentPlaybackRate = (if (_isCasting) StateCasting.instance.activeDevice?.speed else _player.getPlaybackRate()) ?: 1.0
         _overlay_quality_selector?.groupItems?.firstOrNull { it is SlideUpMenuButtonList && it.id == "playback_rate" }?.let {
             (it as SlideUpMenuButtonList).setSelected(currentPlaybackRate.toString())
@@ -2081,17 +2103,15 @@ class VideoDetailView : ConstraintLayout {
                                 call = { handleSelectSubtitleTrack(it) })
                         }.toList().toTypedArray())
             else null,
-            if(liveStreamVideoFormats?.isEmpty() == false)
-                SlideUpMenuGroup(this.context, context.getString(R.string.stream_video), "video",
-                    *liveStreamVideoFormats
-                        .map {
-                            SlideUpMenuItem(this.context,
-                                R.drawable.ic_movie,
-                                it.label ?: it.containerMimeType ?: it.bitrate.toString(),
-                                "${it.width}x${it.height}",
-                                tag = it,
-                                call = { _player.selectVideoTrack(it.height) });
-                        }.toList().toTypedArray())
+            if (liveStreamVideoFormats?.isEmpty() == false) SlideUpMenuGroup(
+                this.context, context.getString(R.string.stream_video), "video", (listOf(
+                    SlideUpMenuItem(this.context, R.drawable.ic_movie, "Auto", tag = "auto", call = { _player.selectVideoTrack(-1) })
+                ) + (liveStreamVideoFormats.map {
+                    SlideUpMenuItem(this.context, R.drawable.ic_movie, it.label
+                        ?: it.containerMimeType
+                        ?: it.bitrate.toString(), "${it.width}x${it.height}", tag = it, call = { _player.selectVideoTrack(it.height) });
+                }))
+            )
             else null,
             if(liveStreamAudioFormats?.isEmpty() == false)
                 SlideUpMenuGroup(this.context, context.getString(R.string.stream_audio), "audio",
diff --git a/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt b/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt
index 9ca559ca..fd30f685 100644
--- a/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt
+++ b/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt
@@ -110,8 +110,10 @@ abstract class FutoVideoPlayerBase : RelativeLayout {
     private var _didCallSourceChange = false;
     private var _lastState: Int = -1;
 
-    private var _targetTrackVideoHeight = -1;
-    private var _targetTrackAudioBitrate = -1;
+
+    var targetTrackVideoHeight = -1
+        private set
+    var _targetTrackAudioBitrate = -1
 
     private var _toResume = false;
 
@@ -278,7 +280,7 @@ abstract class FutoVideoPlayerBase : RelativeLayout {
 
     //TODO: Temporary solution, Implement custom track selector without using constraints
     fun selectVideoTrack(height: Int) {
-        _targetTrackVideoHeight = height;
+        targetTrackVideoHeight = height;
         updateTrackSelector();
     }
     fun selectAudioTrack(bitrate: Int) {
@@ -288,10 +290,10 @@ abstract class FutoVideoPlayerBase : RelativeLayout {
     @OptIn(UnstableApi::class)
     private fun updateTrackSelector() {
         var builder = DefaultTrackSelector.Parameters.Builder(context);
-        if(_targetTrackVideoHeight > 0) {
+        if(targetTrackVideoHeight > 0) {
             builder = builder
-                .setMinVideoSize(0, _targetTrackVideoHeight - 10)
-                .setMaxVideoSize(9999, _targetTrackVideoHeight + 10);
+                .setMinVideoSize(0, targetTrackVideoHeight - 10)
+                .setMaxVideoSize(9999, targetTrackVideoHeight + 10);
         }
 
         if(_targetTrackAudioBitrate > 0) {
-- 
GitLab


From 978f76ffb6c5dac36ba7b8d674415fc904f2ed35 Mon Sep 17 00:00:00 2001
From: Kai <git@seaoflaurels.com>
Date: Fri, 10 Jan 2025 14:38:54 -0600
Subject: [PATCH 2/2] Added current quality to auto item

Changelog: added
---
 .../fragment/mainactivity/main/VideoDetailView.kt     | 11 ++++++++++-
 .../views/overlays/slideup/SlideUpMenuGroup.kt        |  9 +++++++++
 .../views/overlays/slideup/SlideUpMenuItem.kt         |  4 ++++
 .../platformplayer/views/video/FutoVideoPlayerBase.kt |  2 +-
 4 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt
index 4224d7e0..2c38fd0d 100644
--- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt
+++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt
@@ -171,7 +171,6 @@ import kotlinx.coroutines.withContext
 import userpackage.Protocol
 import java.time.OffsetDateTime
 import kotlin.math.abs
-import kotlin.math.max
 import kotlin.math.roundToLong
 
 @UnstableApi
@@ -1923,9 +1922,19 @@ class VideoDetailView : ConstraintLayout {
                 }
             }
 
+            var videoMenuGroup: SlideUpMenuGroup? = null
+            for (view in _overlay_quality_selector!!.groupItems) {
+                if (view is SlideUpMenuGroup && view.groupTag == "video") {
+                    videoMenuGroup = view
+                }
+            }
+
             if (selectedQuality != null) {
+                videoMenuGroup?.getItem("auto")?.setSubText("")
                 _overlay_quality_selector?.selectOption("video", selectedQuality)
             } else {
+                videoMenuGroup?.getItem("auto")
+                    ?.setSubText("${_player.exoPlayer?.player?.videoFormat?.width}x${_player.exoPlayer?.player?.videoFormat?.height}")
                 _overlay_quality_selector?.selectOption("video", "auto")
             }
         }
diff --git a/app/src/main/java/com/futo/platformplayer/views/overlays/slideup/SlideUpMenuGroup.kt b/app/src/main/java/com/futo/platformplayer/views/overlays/slideup/SlideUpMenuGroup.kt
index 9f19018d..606c8746 100644
--- a/app/src/main/java/com/futo/platformplayer/views/overlays/slideup/SlideUpMenuGroup.kt
+++ b/app/src/main/java/com/futo/platformplayer/views/overlays/slideup/SlideUpMenuGroup.kt
@@ -61,6 +61,15 @@ class SlideUpMenuGroup : LinearLayout {
         return didSelect;
     }
 
+    fun getItem(tag: Any?): SlideUpMenuItem? {
+        for(item in items) {
+            if(item.itemTag == tag){
+                return item
+            }
+        }
+        return null
+    }
+
     private fun addItems(items: List<SlideUpMenuItem>) {
         for (item in items) {
             item.setParentClickListener { parentClickListener?.invoke() }
diff --git a/app/src/main/java/com/futo/platformplayer/views/overlays/slideup/SlideUpMenuItem.kt b/app/src/main/java/com/futo/platformplayer/views/overlays/slideup/SlideUpMenuItem.kt
index 8e5da990..29699ecd 100644
--- a/app/src/main/java/com/futo/platformplayer/views/overlays/slideup/SlideUpMenuItem.kt
+++ b/app/src/main/java/com/futo/platformplayer/views/overlays/slideup/SlideUpMenuItem.kt
@@ -82,6 +82,10 @@ class SlideUpMenuItem : ConstraintLayout {
         return isSelected;
     }
 
+    fun setSubText(subText: String) {
+        _subtext.text = subText
+    }
+
     fun setParentClickListener(listener: (()->Unit)?) {
         _parentClickListener = listener;
     }
diff --git a/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt b/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt
index fd30f685..739da3c3 100644
--- a/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt
+++ b/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt
@@ -113,7 +113,7 @@ abstract class FutoVideoPlayerBase : RelativeLayout {
 
     var targetTrackVideoHeight = -1
         private set
-    var _targetTrackAudioBitrate = -1
+    private var _targetTrackAudioBitrate = -1
 
     private var _toResume = false;
 
-- 
GitLab