From 47ad16c03d41d40d0604c60c5132510ba9197d23 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sat, 24 Aug 2024 19:09:35 +0200 Subject: [PATCH] make initial logic for NewPlayer and MediaReop --- .../net/newpipe/newplayer/MediaRepository.kt | 11 +-- .../java/net/newpipe/newplayer/NewPlayer.kt | 6 +- .../newpipe/newplayer/model/UIModeState.kt | 19 +++--- .../model/VideoPlayerViewModelImpl.kt | 23 +++++-- test-app/build.gradle.kts | 4 ++ .../newpipe/newplayer/testapp/MainActivity.kt | 24 +++---- .../newpipe/newplayer/testapp/NewPlayerApp.kt | 17 ++++- .../newplayer/testapp/NewPlayerComponent.kt | 16 ++++- .../newplayer/testapp/TestMediaRepository.kt | 68 +++++++++++++++---- .../main/res/layout-land/activity_main.xml | 6 +- .../src/main/res/layout/activity_main.xml | 10 +-- test-app/src/main/res/values/test_streams.xml | 16 +++-- 12 files changed, 159 insertions(+), 61 deletions(-) diff --git a/new-player/src/main/java/net/newpipe/newplayer/MediaRepository.kt b/new-player/src/main/java/net/newpipe/newplayer/MediaRepository.kt index 5ce7c4c..eb9d32b 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/MediaRepository.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/MediaRepository.kt @@ -31,17 +31,18 @@ interface MediaRepository { suspend fun getTitle(item: String) : String suspend fun getChannelName(item: String): String suspend fun getThumbnail(item: String): Thumbnail - suspend fun getAvailableStreamVariants(item: String): List - suspend fun getAvailableSubtitleVariants(item: String): List + suspend fun getAvailableStreamVariants(item: String): List suspend fun getStream(item: String, streamSelector: String) : Uri - suspend fun getSubtitle(item: String, ) + + suspend fun getAvailableSubtitleVariants(item: String): List + suspend fun getSubtitle(item: String, variant: String): Uri suspend fun getPreviewThumbnails(item: String) : HashMap? suspend fun getChapters(item: String): List - suspend fun getChapterThumbnail(item: String, chapter: Long) : Thumbnail + suspend fun getChapterThumbnail(item: String, chapter: Long) : Thumbnail? - suspend fun getTimestampLink(item: String, timestampInSeconds: Long) + suspend fun getTimestampLink(item: String, timestampInSeconds: Long): String suspend fun tryAndRescueError(item: String?, exception: PlaybackException) : Uri? } \ No newline at end of file diff --git a/new-player/src/main/java/net/newpipe/newplayer/NewPlayer.kt b/new-player/src/main/java/net/newpipe/newplayer/NewPlayer.kt index 115f798..667bc79 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/NewPlayer.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/NewPlayer.kt @@ -128,7 +128,7 @@ class NewPlayerImpl( override var fastSeekAmountSec: Int = 10 override var playBackMode: PlayMode = PlayMode.EMBEDDED_VIDEO - private var playerScope = CoroutineScope(Dispatchers.Default + Job()) + private var playerScope = CoroutineScope(Dispatchers.Main + Job()) override var playMode = MutableStateFlow(null) @@ -192,7 +192,7 @@ class NewPlayerImpl( override fun playStream(item: String, streamVariant: String, playMode: PlayMode) { launchJobAndCollectError { - val stream = toMediaItem(item) + val stream = toMediaItem(item, streamVariant) internalPlayStream(stream, playMode) } } @@ -202,6 +202,8 @@ class NewPlayerImpl( internalPlayer.prepare() } this.playMode.update { playMode } + this.internalPlayer.setMediaItem(mediaItem) + this.internalPlayer.play() } private suspend fun toMediaItem(item: String, streamVariant: String): MediaItem { diff --git a/new-player/src/main/java/net/newpipe/newplayer/model/UIModeState.kt b/new-player/src/main/java/net/newpipe/newplayer/model/UIModeState.kt index af5b6d5..3b682bb 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/model/UIModeState.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/model/UIModeState.kt @@ -98,13 +98,16 @@ enum class UIModeState { companion object { - fun fromPlayMode(playMode: PlayMode) = - when (playMode) { - PlayMode.EMBEDDED_VIDEO -> EMBEDDED_VIDEO - PlayMode.FULLSCREEN_VIDEO -> FULLSCREEN_VIDEO - PlayMode.PIP -> TODO() - PlayMode.BACKGROUND -> TODO() - PlayMode.AUDIO_FOREGROUND -> TODO() - } + fun fromPlayMode(playMode: PlayMode?) = + if (playMode != null) + when (playMode) { + PlayMode.EMBEDDED_VIDEO -> EMBEDDED_VIDEO + PlayMode.FULLSCREEN_VIDEO -> FULLSCREEN_VIDEO + PlayMode.PIP -> TODO() + PlayMode.BACKGROUND -> TODO() + PlayMode.AUDIO_FOREGROUND -> TODO() + } + else PLACEHOLDER + } } \ No newline at end of file diff --git a/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModelImpl.kt b/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModelImpl.kt index 3f8745c..e99174d 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModelImpl.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModelImpl.kt @@ -28,6 +28,7 @@ import android.util.Log import androidx.annotation.RequiresApi import androidx.core.content.ContextCompat.getSystemService import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.Lifecycle import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import androidx.media3.common.Player @@ -77,7 +78,7 @@ class VideoPlayerViewModelImpl @Inject constructor( override var newPlayer: NewPlayer? = null set(value) { field = value - installExoPlayer() + installNewPlayer() } override val uiState = mutableUiState.asStateFlow() @@ -118,7 +119,7 @@ class VideoPlayerViewModelImpl @Inject constructor( } } - private fun installExoPlayer() { + private fun installNewPlayer() { internalPlayer?.let { player -> Log.d(TAG, "Install player: ${player.videoSize.width}") @@ -137,17 +138,29 @@ class VideoPlayerViewModelImpl @Inject constructor( updateContentRatio(VideoSize.fromMedia3VideoSize(videoSize)) } + + // TODO: This is not correctly applicable for loading indicator override fun onIsLoadingChanged(isLoading: Boolean) { super.onIsLoadingChanged(isLoading) mutableUiState.update { it.copy(isLoading = isLoading) } - Log.i( - TAG, if (isLoading) "Player started loading" else "Player finished loading" - ) } }) } + newPlayer?.let{ newPlayer -> + viewModelScope.launch { + while(true) { + newPlayer.playMode.collect { mode -> + println("blub: $mode") + mutableUiState.update { + it.copy(uiMode = UIModeState.fromPlayMode(mode)) + } + } + } + } + } + } fun updateContentRatio(videoSize: VideoSize) { diff --git a/test-app/build.gradle.kts b/test-app/build.gradle.kts index 9b7899e..0fc111b 100644 --- a/test-app/build.gradle.kts +++ b/test-app/build.gradle.kts @@ -31,6 +31,10 @@ android { namespace = "net.newpipe.newplayer.testapp" compileSdk = 34 + viewBinding { + enable = true + } + buildFeatures { compose = true } diff --git a/test-app/src/main/java/net/newpipe/newplayer/testapp/MainActivity.kt b/test-app/src/main/java/net/newpipe/newplayer/testapp/MainActivity.kt index f9924f7..2562364 100644 --- a/test-app/src/main/java/net/newpipe/newplayer/testapp/MainActivity.kt +++ b/test-app/src/main/java/net/newpipe/newplayer/testapp/MainActivity.kt @@ -38,6 +38,7 @@ import net.newpipe.newplayer.PlayMode import net.newpipe.newplayer.VideoPlayerView import net.newpipe.newplayer.model.VideoPlayerViewModel import net.newpipe.newplayer.model.VideoPlayerViewModelImpl +import net.newpipe.newplayer.testapp.databinding.ActivityMainBinding import net.newpipe.newplayer.ui.ContentScale import javax.inject.Inject @@ -51,20 +52,17 @@ class MainActivity : AppCompatActivity() { var activityBrainSlug: ActivityBrainSlug? = null + lateinit var binding: ActivityMainBinding + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() - setContentView(R.layout.activity_main) + binding = ActivityMainBinding.inflate(layoutInflater) + setContentView(binding.root) - val embeddedPlayer = findViewById(R.id.new_player_video_view) - val startStreamButton = findViewById