mediaplayer in AbstractSessionScreen + InvisibleSessionManagerTest.kt fixed
This commit is contained in:
		
							parent
							
								
									46d60e100b
								
							
						
					
					
						commit
						e421430f0b
					
				
					 11 changed files with 59 additions and 44 deletions
				
			
		| 
						 | 
				
			
			@ -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()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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()
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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" }, {}, {}))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -11,4 +11,6 @@ class EndlessSessionScreen : AbstractSessionScreen() {
 | 
			
		|||
    override fun motivationString(): String {
 | 
			
		||||
        return resources().getString(AppText.state_focus)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun callMediaPlayer() {}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
}
 | 
			
		||||
		Reference in a new issue