diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
index 53a1745..cd54531 100644
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -42,5 +42,6 @@
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 4412b1a..0ad17cb 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/app/build.gradle b/app/build.gradle
index bca9a30..6489d31 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -66,6 +66,7 @@ dependencies {
implementation "androidx.compose.ui:ui-tooling-preview:$compose_version"
implementation 'androidx.compose.material:material:1.2.0'
+
debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_version"
// ViewModel
@@ -97,6 +98,9 @@ dependencies {
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
+ // Coroutine testing
+ testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4'
+
// Mocking
testImplementation 'org.mockito.kotlin:mockito-kotlin:3.2.0'
diff --git a/app/src/main/java/be/ugent/sel/studeez/activities/MainActivity.kt b/app/src/main/java/be/ugent/sel/studeez/activities/MainActivity.kt
index 318fe7a..b020cc8 100644
--- a/app/src/main/java/be/ugent/sel/studeez/activities/MainActivity.kt
+++ b/app/src/main/java/be/ugent/sel/studeez/activities/MainActivity.kt
@@ -10,9 +10,15 @@ import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
+import androidx.lifecycle.lifecycleScope
import be.ugent.sel.studeez.StudeezApp
+import be.ugent.sel.studeez.screens.session.InvisibleSessionManager
import be.ugent.sel.studeez.ui.theme.StudeezTheme
import dagger.hilt.android.AndroidEntryPoint
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.launch
+
+var onTimerInvisible: Job? = null
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
@@ -30,6 +36,18 @@ class MainActivity : ComponentActivity() {
}
}
}
+
+ override fun onStop() {
+ onTimerInvisible = lifecycleScope.launch {
+ InvisibleSessionManager.updateTimer()
+ }
+ super.onStop()
+ }
+
+ override fun onStart() {
+ onTimerInvisible?.cancel()
+ super.onStart()
+ }
}
@Composable
diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarComposable.kt
index 7a3da18..79186b5 100644
--- a/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarComposable.kt
+++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarComposable.kt
@@ -1,6 +1,5 @@
package be.ugent.sel.studeez.common.composable.navbar
-import android.util.Log
import androidx.compose.material.BottomNavigation
import androidx.compose.material.BottomNavigationItem
import androidx.compose.material.Icon
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 1a2e099..7038c7d 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
@@ -1,9 +1,5 @@
package be.ugent.sel.studeez.data.local.models.timer_functional
-import be.ugent.sel.studeez.data.local.models.SessionReport
-import be.ugent.sel.studeez.screens.session.sessionScreens.CustomSessionScreen
-import be.ugent.sel.studeez.screens.session.sessionScreens.AbstractSessionScreen
-
class FunctionalCustomTimer(studyTime: Int) : FunctionalTimer(studyTime) {
override fun tick() {
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 40660e2..8eeb1c6 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
@@ -1,8 +1,5 @@
package be.ugent.sel.studeez.data.local.models.timer_functional
-import be.ugent.sel.studeez.screens.session.sessionScreens.BreakSessionScreen
-import be.ugent.sel.studeez.screens.session.sessionScreens.AbstractSessionScreen
-
class FunctionalPomodoroTimer(
private var studyTime: Int,
private var breakTime: Int, repeats: Int
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 760d656..e95bbfb 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,7 +1,6 @@
package be.ugent.sel.studeez.data.local.models.timer_functional
import be.ugent.sel.studeez.data.local.models.SessionReport
-import be.ugent.sel.studeez.screens.session.sessionScreens.AbstractSessionScreen
import com.google.firebase.Timestamp
abstract class FunctionalTimer(initialValue: Int) {
diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileEditScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileEditScreen.kt
index 116a5fb..3dbe270 100644
--- a/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileEditScreen.kt
+++ b/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileEditScreen.kt
@@ -5,7 +5,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
-import androidx.hilt.navigation.compose.hiltViewModel
import be.ugent.sel.studeez.R
import be.ugent.sel.studeez.common.composable.BasicTextButton
import be.ugent.sel.studeez.common.composable.LabelledInputField
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
new file mode 100644
index 0000000..9051fa8
--- /dev/null
+++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/InvisibleSessionManager.kt
@@ -0,0 +1,29 @@
+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
+
+@Singleton
+object InvisibleSessionManager {
+ private var viewModel: SessionViewModel? = null
+ private lateinit var mediaPlayer: MediaPlayer
+
+ fun setParameters(viewModel: SessionViewModel, mediaplayer: MediaPlayer) {
+ this.viewModel = viewModel
+ this.mediaPlayer = mediaplayer
+ }
+
+ suspend fun updateTimer() {
+ viewModel?.let {
+ while (!it.getTimer().hasEnded()) {
+ delay(1.seconds)
+ it.getTimer().tick()
+ if (it.getTimer().hasCurrentCountdownEnded()) {
+ mediaPlayer.start()
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
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 a503067..084ff43 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
@@ -12,7 +12,7 @@ import be.ugent.sel.studeez.screens.session.sessionScreens.GetSessionScreen
data class SessionActions(
val getTimer: () -> FunctionalTimer,
val getTask: () -> String,
- val prepareMediaPlayer: () -> Unit,
+ val startMediaPlayer: () -> Unit,
val releaseMediaPlayer: () -> Unit,
val endSession: () -> Unit
)
@@ -26,8 +26,8 @@ private fun getSessionActions(
getTimer = viewModel::getTimer,
getTask = viewModel::getTask,
endSession = { viewModel.endSession(openAndPopUp) },
- prepareMediaPlayer = mediaplayer::prepareAsync,
- releaseMediaPlayer = mediaplayer::release
+ startMediaPlayer = mediaplayer::start,
+ releaseMediaPlayer = mediaplayer::release,
)
}
@@ -39,26 +39,15 @@ fun SessionRoute(
) {
val context = LocalContext.current
val uri: Uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
- val mediaplayer = MediaPlayer()
- mediaplayer.setDataSource(context, uri)
- mediaplayer.setOnCompletionListener {
- mediaplayer.stop()
- //if (timerEnd) {
-// mediaplayer.release()
- //}
- }
- mediaplayer.setOnPreparedListener {
-// mediaplayer.start()
- }
+ val mediaplayer = MediaPlayer.create(context, uri)
+ mediaplayer.isLooping = false
- val sessionScreen: AbstractSessionScreen = viewModel.getTimer().accept(GetSessionScreen())
+ InvisibleSessionManager.setParameters(
+ viewModel = viewModel,
+ mediaplayer = mediaplayer
+ )
- //val sessionScreen = when (val timer = viewModel.getTimer()) {
- // is FunctionalCustomTimer -> CustomSessionScreen(timer)
- // is FunctionalPomodoroTimer -> BreakSessionScreen(timer)
- // is FunctionalEndlessTimer -> EndlessSessionScreen()
- // else -> throw java.lang.IllegalArgumentException("Unknown Timer")
- //}
+ 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 ca9d9c0..4c0cc3e 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
@@ -19,15 +19,12 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalEndlessTimer
-import be.ugent.sel.studeez.navigation.StudeezDestinations
import be.ugent.sel.studeez.screens.session.SessionActions
import kotlinx.coroutines.delay
import kotlin.time.Duration.Companion.seconds
abstract class AbstractSessionScreen {
- var timerEnd = false
-
@Composable
operator fun invoke(
open: (String) -> Unit,
@@ -74,22 +71,10 @@ abstract class AbstractSessionScreen {
LaunchedEffect(tikker) {
delay(1.seconds)
sessionActions.getTimer().tick()
+ callMediaPlayer()
tikker = !tikker
}
- if (
- sessionActions.getTimer().hasCurrentCountdownEnded() && !sessionActions.getTimer()
- .hasEnded()
- ) {
-// sessionActions.prepareMediaPlayer()
- }
-
- if (!timerEnd && sessionActions.getTimer().hasEnded()) {
-// sessionActions.prepareMediaPlayer()
- timerEnd =
- true // Placeholder, vanaf hier moet het report opgestart worden en de sessie afgesloten
- }
-
val hms = sessionActions.getTimer().getHoursMinutesSeconds()
Column {
Text(
@@ -136,6 +121,8 @@ abstract class AbstractSessionScreen {
@Composable
abstract fun motivationString(): String
+ abstract fun callMediaPlayer()
+
}
@Preview
@@ -144,6 +131,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..8fa45ff 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,17 @@ class BreakSessionScreen(
)
}
+ override fun callMediaPlayer() {
+ if (funPomoDoroTimer.hasEnded()) {
+ mediaplayer?.let { it: MediaPlayer ->
+ it.setOnCompletionListener {
+ it.release()
+ mediaplayer = null
+ }
+ it.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..7fc60bc 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,16 @@ class CustomSessionScreen(
return resources().getString(AppText.state_focus)
}
+ override fun callMediaPlayer() {
+ if (functionalTimer.hasEnded()) {
+ mediaplayer?.let { it: MediaPlayer ->
+ it.setOnCompletionListener {
+ it.release()
+ mediaplayer = null
+ }
+ it.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/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapScreen.kt
index 63878f7..2ddbc32 100644
--- a/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapScreen.kt
+++ b/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapScreen.kt
@@ -26,7 +26,7 @@ fun getSessionRecapActions(
return SessionRecapActions(
viewModel::getSessionReport,
{viewModel.saveSession(openAndPopUp)},
- {viewModel.saveSession(openAndPopUp)}
+ {viewModel.discardSession(openAndPopUp)}
)
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index bb643d3..5b9f561 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -45,6 +45,7 @@
Sessions
+ End session
Profile
diff --git a/app/src/test/java/be/ugent/sel/studeez/timer_functional/FunctionalCustomTimerUnitTest.kt b/app/src/test/java/be/ugent/sel/studeez/timer_functional/FunctionalCustomTimerUnitTest.kt
index 6e51b4e..548fe9d 100644
--- a/app/src/test/java/be/ugent/sel/studeez/timer_functional/FunctionalCustomTimerUnitTest.kt
+++ b/app/src/test/java/be/ugent/sel/studeez/timer_functional/FunctionalCustomTimerUnitTest.kt
@@ -1,7 +1,6 @@
package be.ugent.sel.studeez.timer_functional
import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalCustomTimer
-import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimer
import org.junit.Assert
import org.junit.Test
diff --git a/app/src/test/java/be/ugent/sel/studeez/timer_functional/FunctionalEndlessTimerUnitTest.kt b/app/src/test/java/be/ugent/sel/studeez/timer_functional/FunctionalEndlessTimerUnitTest.kt
index b99c901..17733bc 100644
--- a/app/src/test/java/be/ugent/sel/studeez/timer_functional/FunctionalEndlessTimerUnitTest.kt
+++ b/app/src/test/java/be/ugent/sel/studeez/timer_functional/FunctionalEndlessTimerUnitTest.kt
@@ -1,7 +1,6 @@
package be.ugent.sel.studeez.timer_functional
import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalEndlessTimer
-import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimer
import org.junit.Assert
import org.junit.Test
diff --git a/app/src/test/java/be/ugent/sel/studeez/timer_functional/FunctionalPomodoroTimerUnitTest.kt b/app/src/test/java/be/ugent/sel/studeez/timer_functional/FunctionalPomodoroTimerUnitTest.kt
index 3ff1499..4b259c8 100644
--- a/app/src/test/java/be/ugent/sel/studeez/timer_functional/FunctionalPomodoroTimerUnitTest.kt
+++ b/app/src/test/java/be/ugent/sel/studeez/timer_functional/FunctionalPomodoroTimerUnitTest.kt
@@ -1,7 +1,6 @@
package be.ugent.sel.studeez.timer_functional
import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalPomodoroTimer
-import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimer
import org.junit.Assert
import org.junit.Test
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
new file mode 100644
index 0000000..60740d9
--- /dev/null
+++ b/app/src/test/java/be/ugent/sel/studeez/timer_functional/InvisibleSessionManagerTest.kt
@@ -0,0 +1,99 @@
+package be.ugent.sel.studeez.timer_functional
+
+import android.media.MediaPlayer
+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.screens.session.InvisibleSessionManager
+import be.ugent.sel.studeez.screens.session.SessionViewModel
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.test.advanceTimeBy
+import kotlinx.coroutines.test.runTest
+import org.junit.Assert
+import org.junit.Test
+import org.mockito.kotlin.mock
+
+@ExperimentalCoroutinesApi
+class InvisibleSessionManagerTest {
+ private var timerState: SelectedTimerState = SelectedTimerState()
+ private lateinit var viewModel: SessionViewModel
+ private var mediaPlayer: MediaPlayer = mock()
+
+ @Test
+ fun InvisibleEndlessTimerTest() = runTest {
+ timerState.selectedTimer = FunctionalEndlessTimer()
+ viewModel = SessionViewModel(timerState, mock())
+ InvisibleSessionManager.setParameters(viewModel, mediaPlayer)
+
+ val test = launch {
+ InvisibleSessionManager.updateTimer()
+ }
+
+ Assert.assertEquals(viewModel.getTimer().time.time, 0)
+ advanceTimeBy(1_000) // Start tikker
+ advanceTimeBy(10_000_000)
+ Assert.assertEquals(viewModel.getTimer().time.time, 10000)
+
+ test.cancel()
+ return@runTest
+ }
+
+ @Test
+ fun InvisiblePomodoroTimerTest() = runTest {
+ val studyTime = 10
+ val breakTime = 5
+ val repeats = 1
+ timerState.selectedTimer = FunctionalPomodoroTimer(studyTime, breakTime, repeats)
+ viewModel = SessionViewModel(timerState, mock())
+ InvisibleSessionManager.setParameters(viewModel, mediaPlayer)
+
+ val test = launch {
+ InvisibleSessionManager.updateTimer()
+ }
+
+ Assert.assertEquals(viewModel.getTimer().time.time, 10)
+ advanceTimeBy(1_000) // start tikker
+
+ advanceTimeBy(9_000)
+ Assert.assertEquals(viewModel.getTimer().time.time, 1)
+ // focus, 9 sec, 1 sec nog
+
+ advanceTimeBy(2_000)
+ Assert.assertEquals(viewModel.getTimer().time.time, 4)
+ // pauze, 11 sec bezig, 4 seconden nog pauze
+
+ advanceTimeBy(5_000)
+ Assert.assertEquals(viewModel.getTimer().time.time, 9)
+ // 2e focus, 16 sec, 9 sec in 2e focus nog
+
+ advanceTimeBy(13_000)
+ Assert.assertTrue(viewModel.getTimer().hasEnded())
+ // Done
+
+ test.cancel()
+ return@runTest
+ }
+
+ @Test
+ fun InvisibleCustomTimerTest() = runTest {
+ timerState.selectedTimer = FunctionalCustomTimer(5)
+ viewModel = SessionViewModel(timerState, mock())
+ InvisibleSessionManager.setParameters(viewModel, mediaPlayer)
+
+ val test = launch {
+ InvisibleSessionManager.updateTimer()
+ }
+
+ Assert.assertEquals(viewModel.getTimer().time.time, 5)
+ advanceTimeBy(1_000) // Start tikker
+ advanceTimeBy(4_000)
+ Assert.assertEquals(viewModel.getTimer().time.time, 1)
+ advanceTimeBy(1_000)
+ Assert.assertEquals(viewModel.getTimer().time.time, 0)
+
+ test.cancel()
+ return@runTest
+ }
+}
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
index 3c5031e..edf11ef 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -7,6 +7,8 @@
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
+org.gradle.daemon=true
+org.gradle.parallel=true
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects