package org.mosad.teapod import android.net.Uri import android.os.Build import android.os.Bundle import android.util.Log import android.view.View import android.view.WindowInsets import android.view.WindowInsetsController import androidx.appcompat.app.AppCompatActivity import com.google.android.exoplayer2.ExoPlayer import com.google.android.exoplayer2.MediaItem import com.google.android.exoplayer2.Player import com.google.android.exoplayer2.SimpleExoPlayer import com.google.android.exoplayer2.source.hls.HlsMediaSource import com.google.android.exoplayer2.upstream.DataSource import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory import com.google.android.exoplayer2.util.Util import kotlinx.android.synthetic.main.activity_player.* class PlayerActivity : AppCompatActivity() { private lateinit var player: SimpleExoPlayer private lateinit var dataSourceFactory: DataSource.Factory private var streamUrl = "" private var playWhenReady = true private var currentWindow = 0 private var playbackPosition: Long = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_player) hideBars() // Initial hide the bars streamUrl = intent.getStringExtra("streamUrl").toString() } override fun onStart() { super.onStart() if (Util.SDK_INT > 23) { initPlayer() if (video_view != null) video_view.onResume() } } override fun onResume() { super.onResume() if (Util.SDK_INT <= 23) { initPlayer() if (video_view != null) video_view.onResume() } } override fun onPause() { super.onPause() if (Util.SDK_INT <= 23) { if (video_view != null) video_view.onPause() releasePlayer() } } override fun onStop() { super.onStop() if (Util.SDK_INT > 23) { if (video_view != null) video_view.onPause() releasePlayer() } } private fun initPlayer() { if (streamUrl.isEmpty()) { Log.e(javaClass.name, "No stream url was set.") return } player = SimpleExoPlayer.Builder(this).build() dataSourceFactory = DefaultDataSourceFactory(this, Util.getUserAgent(this, "Teapod")) val mediaSource = HlsMediaSource.Factory(dataSourceFactory) .createMediaSource(MediaItem.fromUri(Uri.parse(streamUrl))) player.setMediaSource(mediaSource) player.prepare() player.play() player.addListener(object : Player.EventListener { override fun onPlaybackStateChanged(state: Int) { super.onPlaybackStateChanged(state) loading.visibility = when (state) { ExoPlayer.STATE_READY -> View.GONE ExoPlayer.STATE_BUFFERING -> View.VISIBLE else -> View.GONE } } }) // when the player controls get hidden, hide the bars too video_view.setControllerVisibilityListener { if (it == View.GONE) hideBars() } video_view.player = player } private fun releasePlayer(){ playbackPosition = player.currentPosition currentWindow = player.currentWindowIndex playWhenReady = player.playWhenReady player.release() } /** * hide the status and navigation bar */ private fun hideBars() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { window.setDecorFitsSystemWindows(false) window.insetsController?.apply { hide(WindowInsets.Type.statusBars() or WindowInsets.Type.navigationBars()) systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_SWIPE } } else { @Suppress("deprecation") window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) } } }