From 70d7f55cf6561dbc793b488b82c341213a67d13a Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Wed, 10 Jul 2024 16:31:08 +0200 Subject: [PATCH] put viewmodel into fragment --- app/build.gradle.kts | 3 +-- .../net/newpipe/newplayer/PlayerFragment.kt | 10 ++++++++-- .../newplayer/model/VideoPlayerViewModel.kt | 18 ++++++++++++++---- .../net/newpipe/newplayer/ui/VideoPlayerUI.kt | 19 +++++++------------ app/src/main/res/layout/player_framgent.xml | 2 +- gradle/libs.versions.toml | 3 ++- 6 files changed, 33 insertions(+), 22 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9a1933b..d893b08 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -68,7 +68,6 @@ android { } dependencies { - implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) implementation(libs.material) @@ -83,7 +82,7 @@ dependencies { implementation(libs.hilt.android) implementation(libs.androidx.lifecycle.viewmodel.compose) implementation(libs.androidx.foundation) - implementation(libs.androidx.runtime.livedata) + implementation(libs.androidx.fragment.ktx) ksp(libs.hilt.android.compiler) ksp(libs.androidx.hilt.compiler) implementation(libs.androidx.hilt.navigation.compose) diff --git a/app/src/main/java/net/newpipe/newplayer/PlayerFragment.kt b/app/src/main/java/net/newpipe/newplayer/PlayerFragment.kt index 9a3504e..e5eb7d9 100644 --- a/app/src/main/java/net/newpipe/newplayer/PlayerFragment.kt +++ b/app/src/main/java/net/newpipe/newplayer/PlayerFragment.kt @@ -27,13 +27,19 @@ import android.view.ViewGroup import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.hilt.navigation.compose.hiltViewModel import dagger.hilt.android.AndroidEntryPoint +import net.newpipe.newplayer.model.VideoPlayerViewModel +import net.newpipe.newplayer.model.VideoPlayerViewModelImpl import net.newpipe.newplayer.ui.VideoPlayerControllerUI import net.newpipe.newplayer.ui.VideoPlayerUI import net.newpipe.newplayer.ui.theme.VideoPlayerTheme @AndroidEntryPoint -class PlayerFragment : Fragment() { +class PlayerFragment() : Fragment() { + + private val viewModel: VideoPlayerViewModel by viewModels() override fun onCreateView( inflater: LayoutInflater, @@ -47,7 +53,7 @@ class PlayerFragment : Fragment() { setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) setContent { VideoPlayerTheme { - VideoPlayerUI() + VideoPlayerUI(viewModel) } } } diff --git a/app/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModel.kt b/app/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModel.kt index 35ddcb4..903aa5d 100644 --- a/app/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModel.kt +++ b/app/src/main/java/net/newpipe/newplayer/model/VideoPlayerViewModel.kt @@ -34,14 +34,14 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update data class VideoPlayerUIState( + val playing: Boolean, var fullscreen: Boolean, - var playing: Boolean, var uiVissible: Boolean ){ companion object { val DEFAULT = VideoPlayerUIState( + playing = true, fullscreen = false, - playing = false, uiVissible = false ) } @@ -52,6 +52,7 @@ interface VideoPlayerViewModel { val uiState: StateFlow fun play() fun pause() + fun uiResume() fun prevStream() fun nextStream() fun switchToFullscreen() @@ -81,17 +82,22 @@ class VideoPlayerViewModelImpl @Inject constructor( override fun play() { player.play() mutableUiState.update { - it.copy(playing = true) + it.copy(playing = player.isPlaying) } } override fun pause() { player.pause() + mutableUiState.update { - it.copy(playing = false) + it.copy(playing = player.isPlaying) } } + override fun uiResume() { + play() + } + override fun prevStream() { println("imeplement prev stream") } @@ -136,6 +142,10 @@ class VideoPlayerViewModelImpl @Inject constructor( println("dummy pause") } + override fun uiResume() { + println("dummy ui resume") + } + override fun prevStream() { println("dummy impl") } diff --git a/app/src/main/java/net/newpipe/newplayer/ui/VideoPlayerUI.kt b/app/src/main/java/net/newpipe/newplayer/ui/VideoPlayerUI.kt index df1a23c..6fe18cf 100644 --- a/app/src/main/java/net/newpipe/newplayer/ui/VideoPlayerUI.kt +++ b/app/src/main/java/net/newpipe/newplayer/ui/VideoPlayerUI.kt @@ -20,6 +20,7 @@ package net.newpipe.newplayer.ui +import android.view.SurfaceView import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.Surface import androidx.compose.runtime.Composable @@ -37,15 +38,13 @@ import androidx.compose.ui.viewinterop.AndroidView import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver -import androidx.media3.ui.PlayerView import net.newpipe.newplayer.model.VideoPlayerViewModel import net.newpipe.newplayer.model.VideoPlayerViewModelImpl import net.newpipe.newplayer.ui.theme.VideoPlayerTheme - @Composable fun VideoPlayerUI( - viewModel: VideoPlayerViewModel = hiltViewModel() + viewModel: VideoPlayerViewModel ) { val uiState by viewModel.uiState.collectAsState() @@ -73,29 +72,25 @@ fun VideoPlayerUI( AndroidView( modifier = Modifier.fillMaxSize(), factory = { context -> - PlayerView(context).also { - it.player = viewModel.player - it.useController = false + SurfaceView(context).also { + viewModel.player?.setVideoSurfaceView(it) } }, update = { when (lifecycle) { Lifecycle.Event.ON_PAUSE -> { - it.onPause() viewModel.pause() } Lifecycle.Event.ON_RESUME -> { - it.onResume() - } - - Lifecycle.Event.ON_START -> { - viewModel.play() + viewModel.uiResume() } else -> Unit } }) + val isPlaying = viewModel.player!!.isPlaying + println("is Player playing: $isPlaying") VideoPlayerControllerUI( isPlaying = viewModel.player?.isPlaying ?: false, isFullscreen = uiState.fullscreen, diff --git a/app/src/main/res/layout/player_framgent.xml b/app/src/main/res/layout/player_framgent.xml index 5ee70d5..7c28fb4 100644 --- a/app/src/main/res/layout/player_framgent.xml +++ b/app/src/main/res/layout/player_framgent.xml @@ -30,7 +30,7 @@ + android:layout_height="wrap_content" /> diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d2f1d56..58eca62 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -38,6 +38,7 @@ hiltNavigationCompose = "1.2.0" lifecycleViewmodelCompose = "2.8.3" kspVersion = "1.9.0-1.0.13" runtimeLivedata = "1.7.0-beta04" +fragmentKtx = "1.8.1" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -60,7 +61,7 @@ androidx-hilt-navigation-compose = { group = "androidx.hilt", name = "hilt-navig hilt-android-compiler = { group = "com.google.dagger", name = "hilt-android-compiler", version.ref = "hiltAndroid" } androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycleViewmodelCompose" } androidx-foundation = { group = "androidx.compose.foundation", name = "foundation", version.ref = "uiTooling" } -androidx-runtime-livedata = { group = "androidx.compose.runtime", name = "runtime-livedata", version.ref = "runtimeLivedata" } +androidx-fragment-ktx = { group = "androidx.fragment", name = "fragment-ktx", version.ref = "fragmentKtx" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" }