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) } | ||||||
|  | @ -84,8 +86,8 @@ abstract class AbstractSessionScreen { | ||||||
| 
 | 
 | ||||||
|         if (!timerEnd && sessionActions.getTimer().hasEnded()) { |         if (!timerEnd && sessionActions.getTimer().hasEnded()) { | ||||||
| //        sessionActions.prepareMediaPlayer() | //        sessionActions.prepareMediaPlayer() | ||||||
|             timerEnd = |              timerEnd = | ||||||
|                 true // Placeholder, vanaf hier moet het report opgestart worden en de sessie afgesloten |                  true // Placeholder, vanaf hier moet het report opgestart worden en de sessie afgesloten | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         val hms = sessionActions.getTimer().getHoursMinutesSeconds() |         val hms = sessionActions.getTimer().getHoursMinutesSeconds() | ||||||
|  | @ -134,4 +136,15 @@ abstract class AbstractSessionScreen { | ||||||
|     @Composable |     @Composable | ||||||
|     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
	
	 lbarraga
						lbarraga