Skip to content

Commit

Permalink
Playlist Support
Browse files Browse the repository at this point in the history
Signed-off-by: Stacy Devino <stacy.devino@nike.com>
  • Loading branch information
Stacy Devino committed Apr 23, 2019
1 parent 91f7d45 commit e49bef7
Show file tree
Hide file tree
Showing 7 changed files with 211 additions and 149 deletions.
1 change: 0 additions & 1 deletion .idea/codeStyles/codeStyleConfig.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

292 changes: 170 additions & 122 deletions app/src/main/java/com/stacydevino/videoplayertypes/ExoplayerActivity.kt
Original file line number Diff line number Diff line change
@@ -1,160 +1,208 @@
package com.stacydevino.videoplayertypes


import android.content.pm.ActivityInfo
import android.content.res.Configuration
import android.graphics.drawable.GradientDrawable.Orientation
import android.support.v4.media.session.MediaSessionCompat
import android.net.Uri
import android.os.Bundle
import android.os.Handler
import android.view.OrientationEventListener
import androidx.appcompat.app.AppCompatActivity
import com.google.android.exoplayer2.C
import com.google.android.exoplayer2.ExoPlayerFactory
import com.google.android.exoplayer2.SimpleExoPlayer
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector
import com.google.android.exoplayer2.source.ConcatenatingMediaSource
import com.google.android.exoplayer2.source.ExtractorMediaSource

import com.google.android.exoplayer2.source.hls.HlsMediaSource
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory
import com.google.android.exoplayer2.util.Util
import kotlinx.android.synthetic.main.activity_exoplayer.*
import kotlinx.android.synthetic.main.exoplayer_media_controls_custom.exo_fullscreen_button



class ExoplayerActivity : AppCompatActivity() {

companion object {
@JvmField
val ARG_VIDEO_URL = "ExoplayerActivity.URL"
val ARG_VIDEO_POSITION = "ExoplayerActivity.POSITION"
companion object {
@JvmField
val ARG_VIDEO_URL = "ExoplayerActivity.URL"
val ARG_VIDEO_POSITION = "ExoplayerActivity.POSITION"
val ARG_VIDEO_URL_LIST = "ExoplayerActivity.URL_LIST"
}

private var videoUrl: String? = null
private var videoUrlList: Array<String>? = null
private lateinit var player: SimpleExoPlayer
private var videoPosition: Long = 0L
private lateinit var mediaSession: MediaSessionCompat

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_exoplayer)

if (intent.extras == null){
finish()
}

lateinit var mUrl: String
lateinit var player : SimpleExoPlayer
private var videoPosition : Long = 0L
private lateinit var mediaSession: MediaSessionCompat

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_exoplayer)

if (intent.extras == null || !intent.hasExtra(ARG_VIDEO_URL)) {
finish()
}

mUrl = intent.getStringExtra(ARG_VIDEO_URL)
videoUrl = intent.getStringExtra(ARG_VIDEO_URL)
videoUrlList = intent.getStringArrayExtra(ARG_VIDEO_URL_LIST)

savedInstanceState?.let { videoPosition = savedInstanceState.getLong(ARG_VIDEO_POSITION) }
savedInstanceState?.let { videoPosition = savedInstanceState.getLong(ARG_VIDEO_POSITION) }

/* Adding a custom Layout with Button! */
/* Adding a custom Layout with Button!
setFullscreenBtnImage(getOrientation())
setFullscreenBtnImage(getOrientation())

exo_fullscreen_button.setOnClickListener {
if(getOrientation() == Configuration.ORIENTATION_LANDSCAPE){
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
} else {
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
}
//Do whatever the sensor wants after user moves phone position
Handler().postDelayed({setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR)}, 3000)
}
exo_fullscreen_button.setOnClickListener {
if (getOrientation() == Configuration.ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
}
//Do whatever the sensor wants after user moves phone position
Handler().postDelayed(
{ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR) }, 5000)
}


override fun onStart() {
super.onStart()


player = ExoPlayerFactory
.newSimpleInstance(this, DefaultTrackSelector())

playerView.player = player

val dataSourceFactory =
DefaultDataSourceFactory(this,
Util.getUserAgent(this,
applicationInfo.loadLabel(packageManager)
.toString()))

when (Util.inferContentType(Uri.parse(mUrl))) {
C.TYPE_HLS -> {
val mediaSource = HlsMediaSource
.Factory(dataSourceFactory)
.createMediaSource(Uri.parse(mUrl))
player.prepare(mediaSource)
}

C.TYPE_OTHER -> {
val mediaSource = ExtractorMediaSource
.Factory(dataSourceFactory)
.createMediaSource(Uri.parse(mUrl))
player.prepare(mediaSource)
}

else -> {
//This is to catch SmoothStreaming and
//DASH types which we won't support currently, exit
finish()
}
}
player.playWhenReady = true

//Use Media Session Connector from the EXT library to enable MediaSession Controls in PIP.
mediaSession = MediaSessionCompat(this, packageName)
val mediaSessionConnector = MediaSessionConnector(mediaSession)
mediaSessionConnector.setPlayer(player, null)
mediaSession.isActive = true
*/
}

