From 74b25e5a5426c86b1883ba072ed12c9a4a07dbaf Mon Sep 17 00:00:00 2001 From: chrisk325 Date: Tue, 14 Apr 2026 00:05:59 +0530 Subject: [PATCH] fix: libass positioning --- .../features/player/PlayerEngine.android.kt | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/composeApp/src/androidMain/kotlin/com/nuvio/app/features/player/PlayerEngine.android.kt b/composeApp/src/androidMain/kotlin/com/nuvio/app/features/player/PlayerEngine.android.kt index cf975fa9..63c2a777 100644 --- a/composeApp/src/androidMain/kotlin/com/nuvio/app/features/player/PlayerEngine.android.kt +++ b/composeApp/src/androidMain/kotlin/com/nuvio/app/features/player/PlayerEngine.android.kt @@ -46,7 +46,6 @@ import androidx.media3.ui.PlayerView import androidx.media3.ui.SubtitleView import androidx.media3.ui.CaptionStyleCompat import com.nuvio.app.R -import io.github.peerless2012.ass.media.kt.withAssSupport import io.github.peerless2012.ass.media.widget.AssSubtitleView import kotlinx.coroutines.delay import kotlinx.coroutines.Dispatchers @@ -480,14 +479,14 @@ private fun PlayerView.syncLibassOverlay( enabled: Boolean, renderType: LibassRenderType, ) { - val subtitleView = subtitleView ?: return + val overlayContainer = findViewById(R.id.libass_overlay_container) ?: return val needsOverlay = enabled && renderType.usesOverlaySubtitleView() val boundPlayer = getTag(R.id.libass_overlay_bound_player) as? ExoPlayer - val hasOverlayChild = subtitleView.hasAssOverlayChild() + val hasOverlayChild = overlayContainer.hasAssOverlayChild() if (!needsOverlay) { if (hasOverlayChild) { - subtitleView.removeAssOverlayChildren() + overlayContainer.removeAssOverlayChildren() } if (boundPlayer != null) { setTag(R.id.libass_overlay_bound_player, null) @@ -500,15 +499,19 @@ private fun PlayerView.syncLibassOverlay( return } - subtitleView.removeAssOverlayChildren() - subtitleView.withAssSupport(assHandler) + overlayContainer.removeAssOverlayChildren() + val assSubtitleView = AssSubtitleView(overlayContainer.context, assHandler) + overlayContainer.addView( + assSubtitleView, + android.widget.FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT) + ) setTag(R.id.libass_overlay_bound_player, player) } private fun LibassRenderType.usesOverlaySubtitleView(): Boolean = this == LibassRenderType.OVERLAY_CANVAS || this == LibassRenderType.OVERLAY_OPEN_GL -private fun SubtitleView.hasAssOverlayChild(): Boolean { +private fun android.widget.FrameLayout.hasAssOverlayChild(): Boolean { for (index in 0 until childCount) { if (getChildAt(index) is AssSubtitleView) { return true @@ -517,7 +520,7 @@ private fun SubtitleView.hasAssOverlayChild(): Boolean { return false } -private fun SubtitleView.removeAssOverlayChildren() { +private fun android.widget.FrameLayout.removeAssOverlayChildren() { for (index in childCount - 1 downTo 0) { if (getChildAt(index) is AssSubtitleView) { removeViewAt(index)