Merge branch 'development' into session_recap

This commit is contained in:
lbarraga 2023-04-28 12:13:47 +02:00 committed by GitHub Enterprise
commit 75429b2638
11 changed files with 66 additions and 45 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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