Integrated JWPlayer

implemented playerView on both fragments theme 1 and theme 2

Full screen activity LiveStreamPlayerActivity
This commit is contained in:
2024-05-30 21:19:25 +05:30
parent 2182c0393d
commit 5bc2b44bc1
13 changed files with 399 additions and 73 deletions

View File

@@ -0,0 +1,87 @@
package com.woka.players
import android.view.Window
import android.view.WindowManager
import com.jwplayer.pub.api.JWPlayer
import com.jwplayer.pub.api.events.AdCompleteEvent
import com.jwplayer.pub.api.events.AdErrorEvent
import com.jwplayer.pub.api.events.AdPauseEvent
import com.jwplayer.pub.api.events.AdPlayEvent
import com.jwplayer.pub.api.events.AdSkippedEvent
import com.jwplayer.pub.api.events.CompleteEvent
import com.jwplayer.pub.api.events.ErrorEvent
import com.jwplayer.pub.api.events.EventType
import com.jwplayer.pub.api.events.PauseEvent
import com.jwplayer.pub.api.events.PlayEvent
import com.jwplayer.pub.api.events.listeners.AdvertisingEvents.OnAdCompleteListener
import com.jwplayer.pub.api.events.listeners.AdvertisingEvents.OnAdErrorListener
import com.jwplayer.pub.api.events.listeners.AdvertisingEvents.OnAdPauseListener
import com.jwplayer.pub.api.events.listeners.AdvertisingEvents.OnAdPlayListener
import com.jwplayer.pub.api.events.listeners.AdvertisingEvents.OnAdSkippedListener
import com.jwplayer.pub.api.events.listeners.VideoPlayerEvents
import com.jwplayer.pub.api.events.listeners.VideoPlayerEvents.OnPauseListener
import com.jwplayer.pub.api.events.listeners.VideoPlayerEvents.OnPlayListener
class KeepScreenOnHandler(player: JWPlayer, window: Window) : OnPlayListener,
OnPauseListener, VideoPlayerEvents.OnCompleteListener, VideoPlayerEvents.OnErrorListener,
OnAdPlayListener, OnAdPauseListener, OnAdCompleteListener, OnAdSkippedListener,
OnAdErrorListener {
private val mWindow: Window
init {
player.addListener(EventType.PLAY, this)
player.addListener(EventType.PAUSE, this)
player.addListener(EventType.COMPLETE, this)
player.addListener(EventType.ERROR, this)
player.addListener(EventType.AD_PLAY, this)
player.addListener(EventType.AD_PAUSE, this)
player.addListener(EventType.AD_COMPLETE, this)
player.addListener(EventType.AD_ERROR, this)
mWindow = window
}
private fun updateWakeLock(enable: Boolean) {
if (enable) {
mWindow.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
} else {
mWindow.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
}
override fun onError(errorEvent: ErrorEvent) {
updateWakeLock(false)
}
override fun onAdPlay(adPlayEvent: AdPlayEvent) {
updateWakeLock(true)
}
override fun onAdPause(adPauseEvent: AdPauseEvent) {
updateWakeLock(false)
}
override fun onAdComplete(adCompleteEvent: AdCompleteEvent) {
updateWakeLock(false)
}
override fun onAdSkipped(adSkippedEvent: AdSkippedEvent) {
updateWakeLock(false)
}
override fun onAdError(adErrorEvent: AdErrorEvent) {
updateWakeLock(false)
}
override fun onComplete(completeEvent: CompleteEvent) {
updateWakeLock(false)
}
override fun onPause(pauseEvent: PauseEvent) {
updateWakeLock(false)
}
override fun onPlay(playEvent: PlayEvent) {
updateWakeLock(true)
}
}

View File

@@ -0,0 +1,102 @@
package com.woka.players
import android.os.Bundle
import android.util.Log
import android.view.ViewGroup
import android.view.WindowManager
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import com.jwplayer.pub.api.JWPlayer
import com.jwplayer.pub.api.configuration.PlayerConfig
import com.jwplayer.pub.api.events.EventType
import com.jwplayer.pub.api.events.listeners.VideoPlayerEvents
import com.jwplayer.pub.api.fullscreen.FullscreenHandler
import com.jwplayer.pub.api.media.playlists.PlaylistItem
import com.woka.databinding.ActivityLiveStreamPlayerBinding
class LiveStreamPlayerActivity : AppCompatActivity(), FullscreenHandler {
companion object{
private const val TAG = "LiveStreamPlayerActivity_tag"
}
private lateinit var binding: ActivityLiveStreamPlayerBinding
private lateinit var player: JWPlayer
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivityLiveStreamPlayerBinding.inflate(layoutInflater)
setContentView(binding.root)
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
val windowInsetsController =
WindowCompat.getInsetsController(window, window.decorView)
windowInsetsController.hide(WindowInsetsCompat.Type.systemBars())
setUpPlayer()
}
override fun onDestroy() {
super.onDestroy()
player.stop()
}
private fun setUpPlayer() {
player = binding.playerView.player
player.setFullscreenHandler(this)
player.setFullscreen(true, false)
player.addListener(EventType.ERROR, VideoPlayerEvents.OnErrorListener {
Log.d(TAG, "onError: ${it.errorCode}")
Log.d(TAG, "onError: ${it.exception}")
Log.d(TAG, "onError: ${it.message}")
})
player.addListener(EventType.SETUP_ERROR, VideoPlayerEvents.OnSetupErrorListener {
Log.d(TAG, "setUpPlayer: $it")
})
// to keep up the screen om when video is being played
KeepScreenOnHandler(player, window)
val playlistItem = PlaylistItem.Builder()
.file("https://d3volyx7jx7oal.cloudfront.net/master.m3u8")
.mediaId("YR5pnlIM")
.build()
val playlist: MutableList<PlaylistItem> = ArrayList()
playlist.add(playlistItem)
val config =
PlayerConfig.Builder()
.playlist(playlist)
.build()
player.setup(config)
player.play()
}
override fun onFullscreenRequested() {}
override fun onFullscreenExitRequested() {
player.stop()
onBackPressedDispatcher.onBackPressed()
}
override fun onAllowRotationChanged(allowRotation: Boolean) {}
override fun updateLayoutParams(layoutParams: ViewGroup.LayoutParams?) {}
override fun setUseFullscreenLayoutFlags(flags: Boolean) {}
}