Merge branch 'development' into session_recap
This commit is contained in:
commit
75429b2638
11 changed files with 66 additions and 45 deletions
|
@ -21,8 +21,8 @@ class FunctionalCustomTimer(studyTime: Int) : FunctionalTimer(studyTime) {
|
||||||
return hasEnded()
|
return hasEnded()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getView(): AbstractSessionScreen {
|
override fun <T> accept(visitor: FunctionalTimerVisitor<T>): T {
|
||||||
return CustomSessionScreen(this)
|
return visitor.visitFunctionalCustomTimer(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,8 +1,5 @@
|
||||||
package be.ugent.sel.studeez.data.local.models.timer_functional
|
package be.ugent.sel.studeez.data.local.models.timer_functional
|
||||||
|
|
||||||
import be.ugent.sel.studeez.screens.session.sessionScreens.EndlessSessionScreen
|
|
||||||
import be.ugent.sel.studeez.screens.session.sessionScreens.AbstractSessionScreen
|
|
||||||
|
|
||||||
class FunctionalEndlessTimer : FunctionalTimer(0) {
|
class FunctionalEndlessTimer : FunctionalTimer(0) {
|
||||||
|
|
||||||
override fun hasEnded(): Boolean {
|
override fun hasEnded(): Boolean {
|
||||||
|
@ -18,7 +15,7 @@ class FunctionalEndlessTimer : FunctionalTimer(0) {
|
||||||
totalStudyTime++
|
totalStudyTime++
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getView(): AbstractSessionScreen {
|
override fun <T> accept(visitor: FunctionalTimerVisitor<T>): T {
|
||||||
return EndlessSessionScreen()
|
return visitor.visitFunctionalEndlessTimer(this)
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -44,7 +44,7 @@ class FunctionalPomodoroTimer(
|
||||||
return time.time == 0
|
return time.time == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getView(): AbstractSessionScreen {
|
override fun <T> accept(visitor: FunctionalTimerVisitor<T>): T {
|
||||||
return BreakSessionScreen(this)
|
return visitor.visitFunctionalBreakTimer(this)
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -18,7 +18,6 @@ abstract class FunctionalTimer(initialValue: Int) {
|
||||||
|
|
||||||
abstract fun hasCurrentCountdownEnded(): Boolean
|
abstract fun hasCurrentCountdownEnded(): Boolean
|
||||||
|
|
||||||
abstract fun getView(): AbstractSessionScreen
|
|
||||||
fun getSessionReport(): SessionReport {
|
fun getSessionReport(): SessionReport {
|
||||||
return SessionReport(
|
return SessionReport(
|
||||||
id = "",
|
id = "",
|
||||||
|
@ -27,4 +26,5 @@ abstract class FunctionalTimer(initialValue: Int) {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
abstract fun <T> accept(visitor: FunctionalTimerVisitor<T>): T
|
||||||
}
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
package be.ugent.sel.studeez.data.local.models.timer_functional
|
||||||
|
|
||||||
|
interface FunctionalTimerVisitor<T> {
|
||||||
|
|
||||||
|
fun visitFunctionalCustomTimer(functionalCustomTimer: FunctionalCustomTimer): T
|
||||||
|
|
||||||
|
fun visitFunctionalEndlessTimer(functionalEndlessTimer: FunctionalEndlessTimer): T
|
||||||
|
|
||||||
|
fun visitFunctionalBreakTimer(functionalPomodoroTimer: FunctionalPomodoroTimer): T
|
||||||
|
|
||||||
|
}
|
|
@ -7,6 +7,7 @@ import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimer
|
import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimer
|
||||||
import be.ugent.sel.studeez.screens.session.sessionScreens.AbstractSessionScreen
|
import be.ugent.sel.studeez.screens.session.sessionScreens.AbstractSessionScreen
|
||||||
|
import be.ugent.sel.studeez.screens.session.sessionScreens.GetSessionScreen
|
||||||
|
|
||||||
data class SessionActions(
|
data class SessionActions(
|
||||||
val getTimer: () -> FunctionalTimer,
|
val getTimer: () -> FunctionalTimer,
|
||||||
|
@ -36,7 +37,6 @@ fun SessionRoute(
|
||||||
openAndPopUp: (String, String) -> Unit,
|
openAndPopUp: (String, String) -> Unit,
|
||||||
viewModel: SessionViewModel,
|
viewModel: SessionViewModel,
|
||||||
) {
|
) {
|
||||||
val sessionScreen: AbstractSessionScreen = viewModel.getTimer().getView()
|
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
val uri: Uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
|
val uri: Uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
|
||||||
val mediaplayer = MediaPlayer()
|
val mediaplayer = MediaPlayer()
|
||||||
|
@ -50,8 +50,18 @@ fun SessionRoute(
|
||||||
mediaplayer.setOnPreparedListener {
|
mediaplayer.setOnPreparedListener {
|
||||||
// mediaplayer.start()
|
// mediaplayer.start()
|
||||||
}
|
}
|
||||||
sessionScreen.SessionScreen(
|
|
||||||
|
val sessionScreen: AbstractSessionScreen = viewModel.getTimer().accept(GetSessionScreen())
|
||||||
|
|
||||||
|
//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")
|
||||||
|
//}
|
||||||
|
|
||||||
|
sessionScreen(
|
||||||
open = open,
|
open = open,
|
||||||
sessionActions = getSessionActions(viewModel, openAndPopUp, mediaplayer),
|
sessionActions = getSessionActions(viewModel, openAndPopUp, mediaplayer)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,8 +15,10 @@ import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.text.font.FontWeight
|
import androidx.compose.ui.text.font.FontWeight
|
||||||
import androidx.compose.ui.text.style.TextAlign
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.unit.sp
|
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.navigation.StudeezDestinations
|
||||||
import be.ugent.sel.studeez.screens.session.SessionActions
|
import be.ugent.sel.studeez.screens.session.SessionActions
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
|
@ -27,7 +29,7 @@ abstract class AbstractSessionScreen {
|
||||||
var timerEnd = false
|
var timerEnd = false
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun SessionScreen(
|
operator fun invoke(
|
||||||
open: (String) -> Unit,
|
open: (String) -> Unit,
|
||||||
sessionActions: SessionActions,
|
sessionActions: SessionActions,
|
||||||
) {
|
) {
|
||||||
|
@ -65,7 +67,7 @@ abstract class AbstractSessionScreen {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun Timer(
|
fun Timer(
|
||||||
sessionActions: SessionActions,
|
sessionActions: SessionActions,
|
||||||
) {
|
) {
|
||||||
var tikker by remember { mutableStateOf(false) }
|
var tikker by remember { mutableStateOf(false) }
|
||||||
|
@ -135,3 +137,14 @@ abstract class AbstractSessionScreen {
|
||||||
abstract fun motivationString(): String
|
abstract fun motivationString(): String
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Preview
|
||||||
|
@Composable
|
||||||
|
fun TimerPreview() {
|
||||||
|
val sessionScreen = object : AbstractSessionScreen() {
|
||||||
|
@Composable
|
||||||
|
override fun motivationString(): String = "Test"
|
||||||
|
|
||||||
|
}
|
||||||
|
sessionScreen.Timer(sessionActions = SessionActions({ FunctionalEndlessTimer() }, { "Preview" }, {}, {}))
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package be.ugent.sel.studeez.screens.session.sessionScreens
|
||||||
|
|
||||||
|
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> {
|
||||||
|
override fun visitFunctionalCustomTimer(functionalCustomTimer: FunctionalCustomTimer): AbstractSessionScreen =
|
||||||
|
CustomSessionScreen(functionalCustomTimer)
|
||||||
|
|
||||||
|
override fun visitFunctionalEndlessTimer(functionalEndlessTimer: FunctionalEndlessTimer): AbstractSessionScreen =
|
||||||
|
EndlessSessionScreen()
|
||||||
|
|
||||||
|
override fun visitFunctionalBreakTimer(functionalPomodoroTimer: FunctionalPomodoroTimer): AbstractSessionScreen =
|
||||||
|
BreakSessionScreen(functionalPomodoroTimer)
|
||||||
|
}
|
|
@ -36,9 +36,6 @@ class FunctionalCustomTimerUnitTest : FunctionalTimerUnitTest() {
|
||||||
timer = FunctionalCustomTimer(0)
|
timer = FunctionalCustomTimer(0)
|
||||||
timer.tick()
|
timer.tick()
|
||||||
Assert.assertTrue(timer.hasEnded())
|
Assert.assertTrue(timer.hasEnded())
|
||||||
Assert.assertEquals(
|
Assert.assertTrue(timer.hasEnded())
|
||||||
FunctionalTimer.StudyState.DONE,
|
|
||||||
timer.view
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -37,10 +37,6 @@ class FunctionalEndlessTimerUnitTest : FunctionalTimerUnitTest() {
|
||||||
for (i in 1..n) {
|
for (i in 1..n) {
|
||||||
timer.tick()
|
timer.tick()
|
||||||
Assert.assertFalse(timer.hasEnded())
|
Assert.assertFalse(timer.hasEnded())
|
||||||
Assert.assertEquals(
|
|
||||||
FunctionalTimer.StudyState.FOCUS,
|
|
||||||
timer.view
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -29,10 +29,6 @@ class FunctionalPomodoroTimerUnitTest : FunctionalTimerUnitTest() {
|
||||||
breaks,
|
breaks,
|
||||||
pomodoroTimer.breaksRemaining,
|
pomodoroTimer.breaksRemaining,
|
||||||
)
|
)
|
||||||
Assert.assertEquals(
|
|
||||||
FunctionalTimer.StudyState.FOCUS,
|
|
||||||
pomodoroTimer.view,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -52,10 +48,6 @@ class FunctionalPomodoroTimerUnitTest : FunctionalTimerUnitTest() {
|
||||||
pomodoroTimer = FunctionalPomodoroTimer(0, 0, 0)
|
pomodoroTimer = FunctionalPomodoroTimer(0, 0, 0)
|
||||||
pomodoroTimer.tick()
|
pomodoroTimer.tick()
|
||||||
Assert.assertTrue(pomodoroTimer.hasEnded())
|
Assert.assertTrue(pomodoroTimer.hasEnded())
|
||||||
Assert.assertEquals(
|
|
||||||
FunctionalTimer.StudyState.DONE,
|
|
||||||
pomodoroTimer.view,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -65,10 +57,6 @@ class FunctionalPomodoroTimerUnitTest : FunctionalTimerUnitTest() {
|
||||||
}
|
}
|
||||||
Assert.assertFalse(pomodoroTimer.hasEnded())
|
Assert.assertFalse(pomodoroTimer.hasEnded())
|
||||||
Assert.assertTrue(pomodoroTimer.isInBreak)
|
Assert.assertTrue(pomodoroTimer.isInBreak)
|
||||||
Assert.assertEquals(
|
|
||||||
FunctionalTimer.StudyState.BREAK,
|
|
||||||
pomodoroTimer.view
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -77,10 +65,6 @@ class FunctionalPomodoroTimerUnitTest : FunctionalTimerUnitTest() {
|
||||||
pomodoroTimer.tick()
|
pomodoroTimer.tick()
|
||||||
}
|
}
|
||||||
Assert.assertTrue(pomodoroTimer.isInBreak)
|
Assert.assertTrue(pomodoroTimer.isInBreak)
|
||||||
Assert.assertEquals(
|
|
||||||
FunctionalTimer.StudyState.BREAK,
|
|
||||||
pomodoroTimer.view
|
|
||||||
)
|
|
||||||
for (i in 0..breakTime) {
|
for (i in 0..breakTime) {
|
||||||
pomodoroTimer.tick()
|
pomodoroTimer.tick()
|
||||||
}
|
}
|
||||||
|
@ -90,9 +74,5 @@ class FunctionalPomodoroTimerUnitTest : FunctionalTimerUnitTest() {
|
||||||
breaksRemaining,
|
breaksRemaining,
|
||||||
pomodoroTimer.breaksRemaining
|
pomodoroTimer.breaksRemaining
|
||||||
)
|
)
|
||||||
Assert.assertEquals(
|
|
||||||
FunctionalTimer.StudyState.FOCUS_REMAINING,
|
|
||||||
pomodoroTimer.view
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in a new issue