From e545e1de262cb1b46e6a5c0ec04a5c40f7518039 Mon Sep 17 00:00:00 2001 From: Balamurugan-Testpress Date: Thu, 10 Sep 2026 11:43:43 +0530 Subject: [PATCH 1/3] feat: expose subtitle state change event * Host apps could not observe subtitle enable, disable, or language changes, making it difficult to persist the user's caption preference. * Expose subtitle state changes to host apps while reporting only actual state changes and keeping persistence responsibility with the host. * Keep the change backward compatible with a default listener implementation. --- .../main/java/com/tpstreams/player/MainActivity.kt | 4 ++-- .../java/com/tpstreams/player/PlayerActivity.kt | 13 ++++++++++++- .../java/com/tpstreams/player/TPStreamsPlayer.kt | 8 +++++++- .../com/tpstreams/player/TPStreamsPlayerView.kt | 4 ++++ .../com/tpstreams/player/tracks/TextTrackManager.kt | 8 ++++++++ 5 files changed, 33 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/tpstreams/player/MainActivity.kt b/app/src/main/java/com/tpstreams/player/MainActivity.kt index 6b808721..efa2009d 100644 --- a/app/src/main/java/com/tpstreams/player/MainActivity.kt +++ b/app/src/main/java/com/tpstreams/player/MainActivity.kt @@ -134,8 +134,8 @@ class MainActivity : AppCompatActivity() { // TPStreams Tab Buttons findViewById(R.id.btn_drm_video).setOnClickListener { val intent = Intent(this, PlayerActivity::class.java).apply { - putExtra(EXTRA_ASSET_ID, "42h2tZ5fmNf") - putExtra(EXTRA_ACCESS_TOKEN, "9327e2d0-fa13-4288-902d-840f32cd0eed") + putExtra(EXTRA_ASSET_ID, "7xbZeQzR36h") + putExtra(EXTRA_ACCESS_TOKEN, "3d9838f3-db51-4fc3-8472-075ab5e40b64 ") } startActivity(intent) } diff --git a/app/src/main/java/com/tpstreams/player/PlayerActivity.kt b/app/src/main/java/com/tpstreams/player/PlayerActivity.kt index d32edfb0..2d40594e 100644 --- a/app/src/main/java/com/tpstreams/player/PlayerActivity.kt +++ b/app/src/main/java/com/tpstreams/player/PlayerActivity.kt @@ -2,10 +2,12 @@ package com.tpstreams.player import android.graphics.Color import android.os.Bundle +import android.widget.Toast import androidx.activity.viewModels import androidx.annotation.OptIn import androidx.appcompat.app.AppCompatActivity import androidx.media3.common.util.UnstableApi +import com.tpstreams.player.constants.PlaybackError import com.tpstreams.player.databinding.ActivityPlayerBinding @OptIn(UnstableApi::class) @@ -27,8 +29,17 @@ class PlayerActivity : AppCompatActivity() { viewModel.initPlayer(assetId, accessToken, isTestpress) viewModel.player?.setMaxResolution(1080) binding.playerView.setVideoResolution(720) - binding.playerView.player = viewModel.player + viewModel.player?.listener = object : TPStreamsPlayer.Listener { + override fun onAccessTokenExpired(videoId: String, callback: (String) -> Unit) {} + override fun onError(error: PlaybackError, message: String) {} + + override fun onSubtitleStateChanged(enabled: Boolean, language: String?) { + val state = if (enabled) "ON: $language" else "OFF" + Toast.makeText(this@PlayerActivity, "Subtitles $state and Language: $language", Toast.LENGTH_SHORT).show() + } + } + binding.playerView.player = viewModel.player binding.playerView.setWatermarks( listOf( diff --git a/tpstreams-android-player/src/main/java/com/tpstreams/player/TPStreamsPlayer.kt b/tpstreams-android-player/src/main/java/com/tpstreams/player/TPStreamsPlayer.kt index 0ede1852..54ad029b 100644 --- a/tpstreams-android-player/src/main/java/com/tpstreams/player/TPStreamsPlayer.kt +++ b/tpstreams-android-player/src/main/java/com/tpstreams/player/TPStreamsPlayer.kt @@ -87,6 +87,8 @@ private constructor( * probes complete. The UI can use this to show a "Diagnosing…" state. */ fun onNetworkDiagnosticsStarted() {} + + fun onSubtitleStateChanged(enabled: Boolean, language: String?) {} } private var isPrepared = false @@ -105,7 +107,11 @@ private constructor( private val networkRecoveryHandler = NetworkRecoveryHandler(context) private val textTrackManager: TextTrackManager by lazy { - TextTrackManager(exoPlayer, trackSelector) + TextTrackManager( + exoPlayer, + trackSelector, + onSubtitleStateChanged = { enabled, language -> _listener?.onSubtitleStateChanged(enabled, language) }, + ) } private val resolutionManager: ResolutionManager by lazy { ResolutionManager(exoPlayer, trackSelector) diff --git a/tpstreams-android-player/src/main/java/com/tpstreams/player/TPStreamsPlayerView.kt b/tpstreams-android-player/src/main/java/com/tpstreams/player/TPStreamsPlayerView.kt index 3f7d7f8f..4d11a8fb 100644 --- a/tpstreams-android-player/src/main/java/com/tpstreams/player/TPStreamsPlayerView.kt +++ b/tpstreams-android-player/src/main/java/com/tpstreams/player/TPStreamsPlayerView.kt @@ -627,4 +627,8 @@ internal class ViewPlayerListener( override fun onNetworkDiagnosticsStarted() = onNetworkDiagnosticsStartedAction() + + override fun onSubtitleStateChanged(enabled: Boolean, language: String?) { + userListener?.onSubtitleStateChanged(enabled, language) + } } diff --git a/tpstreams-android-player/src/main/java/com/tpstreams/player/tracks/TextTrackManager.kt b/tpstreams-android-player/src/main/java/com/tpstreams/player/tracks/TextTrackManager.kt index 350b6b6e..5cb7d112 100644 --- a/tpstreams-android-player/src/main/java/com/tpstreams/player/tracks/TextTrackManager.kt +++ b/tpstreams-android-player/src/main/java/com/tpstreams/player/tracks/TextTrackManager.kt @@ -15,9 +15,11 @@ import androidx.media3.exoplayer.trackselection.DefaultTrackSelector internal class TextTrackManager( private val exoPlayer: ExoPlayer, private val trackSelector: DefaultTrackSelector, + private val onSubtitleStateChanged: ((Boolean, String?) -> Unit)? = null, ) { private var subtitleMetadata: Map = emptyMap() + private var previousSubtitleLanguage: String? = null fun updateSubtitleMetadata(metadata: Map) { subtitleMetadata = metadata @@ -61,6 +63,12 @@ internal class TextTrackManager( if (exoPlayer.isPlaying) { exoPlayer.seekTo(currentPosition) } + + val enabled = language != null + if (language != previousSubtitleLanguage) { + previousSubtitleLanguage = language + onSubtitleStateChanged?.invoke(enabled, language) + } } fun getActiveTextTrack(): Pair? { From 46b1cb92c678990bb23df554a4fc67ee7bc2daeb Mon Sep 17 00:00:00 2001 From: Balamurugan-Testpress Date: Thu, 10 Sep 2026 14:39:57 +0530 Subject: [PATCH 2/3] fix: ai comment --- app/src/main/java/com/tpstreams/player/MainActivity.kt | 2 +- .../main/java/com/tpstreams/player/tracks/TextTrackManager.kt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/tpstreams/player/MainActivity.kt b/app/src/main/java/com/tpstreams/player/MainActivity.kt index efa2009d..892ac117 100644 --- a/app/src/main/java/com/tpstreams/player/MainActivity.kt +++ b/app/src/main/java/com/tpstreams/player/MainActivity.kt @@ -135,7 +135,7 @@ class MainActivity : AppCompatActivity() { findViewById(R.id.btn_drm_video).setOnClickListener { val intent = Intent(this, PlayerActivity::class.java).apply { putExtra(EXTRA_ASSET_ID, "7xbZeQzR36h") - putExtra(EXTRA_ACCESS_TOKEN, "3d9838f3-db51-4fc3-8472-075ab5e40b64 ") + putExtra(EXTRA_ACCESS_TOKEN, "3d9838f3-db51-4fc3-8472-075ab5e40b64") } startActivity(intent) } diff --git a/tpstreams-android-player/src/main/java/com/tpstreams/player/tracks/TextTrackManager.kt b/tpstreams-android-player/src/main/java/com/tpstreams/player/tracks/TextTrackManager.kt index 5cb7d112..cd047f4b 100644 --- a/tpstreams-android-player/src/main/java/com/tpstreams/player/tracks/TextTrackManager.kt +++ b/tpstreams-android-player/src/main/java/com/tpstreams/player/tracks/TextTrackManager.kt @@ -89,6 +89,7 @@ internal class TextTrackManager( fun enableDefaultCaptions() { val defaultTrack = getAvailableTextTracks().firstOrNull() ?: return + previousSubtitleLanguage = defaultTrack.first setTextTrackByLanguage(defaultTrack.first) } From 081e36019d4d34e1ed7397cb778b1864f2bab16d Mon Sep 17 00:00:00 2001 From: Balamurugan-Testpress Date: Thu, 10 Sep 2026 14:51:12 +0530 Subject: [PATCH 3/3] fix:AI comment --- .../main/java/com/tpstreams/player/tracks/TextTrackManager.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/tpstreams-android-player/src/main/java/com/tpstreams/player/tracks/TextTrackManager.kt b/tpstreams-android-player/src/main/java/com/tpstreams/player/tracks/TextTrackManager.kt index cd047f4b..5cb7d112 100644 --- a/tpstreams-android-player/src/main/java/com/tpstreams/player/tracks/TextTrackManager.kt +++ b/tpstreams-android-player/src/main/java/com/tpstreams/player/tracks/TextTrackManager.kt @@ -89,7 +89,6 @@ internal class TextTrackManager( fun enableDefaultCaptions() { val defaultTrack = getAvailableTextTracks().firstOrNull() ?: return - previousSubtitleLanguage = defaultTrack.first setTextTrackByLanguage(defaultTrack.first) }