Improve ExoPlayer (hide systembars and keep screen on)

This commit is contained in:
Jarne Demeulemeester 2021-07-10 14:02:02 +02:00
parent fcbd7d1f33
commit 7f5dea58bc
No known key found for this signature in database
GPG key ID: 60884A0C1EBA43E5
5 changed files with 65 additions and 47 deletions

View file

@ -90,7 +90,6 @@ dependencies {
// ExoPlayer // ExoPlayer
def exoplayer_version = "2.14.1" def exoplayer_version = "2.14.1"
implementation "com.google.android.exoplayer:exoplayer-core:$exoplayer_version" implementation "com.google.android.exoplayer:exoplayer-core:$exoplayer_version"
implementation "com.google.android.exoplayer:exoplayer-dash:$exoplayer_version"
implementation "com.google.android.exoplayer:exoplayer-ui:$exoplayer_version" implementation "com.google.android.exoplayer:exoplayer-ui:$exoplayer_version"
// Testing // Testing

View file

@ -3,15 +3,13 @@ package dev.jdtech.jellyfin
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.view.WindowManager
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
import androidx.navigation.navArgs import androidx.navigation.navArgs
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.trackselection.DefaultTrackSelector
import com.google.android.exoplayer2.ui.PlayerView import com.google.android.exoplayer2.ui.PlayerView
import com.google.android.exoplayer2.util.MimeTypes
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel
@ -23,11 +21,11 @@ class PlayerActivity : AppCompatActivity() {
private lateinit var playerView: PlayerView private lateinit var playerView: PlayerView
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
Log.d("PlayerActivity", "onCreate") Log.d("PlayerActivity", "onCreate")
setContentView(R.layout.activity_player) setContentView(R.layout.activity_player)
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
playerView = findViewById(R.id.video_view) playerView = findViewById(R.id.video_view)
@ -38,10 +36,26 @@ class PlayerActivity : AppCompatActivity() {
if (viewModel.player.value == null) { if (viewModel.player.value == null) {
viewModel.initializePlayer(args.itemId) viewModel.initializePlayer(args.itemId)
} }
hideSystemUI()
} }
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
Log.d("PlayerActivity", "onDestroy") Log.d("PlayerActivity", "onDestroy")
showSystemUI()
}
private fun hideSystemUI() {
WindowCompat.setDecorFitsSystemWindows(window, false)
WindowInsetsControllerCompat(window, playerView).let { controller ->
controller.hide(WindowInsetsCompat.Type.systemBars())
controller.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
}
}
private fun showSystemUI() {
WindowCompat.setDecorFitsSystemWindows(window, true)
WindowInsetsControllerCompat(window, playerView).show(WindowInsetsCompat.Type.systemBars())
} }
} }

View file

