mediaplayer in AbstractSessionScreen + InvisibleSessionManagerTest.kt fixed

This commit is contained in:
Rune Dyselinck 2023-04-28 14:42:37 +02:00
parent 46d60e100b
commit e421430f0b
11 changed files with 59 additions and 44 deletions

View file

@ -5,12 +5,6 @@ class FunctionalCustomTimer(studyTime: Int) : FunctionalTimer(studyTime) {
override fun tick() { override fun tick() {
if (!hasEnded()) { if (!hasEnded()) {
time.minOne() time.minOne()
} else {
mediaPlayer?.setOnCompletionListener {
mediaPlayer!!.release()
mediaPlayer = null
}
mediaPlayer?.start()
} }
} }

View file

@ -10,14 +10,10 @@ class FunctionalPomodoroTimer(
override fun tick() { override fun tick() {
if (hasEnded()) { if (hasEnded()) {
mediaPlayer?.setOnCompletionListener {
mediaPlayer!!.release()
mediaPlayer = null
}
mediaPlayer?.start()
return return
} else if (hasCurrentCountdownEnded()) { }
mediaPlayer?.start()
if (hasCurrentCountdownEnded()) {
if (isInBreak) { if (isInBreak) {
breaksRemaining-- breaksRemaining--
time.time = studyTime time.time = studyTime

View file

@ -1,10 +1,7 @@
package be.ugent.sel.studeez.data.local.models.timer_functional package be.ugent.sel.studeez.data.local.models.timer_functional
import android.media.MediaPlayer
abstract class FunctionalTimer(initialValue: Int) { abstract class FunctionalTimer(initialValue: Int) {
val time: Time = Time(initialValue) val time: Time = Time(initialValue)
var mediaPlayer: MediaPlayer? = null
fun getHoursMinutesSeconds(): HoursMinutesSeconds { fun getHoursMinutesSeconds(): HoursMinutesSeconds {
return time.getAsHMS() return time.getAsHMS()

View file

@ -1,5 +1,6 @@
package be.ugent.sel.studeez.screens.session package be.ugent.sel.studeez.screens.session
import android.media.MediaPlayer
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import javax.inject.Singleton import javax.inject.Singleton
import kotlin.time.Duration.Companion.seconds import kotlin.time.Duration.Companion.seconds
@ -7,8 +8,9 @@ import kotlin.time.Duration.Companion.seconds
@Singleton @Singleton
object InvisibleSessionManager { object InvisibleSessionManager {
private var viewModel: SessionViewModel? = null private var viewModel: SessionViewModel? = null
private var mediaPlayer: MediaPlayer? = null
fun setParameters(viewModel: SessionViewModel) { fun setParameters(viewModel: SessionViewModel, mediaplayer: MediaPlayer) {
this.viewModel = viewModel this.viewModel = viewModel
} }
@ -17,6 +19,7 @@ object InvisibleSessionManager {
while (true) { while (true) {
delay(1.seconds) delay(1.seconds)
viewModel!!.getTimer().tick() viewModel!!.getTimer().tick()
} }
} }
} }

View file

@ -38,13 +38,12 @@ fun SessionRoute(
val mediaplayer = MediaPlayer.create(context, uri) val mediaplayer = MediaPlayer.create(context, uri)
mediaplayer.isLooping = false mediaplayer.isLooping = false
viewModel.getTimer().mediaPlayer = mediaplayer
InvisibleSessionManager.setParameters( InvisibleSessionManager.setParameters(
viewModel = viewModel viewModel = viewModel,
mediaplayer = mediaplayer
) )
val sessionScreen: AbstractSessionScreen = viewModel.getTimer().accept(GetSessionScreen()) val sessionScreen: AbstractSessionScreen = viewModel.getTimer().accept(GetSessionScreen(mediaplayer))
sessionScreen( sessionScreen(
open = open, open = open,

View file

@ -73,6 +73,7 @@ abstract class AbstractSessionScreen {
LaunchedEffect(tikker) { LaunchedEffect(tikker) {
delay(1.seconds) delay(1.seconds)
sessionActions.getTimer().tick() sessionActions.getTimer().tick()
callMediaPlayer()
tikker = !tikker tikker = !tikker
} }
@ -122,6 +123,8 @@ abstract class AbstractSessionScreen {
@Composable @Composable
abstract fun motivationString(): String abstract fun motivationString(): String
abstract fun callMediaPlayer()
} }
@Preview @Preview
@ -130,6 +133,7 @@ fun TimerPreview() {
val sessionScreen = object : AbstractSessionScreen() { val sessionScreen = object : AbstractSessionScreen() {
@Composable @Composable
override fun motivationString(): String = "Test" override fun motivationString(): String = "Test"
override fun callMediaPlayer() {}
} }
sessionScreen.Timer(sessionActions = SessionActions({ FunctionalEndlessTimer() }, { "Preview" }, {}, {})) sessionScreen.Timer(sessionActions = SessionActions({ FunctionalEndlessTimer() }, { "Preview" }, {}, {}))

View file

@ -1,5 +1,6 @@
package be.ugent.sel.studeez.screens.session.sessionScreens package be.ugent.sel.studeez.screens.session.sessionScreens
import android.media.MediaPlayer
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import be.ugent.sel.studeez.R import be.ugent.sel.studeez.R
import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalPomodoroTimer 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 import be.ugent.sel.studeez.R.string as AppText
class BreakSessionScreen( class BreakSessionScreen(
private val funPomoDoroTimer: FunctionalPomodoroTimer private val funPomoDoroTimer: FunctionalPomodoroTimer,
private var mediaplayer: MediaPlayer?
): AbstractSessionScreen() { ): AbstractSessionScreen() {
@Composable @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()
}
}
} }

View file

@ -1,5 +1,6 @@
package be.ugent.sel.studeez.screens.session.sessionScreens package be.ugent.sel.studeez.screens.session.sessionScreens
import android.media.MediaPlayer
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalCustomTimer import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalCustomTimer
import be.ugent.sel.studeez.resources import be.ugent.sel.studeez.resources
@ -7,7 +8,8 @@ import be.ugent.sel.studeez.R.string as AppText
class CustomSessionScreen( class CustomSessionScreen(
private val functionalTimer: FunctionalCustomTimer private val functionalTimer: FunctionalCustomTimer,
private var mediaplayer: MediaPlayer?
): AbstractSessionScreen() { ): AbstractSessionScreen() {
@Composable @Composable
@ -18,4 +20,14 @@ class CustomSessionScreen(
return resources().getString(AppText.state_focus) return resources().getString(AppText.state_focus)
} }
override fun callMediaPlayer() {
if (functionalTimer.hasEnded()) {
mediaplayer?.setOnCompletionListener {
mediaplayer!!.release()
mediaplayer = null
}
mediaplayer?.start()
}
}
} }

View file

@ -11,4 +11,6 @@ class EndlessSessionScreen : AbstractSessionScreen() {
override fun motivationString(): String { override fun motivationString(): String {
return resources().getString(AppText.state_focus) return resources().getString(AppText.state_focus)
} }
override fun callMediaPlayer() {}
} }

View file

@ -1,17 +1,18 @@
package be.ugent.sel.studeez.screens.session.sessionScreens 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.FunctionalCustomTimer
import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalEndlessTimer 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.FunctionalPomodoroTimer
import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimerVisitor import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimerVisitor
class GetSessionScreen : FunctionalTimerVisitor<AbstractSessionScreen> { class GetSessionScreen(private val mediaplayer: MediaPlayer?) : FunctionalTimerVisitor<AbstractSessionScreen> {
override fun visitFunctionalCustomTimer(functionalCustomTimer: FunctionalCustomTimer): AbstractSessionScreen = override fun visitFunctionalCustomTimer(functionalCustomTimer: FunctionalCustomTimer): AbstractSessionScreen =
CustomSessionScreen(functionalCustomTimer) CustomSessionScreen(functionalCustomTimer, mediaplayer)
override fun visitFunctionalEndlessTimer(functionalEndlessTimer: FunctionalEndlessTimer): AbstractSessionScreen = override fun visitFunctionalEndlessTimer(functionalEndlessTimer: FunctionalEndlessTimer): AbstractSessionScreen =
EndlessSessionScreen() EndlessSessionScreen()
override fun visitFunctionalBreakTimer(functionalPomodoroTimer: FunctionalPomodoroTimer): AbstractSessionScreen = override fun visitFunctionalBreakTimer(functionalPomodoroTimer: FunctionalPomodoroTimer): AbstractSessionScreen =
BreakSessionScreen(functionalPomodoroTimer) BreakSessionScreen(functionalPomodoroTimer, mediaplayer)
} }

View file

@ -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.FunctionalCustomTimer
import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalEndlessTimer 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.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.InvisibleSessionManager
import be.ugent.sel.studeez.screens.session.SessionViewModel import be.ugent.sel.studeez.screens.session.SessionViewModel
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
@ -20,7 +19,7 @@ import org.mockito.kotlin.mock
class InvisibleSessionManagerTest { class InvisibleSessionManagerTest {
private var timerState: SelectedTimerState = SelectedTimerState() private var timerState: SelectedTimerState = SelectedTimerState()
private lateinit var viewModel: SessionViewModel private lateinit var viewModel: SessionViewModel
private val mediaPlayer = mock<MediaPlayer>() private var mediaPlayer: MediaPlayer = mock()
@Test @Test
fun InvisibleEndlessTimerTest() = runTest { fun InvisibleEndlessTimerTest() = runTest {
@ -58,25 +57,20 @@ class InvisibleSessionManagerTest {
advanceTimeBy(1_000) // start tikker advanceTimeBy(1_000) // start tikker
advanceTimeBy(9_000) 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) advanceTimeBy(2_000)
Assert.assertEquals(viewModel.getTimer().time.time, 0) // Focussen gedaan Assert.assertEquals(viewModel.getTimer().time.time, 4)
// pauze, 11 sec bezig, 4 seconden nog pauze
advanceTimeBy(4_000) advanceTimeBy(5_000)
Assert.assertEquals(viewModel.getTimer().view, FunctionalTimer.StudyState.BREAK) // Tijdens pauze Assert.assertEquals(viewModel.getTimer().time.time, 9)
// 2e focus, 16 sec, 9 sec in 2e focus nog
advanceTimeBy(1_000) advanceTimeBy(13_000)
Assert.assertEquals(viewModel.getTimer().time.time, 0) // Pauze gedaan Assert.assertTrue(viewModel.getTimer().hasEnded())
// Done
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
test.cancel() test.cancel()
return@runTest return@runTest