Created
February 11, 2022 14:25
-
-
Save fatihkurcenli/f3b23f60a92dfd8ab2aba9b36ef5cfa8 to your computer and use it in GitHub Desktop.
MainActivity.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class MainActivity : AppCompatActivity() { | |
private lateinit var exoPlayer: SimpleExoPlayer | |
private lateinit var dataSourceFactory: DataSource.Factory | |
private lateinit var trackSelector: DefaultTrackSelector | |
private lateinit var playerView: PlayerView | |
private lateinit var exoQuality: ImageButton | |
private var currentWindow = 0 | |
private var playbackPosition: Long = 0 | |
private var isFullscreen = false | |
private var isPlayerPlaying = true | |
private var trackDialog: Dialog? = null | |
private val mediaItem = MediaItem.Builder() | |
.setUri(HLS_STATIC_URL) | |
.setMimeType(MimeTypes.APPLICATION_M3U8) | |
.build() | |
override fun onCreate(savedInstanceState: Bundle?) { | |
super.onCreate(savedInstanceState) | |
setContentView(R.layout.activity_main) | |
playerView = findViewById(R.id.player_view) | |
exoQuality = playerView.findViewById(R.id.exo_quality) | |
dataSourceFactory = DefaultDataSourceFactory( | |
this, | |
Util.getUserAgent(this, "VideoQualityApp") | |
) | |
exoQuality.setOnClickListener { | |
if (trackDialog == null) { | |
initPopupQuality() | |
} | |
trackDialog?.show() | |
} | |
if (savedInstanceState != null) { | |
currentWindow = savedInstanceState.getInt(STATE_RESUME_WINDOW) | |
playbackPosition = savedInstanceState.getLong(STATE_RESUME_POSITION) | |
isFullscreen = savedInstanceState.getBoolean(STATE_PLAYER_FULLSCREEN) | |
isPlayerPlaying = savedInstanceState.getBoolean(STATE_PLAYER_PLAYING) | |
} | |
} | |
private fun initPlayer() { | |
trackSelector = DefaultTrackSelector(this) | |
trackSelector.setParameters( | |
trackSelector.buildUponParameters().setMaxVideoSize(MAX_WIDTH, MAX_HEIGHT) | |
) | |
exoPlayer = SimpleExoPlayer.Builder(this).setTrackSelector(trackSelector).build().apply { | |
playWhenReady = isPlayerPlaying | |
seekTo(currentWindow, playbackPosition) | |
setMediaItem(mediaItem) | |
prepare() | |
} | |
playerView.player = exoPlayer | |
exoPlayer.addListener(object : Player.Listener { | |
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) { | |
if (playbackState == Player.STATE_READY) { | |
exoQuality.visibility = View.VISIBLE | |
} | |
} | |
}) | |
} | |
private fun releasePlayer() { | |
isPlayerPlaying = exoPlayer.playWhenReady | |
playbackPosition = exoPlayer.currentPosition | |
currentWindow = exoPlayer.currentWindowIndex | |
exoPlayer.release() | |
} | |
override fun onSaveInstanceState(outState: Bundle) { | |
outState.putInt(STATE_RESUME_WINDOW, exoPlayer.currentWindowIndex) | |
outState.putLong(STATE_RESUME_POSITION, exoPlayer.currentPosition) | |
outState.putBoolean(STATE_PLAYER_FULLSCREEN, isFullscreen) | |
outState.putBoolean(STATE_PLAYER_PLAYING, isPlayerPlaying) | |
super.onSaveInstanceState(outState) | |
} | |
override fun onStart() { | |
super.onStart() | |
if (Util.SDK_INT > 23) { | |
initPlayer() | |
playerView.onResume() | |
} | |
} | |
override fun onResume() { | |
super.onResume() | |
if (Util.SDK_INT <= 23) { | |
initPlayer() | |
playerView.onResume() | |
} | |
} | |
override fun onPause() { | |
super.onPause() | |
if (Util.SDK_INT <= 23) { | |
playerView.onPause() | |
releasePlayer() | |
} | |
} | |
override fun onStop() { | |
super.onStop() | |
if (Util.SDK_INT > 23) { | |
playerView.onPause() | |
releasePlayer() | |
} | |
} | |
private fun initPopupQuality() { | |
val mappedTrackInfo = trackSelector.currentMappedTrackInfo | |
var videoRenderer: Int? = null | |
if (mappedTrackInfo == null) return else exoQuality.visibility = View.VISIBLE | |
for (i in 0 until mappedTrackInfo.rendererCount) { | |
if (isVideoRenderer(mappedTrackInfo, i)) { | |
videoRenderer = i | |
} | |
} | |
if (videoRenderer == null) { | |
exoQuality.visibility = View.GONE | |
return | |
} | |
val trackSelectionDialogBuilder = TrackSelectionDialogBuilder( | |
this, | |
getString(R.string.qualitySelector), | |
trackSelector, | |
videoRenderer | |
) | |
trackSelectionDialogBuilder.setTrackNameProvider { | |
getString(R.string.exo_track_resolution_pixel, it.height) | |
} | |
trackDialog = trackSelectionDialogBuilder.build() | |
} | |
private fun isVideoRenderer( | |
mappedTrackInfo: MappingTrackSelector.MappedTrackInfo, | |
rendererIndex: Int | |
): Boolean { | |
val trackGroupArray = mappedTrackInfo.getTrackGroups(rendererIndex) | |
if (trackGroupArray.length == 0) { | |
return false | |
} | |
val trackType = mappedTrackInfo.getRendererType(rendererIndex) | |
return C.TRACK_TYPE_VIDEO == trackType | |
} | |
companion object { | |
private const val STATE_RESUME_WINDOW = "resumeWindow" | |
private const val STATE_RESUME_POSITION = "resumePosition" | |
private const val STATE_PLAYER_FULLSCREEN = "playerFullscreen" | |
private const val STATE_PLAYER_PLAYING = "playerOnPlay" | |
private const val MAX_HEIGHT = 1920 | |
private const val MAX_WIDTH = 1080 | |
private const val IP_CONFIG = "" //Your Ipv4 address | |
private const val HLS_STATIC_URL = "http://$IP_CONFIG:80/hls-server/input/master.m3u8" | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment