wrap SessionScreen in route

This commit is contained in:
brreynie 2023-04-23 23:33:03 +02:00
parent f1efad5120
commit 6bfa96bab7
3 changed files with 86 additions and 34 deletions

1
.idea/misc.xml generated
View file

@ -1,4 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">

View file

@ -29,6 +29,7 @@ import be.ugent.sel.studeez.screens.home.HomeRoute
import be.ugent.sel.studeez.screens.log_in.LoginRoute import be.ugent.sel.studeez.screens.log_in.LoginRoute
import be.ugent.sel.studeez.screens.profile.EditProfileRoute import be.ugent.sel.studeez.screens.profile.EditProfileRoute
import be.ugent.sel.studeez.screens.profile.ProfileRoute import be.ugent.sel.studeez.screens.profile.ProfileRoute
import be.ugent.sel.studeez.screens.session.SessionRoute
import be.ugent.sel.studeez.screens.session.SessionScreen import be.ugent.sel.studeez.screens.session.SessionScreen
import be.ugent.sel.studeez.screens.sign_up.SignUpRoute import be.ugent.sel.studeez.screens.sign_up.SignUpRoute
import be.ugent.sel.studeez.screens.splash.SplashRoute import be.ugent.sel.studeez.screens.splash.SplashRoute
@ -128,7 +129,7 @@ fun NavGraphBuilder.studeezGraph(appState: StudeezAppstate) {
} }
composable(StudeezDestinations.SESSION_SCREEN) { composable(StudeezDestinations.SESSION_SCREEN) {
SessionScreen(open, openAndPopUp) SessionRoute(open, viewModel = hiltViewModel())
} }
// TODO Timers screen // TODO Timers screen

View file

