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 959bc74..3572b5e 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 @@ -5,32 +5,23 @@ import android.media.RingtoneManager import android.net.Uri import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext -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.sessionScreens.AbstractSessionScreen -import be.ugent.sel.studeez.screens.session.sessionScreens.GetSessionScreen -import be.ugent.sel.studeez.screens.session.sessionScreens.composables.BreakSessionScreenComposable import be.ugent.sel.studeez.screens.session.sessionScreens.composables.GetSessionScreenComposable data class SessionActions( val getTimer: () -> FunctionalTimer, val getTask: () -> String, - val startMediaPlayer: () -> Unit, - val releaseMediaPlayer: () -> Unit, val endSession: () -> Unit ) private fun getSessionActions( viewModel: SessionViewModel, openAndPopUp: (String, String) -> Unit, - mediaplayer: MediaPlayer, ): SessionActions { return SessionActions( getTimer = viewModel::getTimer, getTask = viewModel::getTask, endSession = { viewModel.endSession(openAndPopUp) }, - startMediaPlayer = mediaplayer::start, - releaseMediaPlayer = mediaplayer::release, ) } @@ -50,8 +41,9 @@ fun SessionRoute( mediaplayer = mediaplayer ) - val sessionActions = getSessionActions(viewModel, openAndPopUp, mediaplayer) - val sessionScreen = viewModel.getTimer().accept(GetSessionScreenComposable(mediaplayer, open, sessionActions)) + val soundPlayer = SoundPlayer(LocalContext.current) + val sessionActions = getSessionActions(viewModel, openAndPopUp) + val sessionScreen = viewModel.getTimer().accept(GetSessionScreenComposable(soundPlayer, open, sessionActions)) sessionScreen() } 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 deleted file mode 100644 index 08a8a72..0000000 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/AbstractSessionScreen.kt +++ /dev/null @@ -1,150 +0,0 @@ -package be.ugent.sel.studeez.screens.session.sessionScreens - -import androidx.compose.foundation.background -import androidx.compose.foundation.border -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.Text -import androidx.compose.material.TextButton -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.font.FontWeight -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.sp -import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalEndlessTimer -import be.ugent.sel.studeez.screens.session.SessionActions -import kotlinx.coroutines.delay -import kotlin.time.Duration.Companion.seconds - -abstract class AbstractSessionScreen { - - @Composable - operator fun invoke( - open: (String) -> Unit, - sessionActions: SessionActions, - ) { - Column( - modifier = Modifier.padding(10.dp) - ) { - Timer( - sessionActions = sessionActions, - ) - Box( - contentAlignment = Alignment.Center, modifier = Modifier - .fillMaxWidth() - .padding(50.dp) - ) { - TextButton( - onClick = { - sessionActions.releaseMediaPlayer - sessionActions.endSession() - }, - modifier = Modifier - .padding(horizontal = 20.dp) - .border(1.dp, Color.Red, RoundedCornerShape(32.dp)) - .background(Color.Transparent) - ) { - Text( - text = "End session", - color = Color.Red, - fontWeight = FontWeight.Bold, - fontSize = 18.sp, - modifier = Modifier.padding(1.dp) - ) - } - } - } - } - - @Composable - fun Timer( - sessionActions: SessionActions, - ) { - var tikker by remember { mutableStateOf(false) } - LaunchedEffect(tikker) { - delay(1.seconds) - sessionActions.getTimer().tick() - callMediaPlayer() - tikker = !tikker - } - - val hms = sessionActions.getTimer().getHoursMinutesSeconds() - Column { - Text( - text = hms.toString(), - modifier = Modifier - .fillMaxWidth() - .padding(50.dp), - textAlign = TextAlign.Center, - fontWeight = FontWeight.Bold, - fontSize = 40.sp, - ) - - Text( - text = motivationString(), - modifier = Modifier.fillMaxWidth(), - textAlign = TextAlign.Center, - fontWeight = FontWeight.Light, - fontSize = 30.sp - ) - - MidSection() - - Box( - contentAlignment = Alignment.Center, modifier = Modifier - .fillMaxWidth() - .padding(50.dp) - ) { - Box( - contentAlignment = Alignment.Center, - modifier = Modifier - .padding(16.dp) - .background(Color.Blue, RoundedCornerShape(32.dp)) - ) { - Text( - text = sessionActions.getTask(), - color = Color.White, - fontSize = 18.sp, - fontWeight = FontWeight.Bold, - modifier = Modifier.padding(vertical = 4.dp, horizontal = 20.dp) - ) - } - } - } - } - - @Composable - abstract fun motivationString(): String - - @Composable - open fun MidSection() { - // Default has no midsection, unless overwritten. - } - - abstract fun callMediaPlayer() - -} - -@Preview -@Composable -fun TimerPreview() { - val sessionScreen = object : AbstractSessionScreen() { - @Composable - override fun motivationString(): String = "Test" - override fun callMediaPlayer() {} - - } - sessionScreen.Timer(sessionActions = SessionActions({ FunctionalEndlessTimer() }, { "Preview" }, {}, {}, {})) -} \ No newline at end of file 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 deleted file mode 100644 index 9c59b46..0000000 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakSessionScreen.kt +++ /dev/null @@ -1,93 +0,0 @@ -package be.ugent.sel.studeez.screens.session.sessionScreens - -import android.media.MediaPlayer -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.font.FontWeight -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.sp -import be.ugent.sel.studeez.R -import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalPomodoroTimer -import be.ugent.sel.studeez.resources -import be.ugent.sel.studeez.R.string as AppText - -class BreakSessionScreen( - private val funPomoDoroTimer: FunctionalPomodoroTimer, - private var mediaplayer: MediaPlayer? -): AbstractSessionScreen() { - - @Composable - override fun MidSection() { - Dots() - } - - @Composable - fun Dots() { - Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center, - ) { - repeat(funPomoDoroTimer.repeats - funPomoDoroTimer.breaksRemaining) { - Dot(color = Color.DarkGray) - } - if (!funPomoDoroTimer.isInBreak) Dot(Color.Green) else Dot(Color.DarkGray) - repeat(funPomoDoroTimer.breaksRemaining - 1) { - Dot(color = Color.Gray) - } - } - } - - @Composable - private fun Dot(color: Color) { - Box(modifier = Modifier - .padding(5.dp) - .size(10.dp) - .clip(CircleShape) - .background(color)) - } - - @Composable - override fun motivationString(): String { - if (funPomoDoroTimer.isInBreak) { - return resources().getString(AppText.state_take_a_break) - } - - if (funPomoDoroTimer.hasEnded()) { - return resources().getString(AppText.state_done) - } - - return resources().getString(AppText.state_focus) - } - - override fun callMediaPlayer() { - if (funPomoDoroTimer.hasEnded()) { - mediaplayer?.let { it: MediaPlayer -> - it.setOnCompletionListener { - it.release() - mediaplayer = null - } - it.start() - } - } else if (funPomoDoroTimer.hasCurrentCountdownEnded()) { - mediaplayer?.start() - } - } -} - -@Preview -@Composable -fun MidsectionPreview() { - val funPomoDoroTimer = FunctionalPomodoroTimer(15, 60, 5) - val breakSessionScreen = BreakSessionScreen(funPomoDoroTimer, MediaPlayer()) - breakSessionScreen.MidSection() -} \ 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 deleted file mode 100644 index 7fc60bc..0000000 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/CustomSessionScreen.kt +++ /dev/null @@ -1,35 +0,0 @@ -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 -import be.ugent.sel.studeez.R.string as AppText - - -class CustomSessionScreen( - private val functionalTimer: FunctionalCustomTimer, - private var mediaplayer: MediaPlayer? -): AbstractSessionScreen() { - - @Composable - override fun motivationString(): String { - if (functionalTimer.hasEnded()) { - return resources().getString(AppText.state_done) - } - 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 deleted file mode 100644 index be67cff..0000000 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/EndlessSessionScreen.kt +++ /dev/null @@ -1,16 +0,0 @@ -package be.ugent.sel.studeez.screens.session.sessionScreens - -import androidx.compose.runtime.Composable -import be.ugent.sel.studeez.resources -import be.ugent.sel.studeez.R.string as AppText - - -class EndlessSessionScreen : AbstractSessionScreen() { - - @Composable - override fun motivationString(): String { - return resources().getString(AppText.state_focus) - } - - override fun callMediaPlayer() {} -} \ No newline at end of file