diff --git a/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModel.kt b/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModel.kt index f340b85..973768a 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModel.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModel.kt @@ -110,6 +110,7 @@ class VideoPlayerViewModelImpl @Inject constructor( private val mutableUiState = MutableStateFlow(VideoPlayerUIState.DEFAULT) private var currentContentRatio = 1F private var uiVisibilityJob: Job? = null + private var progressUpdaterJob: Job? = null //interface override var callbackListener: VideoPlayerViewModel.Listener? = null @@ -227,12 +228,12 @@ class VideoPlayerViewModelImpl @Inject constructor( } override fun prevStream() { - resetHideUiDelayed() + resetHideUiDelayedJob() Log.e(TAG, "imeplement prev stream") } override fun nextStream() { - resetHideUiDelayed() + resetHideUiDelayedJob() Log.e(TAG, "implement next stream") } @@ -243,10 +244,11 @@ class VideoPlayerViewModelImpl @Inject constructor( mutableUiState.update { it.copy(uiVissible = true) } - resetHideUiDelayed() + resetHideUiDelayedJob() + resetProgressUpdatePeriodicallyJob() } - private fun resetHideUiDelayed() { + private fun resetHideUiDelayedJob() { uiVisibilityJob?.cancel() uiVisibilityJob = viewModelScope.launch { delay(4000) @@ -254,10 +256,32 @@ class VideoPlayerViewModelImpl @Inject constructor( } } + private fun resetProgressUpdatePeriodicallyJob() { + progressUpdaterJob?.cancel() + progressUpdaterJob = viewModelScope.launch { + while(true) { + updateProgressOnce() + delay(1000) + } + } + + } + + private fun updateProgressOnce() { + val progress = player?.currentPosition ?: 0 + val duration = player?.duration ?: 1 + val progressPercentage = progress.toFloat() / duration.toFloat() + mutableUiState.update { + it.copy(seekerPosition = progressPercentage) + } + Log.i(TAG, "Progress: $progress, Duration: $duration") + } + override fun hideUi() { if (mutableUiState.value.fullscreen) callbackListener?.onUiVissibleToggle(false) + progressUpdaterJob?.cancel() uiVisibilityJob?.cancel() mutableUiState.update { it.copy(uiVissible = false) @@ -270,7 +294,7 @@ class VideoPlayerViewModelImpl @Inject constructor( } override fun seekingFinished() { - resetHideUiDelayed() + resetHideUiDelayedJob() Log.d(TAG, "TODO: Implement seeking Finished") } 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 33b5c61..032bef5 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 @@ -59,7 +59,7 @@ class MainActivity : AppCompatActivity() { startStreamButton.setOnClickListener { newPlayer.playWhenReady = true - newPlayer.setStream(getString(R.string.ccc_6502_video)) + newPlayer.setStream(getString(R.string.portrait_video_example)) } videoPlayerViewModel.newPlayer = newPlayer