@ -1,5 +1,6 @@
package dev.jdtech.jellyfin.repository package dev.jdtech.jellyfin.repository
import android.util.Log
import dev.jdtech.jellyfin.api.JellyfinApi import dev.jdtech.jellyfin.api.JellyfinApi
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@ -63,39 +64,44 @@ class JellyfinRepositoryImpl(private val jellyfinApi: JellyfinApi) : JellyfinRep
override suspend fun getStreamUrl(itemId: UUID): String { override suspend fun getStreamUrl(itemId: UUID): String {
val streamUrl: String val streamUrl: String
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
/*val mediaInfo = jellyfinApi.mediaInfoApi.getPostedPlaybackInfo( try {
itemId, PlaybackInfoDto( val mediaInfo by jellyfinApi.mediaInfoApi.getPostedPlaybackInfo(
userId = jellyfinApi.userId!!, itemId, PlaybackInfoDto(
deviceProfile = DeviceProfile( userId = jellyfinApi.userId!!,
name = "Direct play all", deviceProfile = DeviceProfile(
maxStaticBitrate = 1_000_000_000, name = "Direct play all",
maxStreamingBitrate = 1_000_000_000, maxStaticBitrate = 1_000_000_000,
codecProfiles = listOf(), maxStreamingBitrate = 1_000_000_000,
containerProfiles = listOf(), codecProfiles = listOf(),
directPlayProfiles = listOf( containerProfiles = listOf(),
DirectPlayProfile( directPlayProfiles = listOf(
type = DlnaProfileType.VIDEO DirectPlayProfile(
), DirectPlayProfile(type = DlnaProfileType.AUDIO) type = DlnaProfileType.VIDEO
), DirectPlayProfile(type = DlnaProfileType.AUDIO)
),
transcodingProfiles = listOf(),
responseProfiles = listOf(),
enableAlbumArtInDidl = false,
enableMsMediaReceiverRegistrar = false,
enableSingleAlbumArtLimit = false,
enableSingleSubtitleLimit = false,
ignoreTranscodeByteRangeRequests = false,
maxAlbumArtHeight = 1_000_000_000,
maxAlbumArtWidth = 1_000_000_000,
requiresPlainFolders = false,
requiresPlainVideoItems = false,
timelineOffsetSeconds = 0
), ),
transcodingProfiles = listOf(), startTimeTicks = null,
responseProfiles = listOf(), audioStreamIndex = null,
enableAlbumArtInDidl = false, subtitleStreamIndex = null,
enableMsMediaReceiverRegistrar = false, maxStreamingBitrate = 1_000_000_000,
enableSingleAlbumArtLimit = false, )
enableSingleSubtitleLimit = false,
ignoreTranscodeByteRangeRequests = false,
maxAlbumArtHeight = 1_000_000_000,
maxAlbumArtWidth = 1_000_000_000,
requiresPlainFolders = false,
requiresPlainVideoItems = false,
timelineOffsetSeconds = 0
),
startTimeTicks = null,
audioStreamIndex = null,
subtitleStreamIndex = null,
maxStreamingBitrate = 1_000_000_000,
) )
).content*/ Log.d("JellyfinRepository", mediaInfo.mediaSources.toString())
} catch (e: Exception) {
Log.e("JellyfinRepository", "${e.message}")
}
streamUrl = jellyfinApi.videosApi.getVideoStreamUrl( streamUrl = jellyfinApi.videosApi.getVideoStreamUrl(
itemId, itemId,
static = true, static = true,

View file

@ -9,10 +9,7 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.google.android.exoplayer2.ExoPlayer import com.google.android.exoplayer2.*
import com.google.android.exoplayer2.MediaItem
import com.google.android.exoplayer2.Player
import com.google.android.exoplayer2.SimpleExoPlayer
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector import com.google.android.exoplayer2.trackselection.DefaultTrackSelector
import com.google.android.exoplayer2.util.MimeTypes import com.google.android.exoplayer2.util.MimeTypes
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
@ -43,8 +40,9 @@ constructor(
fun initializePlayer(itemId: UUID) { fun initializePlayer(itemId: UUID) {
if (player.value == null) { if (player.value == null) {
val trackSelector = DefaultTrackSelector(application) val trackSelector = DefaultTrackSelector(application)
val renderersFactory = DefaultRenderersFactory(application).setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON)
trackSelector.parameters.buildUpon().setMaxVideoSizeSd() trackSelector.parameters.buildUpon().setMaxVideoSizeSd()
_player.value = SimpleExoPlayer.Builder(application) _player.value = SimpleExoPlayer.Builder(application, renderersFactory)
.setTrackSelector(trackSelector) .setTrackSelector(trackSelector)
.build() .build()
} }
@ -66,7 +64,7 @@ constructor(
player.value?.prepare() player.value?.prepare()
} }
fun releasePlayer() { private fun releasePlayer() {
if (player.value != null) { if (player.value != null) {
playWhenReady = player.value!!.playWhenReady playWhenReady = player.value!!.playWhenReady
playbackPosition = player.value!!.currentPosition playbackPosition = player.value!!.currentPosition

View file

@ -8,6 +8,7 @@
<com.google.android.exoplayer2.ui.PlayerView <com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/video_view" android:id="@+id/video_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent"
android:background="@color/black"/>
</FrameLayout> </FrameLayout>