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 c1a3ea2..04b4914 100644 --- a/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt +++ b/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt @@ -26,6 +26,7 @@ import be.ugent.sel.studeez.screens.profile.ProfileScreen import be.ugent.sel.studeez.screens.sign_up.SignUpScreen import be.ugent.sel.studeez.screens.splash.SplashScreen import be.ugent.sel.studeez.screens.timer_overview.TimerOverviewScreen +import be.ugent.sel.studeez.screens.timer_selection.TimerSelectionScreen import be.ugent.sel.studeez.ui.theme.StudeezTheme import kotlinx.coroutines.CoroutineScope @@ -130,4 +131,8 @@ fun NavGraphBuilder.studeezGraph(appState: StudeezAppstate) { composable(StudeezDestinations.EDIT_PROFILE_SCREEN) { EditProfileScreen(goBack, openAndPopUp) } + + composable(StudeezDestinations.TIMER_SELECTION_SCREEN) { + TimerSelectionScreen(open, openAndPopUp) + } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/data/SelectedTimerState.kt b/app/src/main/java/be/ugent/sel/studeez/data/SelectedTimerState.kt new file mode 100644 index 0000000..f8fcebd --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/data/SelectedTimerState.kt @@ -0,0 +1,14 @@ +package be.ugent.sel.studeez.data + +import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimer +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 SelectedTimerState @Inject constructor(){ + var selectedTimer: FunctionalTimer? = null +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/BreakTimerInfo.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/PomodoroTimerInfo.kt similarity index 97% rename from app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/BreakTimerInfo.kt rename to app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/PomodoroTimerInfo.kt index 735f917..18bcea6 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/BreakTimerInfo.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/PomodoroTimerInfo.kt @@ -3,7 +3,7 @@ package be.ugent.sel.studeez.data.local.models.timer_info import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalPomodoroTimer import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimer -class BreakTimerInfo( +class PomodoroTimerInfo( name: String, description: String, private val studyTime: Int, diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/ToTimerConverter.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/ToTimerConverter.kt index 021f9a0..ea06747 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/ToTimerConverter.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/ToTimerConverter.kt @@ -30,7 +30,7 @@ class ToTimerConverter { it.studyTime, it.id ) }, - TimerType.BREAK to TimerFactory { BreakTimerInfo( + TimerType.BREAK to TimerFactory { PomodoroTimerInfo( it.name, it.description, it.studyTime, 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 a6c8290..760c814 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 @@ -5,8 +5,9 @@ object StudeezDestinations { const val SIGN_UP_SCREEN = "signup" const val LOGIN_SCREEN = "login" - const val HOME_SCREEN = "home" + const val HOME_SCREEN = "home" const val TIMER_OVERVIEW_SCREEN = "timer_overview" + const val TIMER_SELECTION_SCREEN = "timer_selection" const val SESSION_SCREEN = "session" // const val TASKS_SCREEN = "tasks" // const val SESSIONS_SCREEN = "sessions" diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/home/HomeViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/home/HomeViewModel.kt index f0f7b64..7db6f8d 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/home/HomeViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/home/HomeViewModel.kt @@ -15,14 +15,7 @@ class HomeViewModel @Inject constructor( logService: LogService ) : StudeezViewModel(logService) { - fun onStartSessionClick(openAndPopUp: (String) -> Unit) { - openAndPopUp(StudeezDestinations.SESSION_SCREEN) - } - - fun onLogoutClick(openAndPopup: (String, String) -> Unit) { - launchCatching { - accountDAO.signOut() - openAndPopup(LOGIN_SCREEN, HOME_SCREEN) - } + fun onStartSessionClick(open: (String) -> Unit) { + open(StudeezDestinations.TIMER_SELECTION_SCREEN) } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionScreen.kt index 05a7d3d..341d335 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionScreen.kt @@ -7,37 +7,32 @@ import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.TextUnit -import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel import be.ugent.sel.studeez.R import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate +import be.ugent.sel.studeez.common.composable.SecondaryScreenTemplate import be.ugent.sel.studeez.resources import kotlinx.coroutines.delay +import kotlin.time.Duration.Companion.seconds @Composable fun SessionScreen( open: (String) -> Unit, openAndPopUp: (String, String) -> Unit, - viewModel: SessionViewModel = hiltViewModel() ) { - PrimaryScreenTemplate( - title = resources().getString(R.string.start_session), - open = open, - openAndPopUp = openAndPopUp - ) { - Timer(viewModel) - } + Timer() } @Composable -private fun Timer(viewModel: SessionViewModel = hiltViewModel()) { - var tikker by remember { mutableStateOf(false) } - LaunchedEffect(tikker) { - delay(1000) +fun Timer(viewModel: SessionViewModel = hiltViewModel()) { + + + var ticker by remember { mutableStateOf(false) } + LaunchedEffect(ticker) { + delay(1.seconds) viewModel.getTimer().tick() - tikker = !tikker + ticker = !ticker } val hms = viewModel.getTimer().getHoursMinutesSeconds() 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 7326212..f4bf93c 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,19 @@ package be.ugent.sel.studeez.screens.session -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.domain.LogService import be.ugent.sel.studeez.screens.StudeezViewModel +import be.ugent.sel.studeez.data.SelectedTimerState import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @HiltViewModel class SessionViewModel @Inject constructor( + private val selectedTimerState: SelectedTimerState, logService: LogService ) : StudeezViewModel(logService) { - private val timer: FunctionalTimer = FunctionalPomodoroTimer(15, 5, 3) - fun getTimer() : FunctionalTimer { - return timer + return selectedTimerState.selectedTimer!! } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_overview/TimerOverviewScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_overview/TimerOverviewScreen.kt index fccbc66..66ddfad 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_overview/TimerOverviewScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_overview/TimerOverviewScreen.kt @@ -1,5 +1,6 @@ package be.ugent.sel.studeez.screens.timer_overview +import androidx.annotation.StringRes import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -46,12 +47,12 @@ fun TimerOverviewScreen( ) { // Default Timers, cannot be edited items(viewModel.getDefaultTimers()) { - TimerEntry(timerInfo = it, canEdit = false) + TimerEntry(timerInfo = it, canDisplay = false) } // User timers, can be edited items(timers.value) { - TimerEntry(timerInfo = it, true) { timerInfo -> + TimerEntry(timerInfo = it, true, R.string.edit) { timerInfo -> viewModel.update(timerInfo) } } @@ -65,7 +66,12 @@ fun TimerOverviewScreen( } @Composable -fun TimerEntry(timerInfo: TimerInfo, canEdit: Boolean, update: (TimerInfo) -> Unit = {}) { +fun TimerEntry( + timerInfo: TimerInfo, + canDisplay: Boolean, + @StringRes buttonName: Int = -1, + buttonFunction: (TimerInfo) -> Unit = {} +) { Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier.fillMaxWidth(), @@ -83,9 +89,9 @@ fun TimerEntry(timerInfo: TimerInfo, canEdit: Boolean, update: (TimerInfo) -> Un fontSize = 15.sp ) } - if (canEdit) { - BasicButton(R.string.edit, Modifier.card()) { - // TODO + if (canDisplay) { + BasicButton(buttonName, Modifier.card()) { + buttonFunction(timerInfo) } } diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_selection/TimerSelectionScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_selection/TimerSelectionScreen.kt new file mode 100644 index 0000000..8e8df37 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_selection/TimerSelectionScreen.kt @@ -0,0 +1,44 @@ +package be.ugent.sel.studeez.screens.timer_selection + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.runtime.* +import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import be.ugent.sel.studeez.R +import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate +import be.ugent.sel.studeez.resources +import be.ugent.sel.studeez.screens.timer_overview.TimerEntry + +@Composable +fun TimerSelectionScreen( + open: (String) -> Unit, + openAndPopUp: (String, String) -> Unit, + viewModel: TimerSelectionViewModel = hiltViewModel() +) { + + val timers = viewModel.getAllTimers().collectAsState(initial = emptyList()) + + PrimaryScreenTemplate( + title = resources().getString(R.string.timers), + open = open, + openAndPopUp = openAndPopUp, + ) { + + LazyColumn(verticalArrangement = Arrangement.spacedBy(7.dp)) { + + // All timers + items(timers.value) { + TimerEntry( + timerInfo = it, + canDisplay = true, + buttonName = R.string.start + ) { timerInfo -> + viewModel.startSession(open, timerInfo) + } + } + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_selection/TimerSelectionViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_selection/TimerSelectionViewModel.kt new file mode 100644 index 0000000..c555bfa --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_selection/TimerSelectionViewModel.kt @@ -0,0 +1,28 @@ +package be.ugent.sel.studeez.screens.timer_selection + +import be.ugent.sel.studeez.data.SelectedTimerState +import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo +import be.ugent.sel.studeez.domain.LogService +import be.ugent.sel.studeez.domain.TimerDAO +import be.ugent.sel.studeez.navigation.StudeezDestinations +import be.ugent.sel.studeez.screens.StudeezViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject + +@HiltViewModel +class TimerSelectionViewModel @Inject constructor( + private val timerDAO: TimerDAO, + private val selectedTimerState: SelectedTimerState, + logService: LogService +) : StudeezViewModel(logService) { + + fun getAllTimers() : Flow> { + return timerDAO.getAllTimers() + } + + fun startSession(open: (String) -> Unit, timerInfo: TimerInfo) { + selectedTimerState.selectedTimer = timerInfo.getFunctionalTimer() + open(StudeezDestinations.SESSION_SCREEN) + } +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timers/TimerScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timers/TimerScreen.kt deleted file mode 100644 index b7ca484..0000000 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timers/TimerScreen.kt +++ /dev/null @@ -1,4 +0,0 @@ -package be.ugent.sel.studeez.screens.timers - -class TimerScreen { -} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b48d7f8..5b022c7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -13,6 +13,7 @@ Cancel Go back Next + Start Success!