@ -10,38 +10,61 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Button
import androidx.compose.material.Text import androidx.compose.material.Text
import androidx.compose.material.TextButton import androidx.compose.material.TextButton
import androidx.compose.ui.Alignment
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
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 be.ugent.sel.studeez.navigation.StudeezDestinations
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.hilt.navigation.compose.hiltViewModel
import be.ugent.sel.studeez.R import be.ugent.sel.studeez.R
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.data.local.models.timer_functional.FunctionalTimer.StudyState import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimer.StudyState
import be.ugent.sel.studeez.navigation.StudeezDestinations
import be.ugent.sel.studeez.resources import be.ugent.sel.studeez.resources
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlin.time.Duration.Companion.seconds import kotlin.time.Duration.Companion.seconds
var timerEnd = false var timerEnd = false
data class SessionActions(
val getTimer: () -> FunctionalTimer,
val getTask: () -> String,
val prepareMediaPlayer: () -> Unit,
val releaseMediaPlayer: () -> Unit,
val play: () -> Unit,
)
fun getSessionActions(
viewModel: SessionViewModel,
mediaplayer: MediaPlayer,
): SessionActions {
return SessionActions(
getTimer = viewModel::getTimer,
getTask = viewModel::getTask,
prepareMediaPlayer = mediaplayer::prepare,
releaseMediaPlayer = mediaplayer::release,
play = mediaplayer::start,
)
}
@Composable @Composable
fun SessionScreen( fun SessionRoute(
open: (String) -> Unit, open: (String) -> Unit,
openAndPopUp: (String, String) -> Unit, viewModel: SessionViewModel,
viewModel: SessionViewModel = hiltViewModel()
) { ) {
val context = LocalContext.current val context = LocalContext.current
val uri: Uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) val uri: Uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
@ -57,24 +80,34 @@ fun SessionScreen(
mediaplayer.setOnPreparedListener { mediaplayer.setOnPreparedListener {
mediaplayer.start() mediaplayer.start()
} }
SessionScreen(
open = open,
sessionActions = getSessionActions(viewModel, mediaplayer),
)
}
@Composable
fun SessionScreen(
open: (String) -> Unit,
sessionActions: SessionActions,
) {
Column( Column(
modifier = Modifier.padding(10.dp) modifier = Modifier.padding(10.dp)
) { ) {
Timer(viewModel, mediaplayer) Timer(
sessionActions = sessionActions,
)
Box( Box(
contentAlignment = Alignment.Center, contentAlignment = Alignment.Center, modifier = Modifier
modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(50.dp) .padding(50.dp)
) { ) {
TextButton( TextButton(
onClick = { onClick = {
mediaplayer.release() sessionActions.releaseMediaPlayer
open(StudeezDestinations.HOME_SCREEN) open(StudeezDestinations.HOME_SCREEN)
// Vanaf hier ook naar report gaan als "end session" knop word ingedrukt // Vanaf hier ook naar report gaan als "end session" knop word ingedrukt
}, },
modifier = Modifier modifier = Modifier
.padding(horizontal = 20.dp) .padding(horizontal = 20.dp)
.border(1.dp, Color.Red, RoundedCornerShape(32.dp)) .border(1.dp, Color.Red, RoundedCornerShape(32.dp))
@ -89,28 +122,37 @@ fun SessionScreen(
) )
} }
} }
// Button(onClick = sessionActions.play) {
// Text(text = "Play")
// }
} }
} }
@Composable @Composable
private fun Timer(viewModel: SessionViewModel = hiltViewModel(), mediaplayer: MediaPlayer) { private fun Timer(
sessionActions: SessionActions,
) {
var tikker by remember { mutableStateOf(false) } var tikker by remember { mutableStateOf(false) }
LaunchedEffect(tikker) { LaunchedEffect(tikker) {
delay(1.seconds) delay(1.seconds)
viewModel.getTimer().tick() sessionActions.getTimer().tick()
tikker = !tikker tikker = !tikker
} }
if (viewModel.getTimer().hasCurrentCountdownEnded() && !viewModel.getTimer().hasEnded()) { if (
mediaplayer.prepare() sessionActions.getTimer().hasCurrentCountdownEnded() && !sessionActions.getTimer()
.hasEnded()
) {
sessionActions.prepareMediaPlayer()
} }
if (!timerEnd && viewModel.getTimer().hasEnded()) { if (!timerEnd && sessionActions.getTimer().hasEnded()) {
mediaplayer.prepare() sessionActions.prepareMediaPlayer()
timerEnd = true // Placeholder, vanaf hier moet het report opgestart worden en de sessie afgesloten timerEnd =
true // Placeholder, vanaf hier moet het report opgestart worden en de sessie afgesloten
} }
val hms = viewModel.getTimer().getHoursMinutesSeconds() val hms = sessionActions.getTimer().getHoursMinutesSeconds()
Column { Column {
Text( Text(
text = "${hms.hours} : ${hms.minutes} : ${hms.seconds}", text = "${hms.hours} : ${hms.minutes} : ${hms.seconds}",
@ -121,13 +163,12 @@ private fun Timer(viewModel: SessionViewModel = hiltViewModel(), mediaplayer: Me
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
fontSize = 40.sp, fontSize = 40.sp,
) )
val stateString: String = when (viewModel.getTimer().view) { val stateString: String = when (sessionActions.getTimer().view) {
StudyState.DONE -> resources().getString(R.string.state_done) StudyState.DONE -> resources().getString(R.string.state_done)
StudyState.FOCUS -> resources().getString(R.string.state_focus) StudyState.FOCUS -> resources().getString(R.string.state_focus)
StudyState.BREAK -> resources().getString(R.string.state_take_a_break) StudyState.BREAK -> resources().getString(R.string.state_take_a_break)
StudyState.FOCUS_REMAINING -> StudyState.FOCUS_REMAINING -> (sessionActions.getTimer() as FunctionalPomodoroTimer?)?.breaksRemaining?.let {
(viewModel.getTimer() as FunctionalPomodoroTimer?)?.breaksRemaining?.let { resources().getQuantityString(R.plurals.state_focus_remaining, it, it)
resources().getQuantityString(R.plurals.state_focus_remaining, it, it)
}.toString() }.toString()
} }
@ -140,8 +181,7 @@ private fun Timer(viewModel: SessionViewModel = hiltViewModel(), mediaplayer: Me
) )
Box( Box(
contentAlignment = Alignment.Center, contentAlignment = Alignment.Center, modifier = Modifier
modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(50.dp) .padding(50.dp)
) { ) {
@ -152,16 +192,28 @@ private fun Timer(viewModel: SessionViewModel = hiltViewModel(), mediaplayer: Me
.background(Color.Blue, RoundedCornerShape(32.dp)) .background(Color.Blue, RoundedCornerShape(32.dp))
) { ) {
Text( Text(
text = viewModel.getTask(), text = sessionActions.getTask(),
color = Color.White, color = Color.White,
fontSize = 18.sp, fontSize = 18.sp,
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
modifier = Modifier modifier = Modifier.padding(vertical = 4.dp, horizontal = 20.dp)
.padding(vertical = 4.dp, horizontal = 20.dp)
) )
} }
} }
} }
}
@Preview
@Composable
fun TimerPreview() {
Timer(sessionActions = SessionActions({ FunctionalEndlessTimer() }, { "Preview" }, {}, {}, {}))
}
} @Preview
@Composable
fun SessionPreview() {
SessionScreen(
open = {},
sessionActions = SessionActions({ FunctionalEndlessTimer() }, { "Preview" }, {}, {}, {})
)
}