From b0c4f44833d1c908f57994bed342ca6ba37968c7 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Tue, 25 Apr 2023 18:05:33 +0200 Subject: [PATCH 1/9] #76 total studytime toevoegen aan een functionaltimer --- .../be/ugent/sel/studeez/data/SessionReportState.kt | 4 ++++ .../models/timer_functional/FunctionalCustomTimer.kt | 2 ++ .../models/timer_functional/FunctionalEndlessTimer.kt | 1 + .../timer_functional/FunctionalPomodoroTimer.kt | 4 ++++ .../local/models/timer_functional/FunctionalTimer.kt | 11 +++++++++++ .../screens/session_recap/SessionRecapScreen.kt | 2 ++ .../screens/session_recap/SessionRecapViewModel.kt | 4 ++++ 7 files changed, 28 insertions(+) create mode 100644 app/src/main/java/be/ugent/sel/studeez/data/SessionReportState.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapScreen.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapViewModel.kt diff --git a/app/src/main/java/be/ugent/sel/studeez/data/SessionReportState.kt b/app/src/main/java/be/ugent/sel/studeez/data/SessionReportState.kt new file mode 100644 index 0000000..81e5244 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/data/SessionReportState.kt @@ -0,0 +1,4 @@ +package be.ugent.sel.studeez.data + +class SessionReportState { +} \ No newline at end of file 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 15dd00c..6c035de 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,5 +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.CustomSessionScreen import be.ugent.sel.studeez.screens.session.sessionScreens.AbstractSessionScreen @@ -8,6 +9,7 @@ class FunctionalCustomTimer(studyTime: Int) : FunctionalTimer(studyTime) { override fun tick() { if (!hasEnded()) { time.minOne() + totalStudyTime++ } } diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/FunctionalEndlessTimer.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/FunctionalEndlessTimer.kt index eb368f4..24007e7 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/FunctionalEndlessTimer.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/FunctionalEndlessTimer.kt @@ -15,6 +15,7 @@ class FunctionalEndlessTimer : FunctionalTimer(0) { override fun tick() { time.plusOne() + totalStudyTime++ } override fun getView(): AbstractSessionScreen { 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 931cbe6..152cfa4 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 @@ -26,6 +26,10 @@ class FunctionalPomodoroTimer( isInBreak = !isInBreak } time.minOne() + + if (!isInBreak) { + totalStudyTime++ + } } override fun hasEnded(): Boolean { 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 449b85c..41733bd 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,8 +1,12 @@ 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) { val time: Time = Time(initialValue) + var totalStudyTime: Int = 0 fun getHoursMinutesSeconds(): HoursMinutesSeconds { return time.getAsHMS() @@ -15,5 +19,12 @@ abstract class FunctionalTimer(initialValue: Int) { abstract fun hasCurrentCountdownEnded(): Boolean abstract fun getView(): AbstractSessionScreen + fun getSessionReport(): SessionReport { + return SessionReport( + id = "", + studyTime = totalStudyTime, + endTime = Timestamp.now() + ) + } } \ 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 new file mode 100644 index 0000000..440e1d9 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapScreen.kt @@ -0,0 +1,2 @@ +package be.ugent.sel.studeez.screens.session_recap + diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapViewModel.kt new file mode 100644 index 0000000..aaa77af --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapViewModel.kt @@ -0,0 +1,4 @@ +package be.ugent.sel.studeez.screens.session_recap + +class SessionRecapViewModel { +} \ No newline at end of file From ae685070aed7870eb2a3e2776bd3da10e40b3f56 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Tue, 25 Apr 2023 18:07:06 +0200 Subject: [PATCH 2/9] #76 sessionreportstate om een sessionreport mee te geven van scherm naar scherm --- .../be/ugent/sel/studeez/data/SessionReportState.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/data/SessionReportState.kt b/app/src/main/java/be/ugent/sel/studeez/data/SessionReportState.kt index 81e5244..47770d0 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/SessionReportState.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/SessionReportState.kt @@ -1,4 +1,14 @@ package be.ugent.sel.studeez.data -class SessionReportState { +import be.ugent.sel.studeez.data.local.models.SessionReport +import javax.inject.Inject +import javax.inject.Singleton + +/** + * Used to communicate the SelectedTimer from the selection screen to the session screen. + * Because this is a singleton-class the view-models of both screens observe the same data. + */ +@Singleton +class SessionReportState @Inject constructor(){ + var sessionReport: SessionReport? = null } \ No newline at end of file From 53d292aef4d04abf21170ebf16129c68a707cdd7 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Tue, 25 Apr 2023 18:07:30 +0200 Subject: [PATCH 3/9] #76 added session recap to routes --- .../java/be/ugent/sel/studeez/navigation/StudeezDestinations.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezDestinations.kt b/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezDestinations.kt index 760c814..ab10c22 100644 --- a/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezDestinations.kt +++ b/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezDestinations.kt @@ -9,6 +9,7 @@ object StudeezDestinations { const val TIMER_OVERVIEW_SCREEN = "timer_overview" const val TIMER_SELECTION_SCREEN = "timer_selection" const val SESSION_SCREEN = "session" + const val SESSION_RECAP = "session_recap" // const val TASKS_SCREEN = "tasks" // const val SESSIONS_SCREEN = "sessions" const val PROFILE_SCREEN = "profile" From 96795d0e18e41911956dde97030fedab5f82c473 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Tue, 25 Apr 2023 18:10:55 +0200 Subject: [PATCH 4/9] #76 session recap viewmodel en screen --- .../session_recap/SessionRecapScreen.kt | 63 +++++++++++++++++++ .../session_recap/SessionRecapViewModel.kt | 31 ++++++++- 2 files changed, 93 insertions(+), 1 deletion(-) 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 440e1d9..63878f7 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 @@ -1,2 +1,65 @@ package be.ugent.sel.studeez.screens.session_recap +import androidx.compose.foundation.layout.Column +import androidx.compose.material.ButtonDefaults +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import be.ugent.sel.studeez.R +import be.ugent.sel.studeez.common.composable.BasicButton +import be.ugent.sel.studeez.common.ext.basicButton +import be.ugent.sel.studeez.data.local.models.SessionReport +import be.ugent.sel.studeez.data.local.models.timer_functional.HoursMinutesSeconds +import be.ugent.sel.studeez.data.local.models.timer_functional.Time + +data class SessionRecapActions( + val getSessionReport: () -> SessionReport, + val saveSession: () -> Unit, + val discardSession: () -> Unit +) + +fun getSessionRecapActions( + viewModel: SessionRecapViewModel, + openAndPopUp: (String, String) -> Unit, +): SessionRecapActions { + return SessionRecapActions( + viewModel::getSessionReport, + {viewModel.saveSession(openAndPopUp)}, + {viewModel.saveSession(openAndPopUp)} + ) +} + +@Composable +fun SessionRecapRoute( + openAndPopUp: (String, String) -> Unit, + modifier: Modifier = Modifier, + viewModel: SessionRecapViewModel, +) { + SessionRecapScreen( + modifier = modifier, + getSessionRecapActions(viewModel, openAndPopUp) + ) +} + +@Composable +fun SessionRecapScreen(modifier: Modifier, sessionRecapActions: SessionRecapActions) { + val sessionReport: SessionReport = sessionRecapActions.getSessionReport() + val studyTime: Int = sessionReport.studyTime + val hms: HoursMinutesSeconds = Time(studyTime).getAsHMS() + Column { + Text(text = "You studied: ${hms.hours} : ${hms.minutes} : ${hms.seconds}") + + BasicButton( + R.string.save, Modifier.basicButton() + ) { + sessionRecapActions.saveSession() + } + BasicButton( + R.string.discard, Modifier.basicButton(), + colors = ButtonDefaults.buttonColors(backgroundColor = Color.Red) + ) { + sessionRecapActions.discardSession() + } + } +} diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapViewModel.kt index aaa77af..e9ad6b1 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapViewModel.kt @@ -1,4 +1,33 @@ package be.ugent.sel.studeez.screens.session_recap -class SessionRecapViewModel { +import be.ugent.sel.studeez.data.SessionReportState +import be.ugent.sel.studeez.data.local.models.SessionReport +import be.ugent.sel.studeez.domain.LogService +import be.ugent.sel.studeez.domain.SessionDAO +import be.ugent.sel.studeez.navigation.StudeezDestinations +import be.ugent.sel.studeez.screens.StudeezViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class SessionRecapViewModel @Inject constructor( + private val sessionReportState: SessionReportState, + private val sessionDAO: SessionDAO, + logService: LogService +) : StudeezViewModel(logService) { + + private val report: SessionReport = sessionReportState.sessionReport!! + + fun getSessionReport(): SessionReport { + return report + } + + fun saveSession(open: (String, String) -> Unit) { + sessionDAO.saveSession(getSessionReport()) + open(StudeezDestinations.HOME_SCREEN, StudeezDestinations.SESSION_RECAP) + } + + fun discardSession(open: (String, String) -> Unit) { + open(StudeezDestinations.HOME_SCREEN, StudeezDestinations.SESSION_RECAP) + } } \ No newline at end of file From 4e35951850133c5444f72de0ca0aa76d586e28c4 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Tue, 25 Apr 2023 18:11:45 +0200 Subject: [PATCH 5/9] added ensession --- .../screens/session/sessionScreens/AbstractSessionScreen.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 9bb9d73..8042450 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 @@ -45,8 +45,7 @@ abstract class AbstractSessionScreen { TextButton( onClick = { sessionActions.releaseMediaPlayer - open(StudeezDestinations.HOME_SCREEN) - // Vanaf hier ook naar report gaan als "end session" knop word ingedrukt + sessionActions.endSession() }, modifier = Modifier .padding(horizontal = 20.dp) From 312fc3167ab275d0f56208c70adf572bd62832d6 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Tue, 25 Apr 2023 18:12:41 +0200 Subject: [PATCH 6/9] added openAndPopUp --- .../be/ugent/sel/studeez/screens/session/SessionRoute.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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 0d930dc..10fca3f 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 @@ -13,23 +13,27 @@ data class SessionActions( val getTask: () -> String, val prepareMediaPlayer: () -> 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) }, prepareMediaPlayer = mediaplayer::prepareAsync, - releaseMediaPlayer = mediaplayer::release, + releaseMediaPlayer = mediaplayer::release ) } @Composable fun SessionRoute( open: (String) -> Unit, + openAndPopUp: (String, String) -> Unit, viewModel: SessionViewModel, ) { val sessionScreen: AbstractSessionScreen = viewModel.getTimer().getView() @@ -48,6 +52,6 @@ fun SessionRoute( } sessionScreen.SessionScreen( open = open, - sessionActions = getSessionActions(viewModel, mediaplayer), + sessionActions = getSessionActions(viewModel, openAndPopUp, mediaplayer), ) } From d381480c433249c839c143b0da35baa88d214291 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Tue, 25 Apr 2023 18:13:12 +0200 Subject: [PATCH 7/9] send sessionreport to state --- .../sel/studeez/screens/session/SessionViewModel.kt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionViewModel.kt index b45364e..d5e2bab 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionViewModel.kt @@ -1,20 +1,21 @@ package be.ugent.sel.studeez.screens.session +import be.ugent.sel.studeez.data.SelectedTimerState +import be.ugent.sel.studeez.data.SessionReportState import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimer import be.ugent.sel.studeez.domain.LogService +import be.ugent.sel.studeez.navigation.StudeezDestinations import be.ugent.sel.studeez.screens.StudeezViewModel -import be.ugent.sel.studeez.data.SelectedTimerState -import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalPomodoroTimer import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @HiltViewModel class SessionViewModel @Inject constructor( private val selectedTimerState: SelectedTimerState, + private val sessionReportState: SessionReportState, logService: LogService ) : StudeezViewModel(logService) { - private val timer: FunctionalTimer = FunctionalPomodoroTimer(15, 5, 3) private val task : String = "No task selected" // placeholder for tasks implementation fun getTimer() : FunctionalTimer { @@ -24,4 +25,9 @@ class SessionViewModel @Inject constructor( fun getTask(): String { return task } + + fun endSession(openAndPopUp: (String, String) -> Unit) { + sessionReportState.sessionReport = getTimer().getSessionReport() + openAndPopUp(StudeezDestinations.SESSION_RECAP, StudeezDestinations.SESSION_SCREEN) + } } \ No newline at end of file From 5148d2de4e0ea40278cb82ad4540fa7badd42085 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Tue, 25 Apr 2023 18:14:07 +0200 Subject: [PATCH 8/9] session recap --- .idea/misc.xml | 3 ++- app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt | 10 +++++++++- app/src/main/res/values/strings.xml | 1 + 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 8978d23..4412b1a 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,7 @@ + - + diff --git a/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt b/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt index a6830a5..6aade8f 100644 --- a/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt +++ b/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt @@ -31,6 +31,7 @@ import be.ugent.sel.studeez.screens.log_in.LoginRoute import be.ugent.sel.studeez.screens.profile.EditProfileRoute import be.ugent.sel.studeez.screens.profile.ProfileRoute import be.ugent.sel.studeez.screens.session.SessionRoute +import be.ugent.sel.studeez.screens.session_recap.SessionRecapRoute import be.ugent.sel.studeez.screens.sign_up.SignUpRoute import be.ugent.sel.studeez.screens.splash.SplashRoute import be.ugent.sel.studeez.screens.timer_overview.TimerOverviewRoute @@ -147,7 +148,7 @@ fun StudeezNavGraph( } composable(StudeezDestinations.SESSION_SCREEN) { - SessionRoute(open, viewModel = hiltViewModel()) + SessionRoute(open, openAndPopUp, viewModel = hiltViewModel()) } // TODO Timers screen @@ -167,5 +168,12 @@ fun StudeezNavGraph( navBarViewModel = navBarViewModel, ) } + + composable(StudeezDestinations.SESSION_RECAP) { + SessionRecapRoute( + openAndPopUp = openAndPopUp, + viewModel = hiltViewModel() + ) + } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 39abda6..bb643d3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,6 +10,7 @@ Confirm Save + Discard Cancel Go back Next From 2fb90b15c3d5aad67421b82199670c59c86494ba Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Fri, 28 Apr 2023 12:32:26 +0200 Subject: [PATCH 9/9] Update app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/FunctionalTimer.kt --- .../data/local/models/timer_functional/FunctionalTimer.kt | 1 - 1 file changed, 1 deletion(-) 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 232b189..760d656 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 @@ -20,7 +20,6 @@ abstract class FunctionalTimer(initialValue: Int) { fun getSessionReport(): SessionReport { return SessionReport( - id = "", studyTime = totalStudyTime, endTime = Timestamp.now() )