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 savedInstanceState?.let { currentWindow = it.getInt(getString(R.string.state_resume_window)) playbackPosition = it.getLong(getString(R.string.state_resume_position)) playWhenReady = it.getBoolean(getString(R.string.state_is_playing)) } streamUrl = intent.getStringExtra(getString(R.string.intent_stream_url)).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() } } override fun onSaveInstanceState(outState: Bundle) { outState.putInt(getString(R.string.state_resume_window), currentWindow) outState.putLong(getString(R.string.state_resume_position), playbackPosition) outState.putBoolean(getString(R.string.state_is_playing), playWhenReady) super.onSaveInstanceState(outState) } 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.playWhenReady = playWhenReady player.setMediaSource(mediaSource) player.seekTo(playbackPosition) player.prepare() 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_IMMERSIVE or View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN) } } }