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() {
if (!hasEnded()) {
time.minOne()
} else {
mediaPlayer?.setOnCompletionListener {
mediaPlayer!!.release()
mediaPlayer = null
}
mediaPlayer?.start()
}
}

View file

@ -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

View file

@ -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()

View file

@ -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()
}
}
}

View file

@ -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,

View file

@ -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" }, {}, {}))

View file

@ -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()
}
}
}

View file

@ -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()
}
}
}

View file

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

View file

@ -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<AbstractSessionScreen> {
class GetSessionScreen(private val mediaplayer: MediaPlayer?) : FunctionalTimerVisitor<AbstractSessionScreen> {
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)
}

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.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<MediaPlayer>()
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