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() { |     override fun tick() { | ||||||
|         if (!hasEnded()) { |         if (!hasEnded()) { | ||||||
|             time.minOne() |             time.minOne() | ||||||
|         } else { |  | ||||||
|             mediaPlayer?.setOnCompletionListener { |  | ||||||
|                 mediaPlayer!!.release() |  | ||||||
|                 mediaPlayer = null |  | ||||||
|             } |  | ||||||
|             mediaPlayer?.start() |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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() | ||||||
|  |  | ||||||
|  | @ -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() | ||||||
|  | 
 | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -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, | ||||||
|  |  | ||||||
|  | @ -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" }, {}, {})) | ||||||
|  |  | ||||||
|  | @ -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() | ||||||
|  |         } | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | @ -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() | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  | @ -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() {} | ||||||
| } | } | ||||||
|  | @ -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) | ||||||
| } | } | ||||||
|  | @ -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 | ||||||
|  |  | ||||||
		Reference in a new issue
	
	 Rune Dyselinck
						Rune Dyselinck