Improve ExoPlayer (hide systembars and keep screen on)
This commit is contained in:
parent
fcbd7d1f33
commit
7f5dea58bc
5 changed files with 65 additions and 47 deletions
|
@ -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
|
||||||
|
|
|
@ -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())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in a new issue