override fun onStart() {
super.onStart()

player = ExoPlayerFactory
.newSimpleInstance(this, DefaultTrackSelector())

playerView.player = player

videoUrl?.let { setPlayerMedia() }

//playlists
videoUrlList?.let { player.prepare(createPlaylist(it))}

player.playWhenReady = true

//Use Media Session Connector from the EXT library to enable MediaSession Controls in PIP.
mediaSession = MediaSessionCompat(this, packageName)
val mediaSessionConnector = MediaSessionConnector(mediaSession)
mediaSessionConnector.setPlayer(player, null)
mediaSession.isActive = true
}

private fun setPlayerMedia(){
val dataSourceFactory =
DefaultDataSourceFactory(
this,
Util.getUserAgent(
this,
applicationInfo.loadLabel(packageManager)
.toString()
)
)

when (Util.inferContentType(Uri.parse(videoUrl))) {
C.TYPE_HLS -> {
val mediaSource = HlsMediaSource
.Factory(dataSourceFactory)
.createMediaSource(Uri.parse(videoUrl))
player.prepare(mediaSource)
}

C.TYPE_OTHER -> {
val mediaSource = ExtractorMediaSource
.Factory(dataSourceFactory)
.createMediaSource(Uri.parse(videoUrl))
player.prepare(mediaSource)
}

else -> {
//This is to catch SmoothStreaming and
//DASH types which we won't support currently, exit
finish()
}
}


override fun onStop() {
super.onStop()
mediaSession.isActive = false
playerView.player = null
player.release()
}

override fun onStop() {
super.onStop()
mediaSession.isActive = false
playerView.player = null
player.release()
}

//Seek and Resume
override fun onPause() {
videoPosition = player.currentPosition
super.onPause()
}

override fun onResume() {
super.onResume()
if (videoPosition > 0L) {
player.seekTo(videoPosition)
}

//Seek and Resume
override fun onPause() {
videoPosition = player.currentPosition
super.onPause()
player.playWhenReady = true
}

/* Adding a custom Layout with Button!
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
setFullscreenBtnImage(newConfig.orientation)
}
private fun getOrientation(): Int {
return this.getResources()
.getConfiguration()
.orientation
}
private fun setFullscreenBtnImage(screenOrientation: Int) {
when (screenOrientation) {
Configuration.ORIENTATION_PORTRAIT -> {
exo_fullscreen_button.setImageResource(R.drawable.ic_fullscreen_white_24dp)
}
Configuration.ORIENTATION_LANDSCAPE -> {
exo_fullscreen_button.setImageResource(R.drawable.ic_fullscreen_exit_white_24dp)
}
Configuration.ORIENTATION_UNDEFINED -> {
exo_fullscreen_button.setImageResource(R.drawable.ic_fullscreen_exit_white_24dp)
}
}

override fun onResume() {
super.onResume()
if (videoPosition > 0L) {
player.seekTo(videoPosition)
}
*/

/* Playlists of Videos */
private fun createPlaylist(urlArray : Array<String>) : ConcatenatingMediaSource{

val dataSourceFactory =
DefaultDataSourceFactory(this,
Util.getUserAgent(this,
applicationInfo.loadLabel(packageManager)
.toString()))

val mediaSourceList = ConcatenatingMediaSource()

for (url in urlArray) {
when (Util.inferContentType(Uri.parse(url))) {
C.TYPE_HLS -> {
val mediaSource = HlsMediaSource
.Factory(dataSourceFactory)
.createMediaSource(Uri.parse(url))
mediaSourceList.addMediaSource(mediaSource)
}
player.playWhenReady = true
}


/* Adding a custom Layout with Button! */

override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
setFullscreenBtnImage(newConfig.orientation)
}

private fun getOrientation() : Int {
return this.getResources().getConfiguration().orientation
}
C.TYPE_OTHER -> {
val mediaSource = ExtractorMediaSource
.Factory(dataSourceFactory)
.createMediaSource(Uri.parse(url))
mediaSourceList.addMediaSource(mediaSource)
}

private fun setFullscreenBtnImage(screenOrientation: Int){
when(screenOrientation) {
Configuration.ORIENTATION_PORTRAIT -> {
exo_fullscreen_button.setImageResource(R.drawable.ic_fullscreen_white_24dp)
}
Configuration.ORIENTATION_LANDSCAPE -> {
exo_fullscreen_button.setImageResource(R.drawable.ic_fullscreen_exit_white_24dp)
}
Configuration.ORIENTATION_UNDEFINED -> {
exo_fullscreen_button.setImageResource(R.drawable.ic_fullscreen_exit_white_24dp)
}
else -> {
//This is to catch SmoothStreaming and
//DASH types which we won't support currently, just don't add it
}
}
}
return mediaSourceList
}
}

This file was deleted.

Loading

0 comments on commit e49bef7

Please sign in to comment.