From e421430f0bb9442b2507722af1739d51f9ae201f Mon Sep 17 00:00:00 2001 From: Rune Dyselinck Date: Fri, 28 Apr 2023 14:42:37 +0200 Subject: [PATCH] mediaplayer in AbstractSessionScreen + InvisibleSessionManagerTest.kt fixed --- .../timer_functional/FunctionalCustomTimer.kt | 6 ---- .../FunctionalPomodoroTimer.kt | 10 ++----- .../timer_functional/FunctionalTimer.kt | 3 -- .../session/InvisibleSessionManager.kt | 5 +++- .../studeez/screens/session/SessionRoute.kt | 7 ++--- .../sessionScreens/AbstractSessionScreen.kt | 4 +++ .../sessionScreens/BreakSessionScreen.kt | 15 +++++++++- .../sessionScreens/CustomSessionScreen.kt | 14 ++++++++- .../sessionScreens/EndlessSessionScreen.kt | 2 ++ .../sessionScreens/GetSessionScreen.kt | 7 +++-- .../InvisibleSessionManagerTest.kt | 30 ++++++++----------- 11 files changed, 59 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/FunctionalCustomTimer.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/FunctionalCustomTimer.kt index 0d1c4f5..94871ee 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/FunctionalCustomTimer.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/FunctionalCustomTimer.kt @@ -5,12 +5,6 @@ class FunctionalCustomTimer(studyTime: Int) : FunctionalTimer(studyTime) { override fun tick() { if (!hasEnded()) { time.minOne() - } else { - mediaPlayer?.setOnCompletionListener { - mediaPlayer!!.release() - mediaPlayer = null - } - mediaPlayer?.start() } } diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/FunctionalPomodoroTimer.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/FunctionalPomodoroTimer.kt index 8189559..6dac7c6 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/FunctionalPomodoroTimer.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/FunctionalPomodoroTimer.kt @@ -10,14 +10,10 @@ class FunctionalPomodoroTimer( override fun tick() { if (hasEnded()) { - mediaPlayer?.setOnCompletionListener { - mediaPlayer!!.release() - mediaPlayer = null - } - mediaPlayer?.start() return - } else if (hasCurrentCountdownEnded()) { - mediaPlayer?.start() + } + + if (hasCurrentCountdownEnded()) { if (isInBreak) { breaksRemaining-- time.time = studyTime diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/FunctionalTimer.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/FunctionalTimer.kt index daec359..2d904d8 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/FunctionalTimer.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/FunctionalTimer.kt @@ -1,10 +1,7 @@ package be.ugent.sel.studeez.data.local.models.timer_functional -import android.media.MediaPlayer - abstract class FunctionalTimer(initialValue: Int) { val time: Time = Time(initialValue) - var mediaPlayer: MediaPlayer? = null fun getHoursMinutesSeconds(): HoursMinutesSeconds { return time.getAsHMS() diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/InvisibleSessionManager.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/InvisibleSessionManager.kt index 4c43d13..68fe703 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/InvisibleSessionManager.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/InvisibleSessionManager.kt @@ -1,5 +1,6 @@ package be.ugent.sel.studeez.screens.session +import android.media.MediaPlayer import kotlinx.coroutines.delay import javax.inject.Singleton import kotlin.time.Duration.Companion.seconds @@ -7,8 +8,9 @@ import kotlin.time.Duration.Companion.seconds @Singleton object InvisibleSessionManager { private var viewModel: SessionViewModel? = null + private var mediaPlayer: MediaPlayer? = null - fun setParameters(viewModel: SessionViewModel) { + fun setParameters(viewModel: SessionViewModel, mediaplayer: MediaPlayer) { this.viewModel = viewModel } @@ -17,6 +19,7 @@ object InvisibleSessionManager { while (true) { delay(1.seconds) viewModel!!.getTimer().tick() + } } } diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt index d13c6c1..680212d 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt @@ -38,13 +38,12 @@ fun SessionRoute( val mediaplayer = MediaPlayer.create(context, uri) mediaplayer.isLooping = false - viewModel.getTimer().mediaPlayer = mediaplayer - InvisibleSessionManager.setParameters( - viewModel = viewModel + viewModel = viewModel, + mediaplayer = mediaplayer ) - val sessionScreen: AbstractSessionScreen = viewModel.getTimer().accept(GetSessionScreen()) + val sessionScreen: AbstractSessionScreen = viewModel.getTimer().accept(GetSessionScreen(mediaplayer)) sessionScreen( open = open, diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/AbstractSessionScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/AbstractSessionScreen.kt index 0804abf..f268edb 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/AbstractSessionScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/AbstractSessionScreen.kt @@ -73,6 +73,7 @@ abstract class AbstractSessionScreen { LaunchedEffect(tikker) { delay(1.seconds) sessionActions.getTimer().tick() + callMediaPlayer() tikker = !tikker } @@ -122,6 +123,8 @@ abstract class AbstractSessionScreen { @Composable abstract fun motivationString(): String + abstract fun callMediaPlayer() + } @Preview @@ -130,6 +133,7 @@ fun TimerPreview() { val sessionScreen = object : AbstractSessionScreen() { @Composable override fun motivationString(): String = "Test" + override fun callMediaPlayer() {} } sessionScreen.Timer(sessionActions = SessionActions({ FunctionalEndlessTimer() }, { "Preview" }, {}, {})) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakSessionScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakSessionScreen.kt index edc8475..34927bc 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakSessionScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakSessionScreen.kt @@ -1,5 +1,6 @@ package be.ugent.sel.studeez.screens.session.sessionScreens +import android.media.MediaPlayer import androidx.compose.runtime.Composable import be.ugent.sel.studeez.R import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalPomodoroTimer @@ -7,7 +8,8 @@ import be.ugent.sel.studeez.resources import be.ugent.sel.studeez.R.string as AppText class BreakSessionScreen( - private val funPomoDoroTimer: FunctionalPomodoroTimer + private val funPomoDoroTimer: FunctionalPomodoroTimer, + private var mediaplayer: MediaPlayer? ): AbstractSessionScreen() { @Composable @@ -27,4 +29,15 @@ class BreakSessionScreen( ) } + override fun callMediaPlayer() { + if (funPomoDoroTimer.hasEnded()) { + mediaplayer?.setOnCompletionListener { + mediaplayer!!.release() + mediaplayer = null + } + mediaplayer?.start() + } else if (funPomoDoroTimer.hasCurrentCountdownEnded()) { + mediaplayer?.start() + } + } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/CustomSessionScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/CustomSessionScreen.kt index 36ee492..e998645 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/CustomSessionScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/CustomSessionScreen.kt @@ -1,5 +1,6 @@ package be.ugent.sel.studeez.screens.session.sessionScreens +import android.media.MediaPlayer import androidx.compose.runtime.Composable import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalCustomTimer import be.ugent.sel.studeez.resources @@ -7,7 +8,8 @@ import be.ugent.sel.studeez.R.string as AppText class CustomSessionScreen( - private val functionalTimer: FunctionalCustomTimer + private val functionalTimer: FunctionalCustomTimer, + private var mediaplayer: MediaPlayer? ): AbstractSessionScreen() { @Composable @@ -18,4 +20,14 @@ class CustomSessionScreen( return resources().getString(AppText.state_focus) } + override fun callMediaPlayer() { + if (functionalTimer.hasEnded()) { + mediaplayer?.setOnCompletionListener { + mediaplayer!!.release() + mediaplayer = null + } + mediaplayer?.start() + } + } + } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/EndlessSessionScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/EndlessSessionScreen.kt index fc46c9d..be67cff 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/EndlessSessionScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/EndlessSessionScreen.kt @@ -11,4 +11,6 @@ class EndlessSessionScreen : AbstractSessionScreen() { override fun motivationString(): String { return resources().getString(AppText.state_focus) } + + override fun callMediaPlayer() {} } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/GetSessionScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/GetSessionScreen.kt index e378661..98b2d5e 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/GetSessionScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/GetSessionScreen.kt @@ -1,17 +1,18 @@ package be.ugent.sel.studeez.screens.session.sessionScreens +import android.media.MediaPlayer import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalCustomTimer import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalEndlessTimer import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalPomodoroTimer import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimerVisitor -class GetSessionScreen : FunctionalTimerVisitor { +class GetSessionScreen(private val mediaplayer: MediaPlayer?) : FunctionalTimerVisitor { override fun visitFunctionalCustomTimer(functionalCustomTimer: FunctionalCustomTimer): AbstractSessionScreen = - CustomSessionScreen(functionalCustomTimer) + CustomSessionScreen(functionalCustomTimer, mediaplayer) override fun visitFunctionalEndlessTimer(functionalEndlessTimer: FunctionalEndlessTimer): AbstractSessionScreen = EndlessSessionScreen() override fun visitFunctionalBreakTimer(functionalPomodoroTimer: FunctionalPomodoroTimer): AbstractSessionScreen = - BreakSessionScreen(functionalPomodoroTimer) + BreakSessionScreen(functionalPomodoroTimer, mediaplayer) } \ No newline at end of file diff --git a/app/src/test/java/be/ugent/sel/studeez/timer_functional/InvisibleSessionManagerTest.kt b/app/src/test/java/be/ugent/sel/studeez/timer_functional/InvisibleSessionManagerTest.kt index fe0d1c2..60740d9 100644 --- a/app/src/test/java/be/ugent/sel/studeez/timer_functional/InvisibleSessionManagerTest.kt +++ b/app/src/test/java/be/ugent/sel/studeez/timer_functional/InvisibleSessionManagerTest.kt @@ -5,7 +5,6 @@ import be.ugent.sel.studeez.data.SelectedTimerState import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalCustomTimer import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalEndlessTimer import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalPomodoroTimer -import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimer import be.ugent.sel.studeez.screens.session.InvisibleSessionManager import be.ugent.sel.studeez.screens.session.SessionViewModel import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -20,7 +19,7 @@ import org.mockito.kotlin.mock class InvisibleSessionManagerTest { private var timerState: SelectedTimerState = SelectedTimerState() private lateinit var viewModel: SessionViewModel - private val mediaPlayer = mock() + private var mediaPlayer: MediaPlayer = mock() @Test fun InvisibleEndlessTimerTest() = runTest { @@ -58,25 +57,20 @@ class InvisibleSessionManagerTest { advanceTimeBy(1_000) // start tikker advanceTimeBy(9_000) - Assert.assertEquals(viewModel.getTimer().view, FunctionalTimer.StudyState.FOCUS) // Tijdens het focussen + Assert.assertEquals(viewModel.getTimer().time.time, 1) + // focus, 9 sec, 1 sec nog - advanceTimeBy(1_000) - Assert.assertEquals(viewModel.getTimer().time.time, 0) // Focussen gedaan + advanceTimeBy(2_000) + Assert.assertEquals(viewModel.getTimer().time.time, 4) + // pauze, 11 sec bezig, 4 seconden nog pauze - advanceTimeBy(4_000) - Assert.assertEquals(viewModel.getTimer().view, FunctionalTimer.StudyState.BREAK) // Tijdens pauze + advanceTimeBy(5_000) + Assert.assertEquals(viewModel.getTimer().time.time, 9) + // 2e focus, 16 sec, 9 sec in 2e focus nog - advanceTimeBy(1_000) - Assert.assertEquals(viewModel.getTimer().time.time, 0) // Pauze gedaan - - advanceTimeBy(9_000) - Assert.assertEquals(viewModel.getTimer().view, FunctionalTimer.StudyState.FOCUS_REMAINING) // Tijdens 2e focus - - advanceTimeBy(1_000) - Assert.assertEquals(viewModel.getTimer().time.time, 0) // 2e focus gedaan - - advanceTimeBy(4_000) - Assert.assertEquals(viewModel.getTimer().view, FunctionalTimer.StudyState.DONE) // Done + advanceTimeBy(13_000) + Assert.assertTrue(viewModel.getTimer().hasEnded()) + // Done test.cancel() return@runTest