From 5b0cff23762b9b0f8b8f42dfe1a3f75209860750 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 1 May 2023 12:51:46 +0200 Subject: [PATCH 01/25] timepicker button met popup-klok functionaliteit --- .../composable/TimePickerButtonComposable.kt | 47 +++++++++++++++++++ .../ugent/sel/studeez/data/EditTimerState.kt | 4 ++ .../models/timer_info/TimerInfoVisitor.kt | 4 ++ .../screens/timer_edit/GetTimerEditScreen.kt | 35 ++++++++++++++ .../screens/timer_edit/TimerEditScreen.kt | 2 + .../screens/timer_edit/TimerEditViewModel.kt | 4 ++ .../editScreens/AbstractTimerEditScreen.kt | 4 ++ .../editScreens/BreakTimerEditScreen.kt | 4 ++ .../editScreens/CustomTimerEditScreen.kt | 4 ++ .../editScreens/EndlessTimerEditScreen.kt | 4 ++ 10 files changed, 112 insertions(+) create mode 100644 app/src/main/java/be/ugent/sel/studeez/common/composable/TimePickerButtonComposable.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/data/EditTimerState.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/TimerInfoVisitor.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/GetTimerEditScreen.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditScreen.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditViewModel.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/AbstractTimerEditScreen.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/BreakTimerEditScreen.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/CustomTimerEditScreen.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/EndlessTimerEditScreen.kt diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/TimePickerButtonComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/TimePickerButtonComposable.kt new file mode 100644 index 0000000..869d724 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/TimePickerButtonComposable.kt @@ -0,0 +1,47 @@ +package be.ugent.sel.studeez.common.composable + +import android.app.TimePickerDialog +import android.app.TimePickerDialog.OnTimeSetListener +import android.content.Context +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Button +import androidx.compose.material.ButtonColors +import androidx.compose.material.ButtonDefaults +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import be.ugent.sel.studeez.data.local.models.timer_functional.HoursMinutesSeconds +import java.util.* + +// TODO codeduplicatie met Tibo, later wegdoen +@Composable +fun TimePickerButton( + hoursMinutesSeconds: HoursMinutesSeconds, + modifier: Modifier = Modifier, + colors: ButtonColors = ButtonDefaults.buttonColors(), + border: BorderStroke? = null, + onTimeSetListener: OnTimeSetListener +) { + val context = LocalContext.current + Button( + onClick = { pickDuration(context, onTimeSetListener) }, + modifier = modifier, + shape = RoundedCornerShape(20.dp), + colors = colors, + border = border + ) { + Text(text = hoursMinutesSeconds.toString()) + } +} + +// TODO idem codedup Tibo +private fun pickDuration(context: Context, listener: OnTimeSetListener) { + val mCalendar = Calendar.getInstance() + val mHour = mCalendar[Calendar.HOUR] + val mMinute = mCalendar[Calendar.MINUTE] + val mTimePickerDialog = TimePickerDialog(context, listener, mHour, mMinute, true) + mTimePickerDialog.show() +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/data/EditTimerState.kt b/app/src/main/java/be/ugent/sel/studeez/data/EditTimerState.kt new file mode 100644 index 0000000..9686e94 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/data/EditTimerState.kt @@ -0,0 +1,4 @@ +package be.ugent.sel.studeez.data + +class EditTimerState { +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/TimerInfoVisitor.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/TimerInfoVisitor.kt new file mode 100644 index 0000000..0dedc94 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/TimerInfoVisitor.kt @@ -0,0 +1,4 @@ +package be.ugent.sel.studeez.data.local.models.timer_info + +interface TimerInfoVisitor { +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/GetTimerEditScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/GetTimerEditScreen.kt new file mode 100644 index 0000000..c6579e8 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/GetTimerEditScreen.kt @@ -0,0 +1,35 @@ +package be.ugent.sel.studeez.screens.timer_edit + +import android.annotation.SuppressLint +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +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.timer_info.CustomTimerInfo +import be.ugent.sel.studeez.data.local.models.timer_info.EndlessTimerInfo +import be.ugent.sel.studeez.data.local.models.timer_info.PomodoroTimerInfo +import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfoVisitor + +class GetTimerEditView: TimerInfoVisitor { + + @SuppressLint("ComposableNaming") + override fun visitCustomTimerInfo(customTimerInfo: CustomTimerInfo) { + + } + + @SuppressLint("ComposableNaming") + override fun visitEndlessTimerInfo(endlessTimerInfo: EndlessTimerInfo) { + + } + + @SuppressLint("ComposableNaming") + override fun visitBreakTimerInfo(pomodoroTimerInfo: PomodoroTimerInfo) { + + } + + +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditScreen.kt new file mode 100644 index 0000000..ac1ff8a --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditScreen.kt @@ -0,0 +1,2 @@ +package be.ugent.sel.studeez.screens.timer_edit + diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditViewModel.kt new file mode 100644 index 0000000..20f5952 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditViewModel.kt @@ -0,0 +1,4 @@ +package be.ugent.sel.studeez.screens.timer_edit + +class TimerEditViewModel { +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/AbstractTimerEditScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/AbstractTimerEditScreen.kt new file mode 100644 index 0000000..59b04e7 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/AbstractTimerEditScreen.kt @@ -0,0 +1,4 @@ +package be.ugent.sel.studeez.screens.timer_edit + +abstract class AbstractTimerEditScreen { +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/BreakTimerEditScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/BreakTimerEditScreen.kt new file mode 100644 index 0000000..1405682 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/BreakTimerEditScreen.kt @@ -0,0 +1,4 @@ +package be.ugent.sel.studeez.screens.timer_edit.editScreens + +class BreakTimerEditScreen { +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/CustomTimerEditScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/CustomTimerEditScreen.kt new file mode 100644 index 0000000..bbe66ec --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/CustomTimerEditScreen.kt @@ -0,0 +1,4 @@ +package be.ugent.sel.studeez.screens.timer_edit + +class CustomTimerEditScreen { +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/EndlessTimerEditScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/EndlessTimerEditScreen.kt new file mode 100644 index 0000000..5c6263d --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/EndlessTimerEditScreen.kt @@ -0,0 +1,4 @@ +package be.ugent.sel.studeez.screens.timer_edit.editScreens + +class EndlessTimerEditScreen { +} \ No newline at end of file From 1d6de333e4d9a17fc657b93af7adf22a3aba5a4f Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 1 May 2023 12:53:35 +0200 Subject: [PATCH 02/25] HMS now takes ints and has totalseconds and tostring functions --- .../timer_functional/HoursMinutesSeconds.kt | 15 +++++++++++++-- .../data/local/models/timer_functional/Time.kt | 6 +----- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/HoursMinutesSeconds.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/HoursMinutesSeconds.kt index 856aa26..2f630c9 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/HoursMinutesSeconds.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/HoursMinutesSeconds.kt @@ -1,4 +1,15 @@ package be.ugent.sel.studeez.data.local.models.timer_functional -data class HoursMinutesSeconds(val hours: String, val minutes: String, val seconds: String -) \ No newline at end of file +data class HoursMinutesSeconds(val hours: Int, val minutes: Int, val seconds: Int) { + + fun getTotalSeconds(): Int { + return hours * 60 * 60 + minutes * 60 + seconds + } + + override fun toString(): String { + val hoursString = hours.toString().padStart(2, '0') + val minutesString = minutes.toString().padStart(2, '0') + val secondsString = seconds.toString().padStart(2, '0') + return "$hoursString : $minutesString : $secondsString" + } +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/Time.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/Time.kt index ec7702d..c512d96 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/Time.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/Time.kt @@ -17,11 +17,7 @@ class Time(initialTime: Int) { val minutes: Int = (time / (60)) % 60 val seconds: Int = time % 60 - return HoursMinutesSeconds( - hours.toString().padStart(2, '0'), - minutes.toString().padStart(2, '0'), - seconds.toString().padStart(2, '0') - ) + return HoursMinutesSeconds(hours, minutes, seconds) } } \ No newline at end of file From f2d45b410e2a288e28025b589f0c70e6a5dd655a Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 1 May 2023 12:54:24 +0200 Subject: [PATCH 03/25] added singleLine parameter (default false) --- .../sel/studeez/common/composable/TextFieldComposable.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/TextFieldComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/TextFieldComposable.kt index 2c0b450..47dbb0b 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/TextFieldComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/TextFieldComposable.kt @@ -41,10 +41,12 @@ fun BasicField( fun LabelledInputField( value: String, onNewValue: (String) -> Unit, - @StringRes label: Int + @StringRes label: Int, + singleLine: Boolean = false ) { OutlinedTextField( value = value, + singleLine = singleLine, onValueChange = onNewValue, label = { Text(text = stringResource(id = label)) }, modifier = Modifier.fieldModifier() From 93a282026eadb334277e6b4b29ec4b00c6c22319 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 1 May 2023 12:56:50 +0200 Subject: [PATCH 04/25] added visitor to TimerInfo --- .../data/local/models/timer_info/CustomTimerInfo.kt | 7 +++++-- .../data/local/models/timer_info/EndlessTimerInfo.kt | 4 ++++ .../data/local/models/timer_info/PomodoroTimerInfo.kt | 11 ++++++++--- .../studeez/data/local/models/timer_info/TimerInfo.kt | 5 +++-- .../data/local/models/timer_info/TimerInfoVisitor.kt | 9 ++++++++- 5 files changed, 28 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/CustomTimerInfo.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/CustomTimerInfo.kt index 5e06536..b3ecea1 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/CustomTimerInfo.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/CustomTimerInfo.kt @@ -6,11 +6,10 @@ import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimer class CustomTimerInfo( name: String, description: String, - private val studyTime: Int, + val studyTime: Int, id: String = "" ): TimerInfo(id, name, description) { - override fun getFunctionalTimer(): FunctionalTimer { return FunctionalCustomTimer(studyTime) } @@ -24,4 +23,8 @@ class CustomTimerInfo( ) } + override fun accept(visitor: TimerInfoVisitor): T { + return visitor.visitCustomTimerInfo(this) + } + } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/EndlessTimerInfo.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/EndlessTimerInfo.kt index d459a4e..45f7fd7 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/EndlessTimerInfo.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/EndlessTimerInfo.kt @@ -22,4 +22,8 @@ class EndlessTimerInfo( ) } + override fun accept(visitor: TimerInfoVisitor): T { + return visitor.visitEndlessTimerInfo(this) + } + } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/PomodoroTimerInfo.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/PomodoroTimerInfo.kt index 18bcea6..dbbb0be 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/PomodoroTimerInfo.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/PomodoroTimerInfo.kt @@ -2,13 +2,14 @@ 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 +import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimerVisitor class PomodoroTimerInfo( name: String, description: String, - private val studyTime: Int, - private val breakTime: Int, - private val repeats: Int, + val studyTime: Int, + val breakTime: Int, + val repeats: Int, id: String = "" ): TimerInfo(id, name, description) { @@ -28,4 +29,8 @@ class PomodoroTimerInfo( ) } + override fun accept(visitor: TimerInfoVisitor): T { + return visitor.visitBreakTimerInfo(this) + } + } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/TimerInfo.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/TimerInfo.kt index 343e7e3..e4deded 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/TimerInfo.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/TimerInfo.kt @@ -7,8 +7,8 @@ import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimer */ abstract class TimerInfo( val id: String, - val name: String, - val description: String + var name: String, + var description: String ) { /** @@ -21,6 +21,7 @@ abstract class TimerInfo( * TODO implementaties hebben nog hardgecodeerde strings. */ abstract fun asJson(): Map + abstract fun accept(visitor: TimerInfoVisitor): T } diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/TimerInfoVisitor.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/TimerInfoVisitor.kt index 0dedc94..e331c8d 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/TimerInfoVisitor.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/TimerInfoVisitor.kt @@ -1,4 +1,11 @@ package be.ugent.sel.studeez.data.local.models.timer_info -interface TimerInfoVisitor { +interface TimerInfoVisitor { + + fun visitCustomTimerInfo(customTimerInfo: CustomTimerInfo): T + + fun visitEndlessTimerInfo(endlessTimerInfo: EndlessTimerInfo): T + + fun visitBreakTimerInfo(pomodoroTimerInfo: PomodoroTimerInfo): T + } \ No newline at end of file From ddbac51c9d44cf363f6a61584090e70a66ca1b58 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 1 May 2023 12:57:31 +0200 Subject: [PATCH 05/25] #30 added edit screen to destinations --- .../java/be/ugent/sel/studeez/data/EditTimerState.kt | 9 ++++++++- .../ugent/sel/studeez/navigation/StudeezDestinations.kt | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/data/EditTimerState.kt b/app/src/main/java/be/ugent/sel/studeez/data/EditTimerState.kt index 9686e94..dceec8c 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/EditTimerState.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/EditTimerState.kt @@ -1,4 +1,11 @@ package be.ugent.sel.studeez.data -class EditTimerState { +import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimer +import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class EditTimerState @Inject constructor(){ + lateinit var timerInfo: TimerInfo } \ No newline at end of file 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 ab10c22..eacf2c1 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 @@ -8,6 +8,7 @@ object StudeezDestinations { const val HOME_SCREEN = "home" const val TIMER_OVERVIEW_SCREEN = "timer_overview" const val TIMER_SELECTION_SCREEN = "timer_selection" + const val TIMER_EDIT_SCREEN = "timer_edit" const val SESSION_SCREEN = "session" const val SESSION_RECAP = "session_recap" // const val TASKS_SCREEN = "tasks" From 59c4d8bb5ba4a4dffe574cfd47b8b79870aa8185 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 1 May 2023 13:00:18 +0200 Subject: [PATCH 06/25] hms toString --- .../screens/session/sessionScreens/AbstractSessionScreen.kt | 2 +- .../sel/studeez/screens/session_recap/SessionRecapScreen.kt | 3 +-- 2 files changed, 2 insertions(+), 3 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 4c0cc3e..06a80b6 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 @@ -78,7 +78,7 @@ abstract class AbstractSessionScreen { val hms = sessionActions.getTimer().getHoursMinutesSeconds() Column { Text( - text = "${hms.hours} : ${hms.minutes} : ${hms.seconds}", + text = hms.toString(), modifier = Modifier .fillMaxWidth() .padding(50.dp), 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 2ddbc32..53c9a16 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 @@ -48,8 +48,7 @@ fun SessionRecapScreen(modifier: Modifier, sessionRecapActions: SessionRecapActi val studyTime: Int = sessionReport.studyTime val hms: HoursMinutesSeconds = Time(studyTime).getAsHMS() Column { - Text(text = "You studied: ${hms.hours} : ${hms.minutes} : ${hms.seconds}") - + Text(text = "You studied: $hms") BasicButton( R.string.save, Modifier.basicButton() ) { From dfbc99ba38b08537c13b5455d4f23eee5fbd2efd Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 1 May 2023 13:01:07 +0200 Subject: [PATCH 07/25] #30 added edit screen to navgraph --- app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) 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 c8a133b..36ecc88 100644 --- a/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt +++ b/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt @@ -40,6 +40,7 @@ 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_edit.TimerEditRoute import be.ugent.sel.studeez.screens.timer_overview.TimerOverviewRoute import be.ugent.sel.studeez.screens.timer_selection.TimerSelectionRoute import be.ugent.sel.studeez.ui.theme.StudeezTheme @@ -161,6 +162,15 @@ fun StudeezNavGraph( TimerOverviewRoute( viewModel = hiltViewModel(), drawerActions = drawerActions, + open = open + ) + } + + composable(StudeezDestinations.TIMER_EDIT_SCREEN) { + TimerEditRoute( + open = open, + popUp = goBack, + viewModel = hiltViewModel() ) } From e592a6acc08bcaad4382c3c58473a7bf53326b83 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 1 May 2023 13:02:29 +0200 Subject: [PATCH 08/25] #30 hierarchical edit screen structure --- .../editScreens/AbstractTimerEditScreen.kt | 58 ++++++++++++++++++- .../editScreens/BreakTimerEditScreen.kt | 27 ++++++++- .../editScreens/CustomTimerEditScreen.kt | 31 +++++++++- .../editScreens/EndlessTimerEditScreen.kt | 4 +- 4 files changed, 114 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/AbstractTimerEditScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/AbstractTimerEditScreen.kt index 59b04e7..eedaa78 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/AbstractTimerEditScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/AbstractTimerEditScreen.kt @@ -1,4 +1,58 @@ -package be.ugent.sel.studeez.screens.timer_edit +package be.ugent.sel.studeez.screens.timer_edit.editScreens + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.OutlinedTextField +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import be.ugent.sel.studeez.R +import be.ugent.sel.studeez.common.composable.BasicButton +import be.ugent.sel.studeez.common.composable.LabelledInputField +import be.ugent.sel.studeez.common.ext.basicButton +import be.ugent.sel.studeez.common.ext.fieldModifier +import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo + +abstract class AbstractTimerEditScreen(private val timerInfo: TimerInfo) { + + @Composable + operator fun invoke(onSaveClick: (TimerInfo) -> Unit) { + // TODO klassen hierarchie voor uistate + // TODO klassen extras implementeren + + Column( + modifier = Modifier.fillMaxWidth().fillMaxHeight(), + horizontalAlignment = Alignment.CenterHorizontally + ) { + + // Fields that every timer shares (ommited id) + LabelledInputField( + value = timerInfo.name, + onNewValue = {}, + label = R.string.name + ) + LabelledInputField( + value = timerInfo.description, + onNewValue = {}, + label = R.string.description, + singleLine = false + ) + + ExtraFields() + + BasicButton(R.string.save, Modifier.basicButton()) { + onSaveClick(timerInfo) + } + } + } + + @Composable + open fun ExtraFields() { + // By default no extra fields, unless overwritten by subclass. + } -abstract class AbstractTimerEditScreen { } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/BreakTimerEditScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/BreakTimerEditScreen.kt index 1405682..f00e9f6 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/BreakTimerEditScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/BreakTimerEditScreen.kt @@ -1,4 +1,29 @@ package be.ugent.sel.studeez.screens.timer_edit.editScreens -class BreakTimerEditScreen { +import androidx.compose.runtime.* +import be.ugent.sel.studeez.common.composable.TimePickerButton +import be.ugent.sel.studeez.data.local.models.timer_functional.HoursMinutesSeconds +import be.ugent.sel.studeez.data.local.models.timer_functional.Time +import be.ugent.sel.studeez.data.local.models.timer_info.PomodoroTimerInfo + +class BreakTimerEditScreen( + private val breakTimerInfo: PomodoroTimerInfo +): AbstractTimerEditScreen(breakTimerInfo) { + + @Composable + override fun ExtraFields() { + // If the user presses the OK button on the timepicker, the time in the button should change + var studyTime: Int by remember { mutableStateOf(breakTimerInfo.studyTime) } + var breakTime: Int by remember { mutableStateOf(breakTimerInfo.breakTime) } + + val breakHms: HoursMinutesSeconds = Time(breakTime).getAsHMS() + val studyHms: HoursMinutesSeconds = Time(studyTime).getAsHMS() + TimePickerButton(studyHms) { _, hour, minute -> + studyTime = hour * 60 * 60 + minute * 60 + } + TimePickerButton(breakHms) { _, hour, minute -> + breakTime = hour * 60 * 60 + minute * 60 + } + } + } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/CustomTimerEditScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/CustomTimerEditScreen.kt index bbe66ec..3e2e234 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/CustomTimerEditScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/CustomTimerEditScreen.kt @@ -1,4 +1,31 @@ -package be.ugent.sel.studeez.screens.timer_edit +package be.ugent.sel.studeez.screens.timer_edit.editScreens -class CustomTimerEditScreen { +import androidx.compose.runtime.* +import androidx.compose.ui.tooling.preview.Preview +import be.ugent.sel.studeez.common.composable.TimePickerButton +import be.ugent.sel.studeez.data.local.models.timer_functional.HoursMinutesSeconds +import be.ugent.sel.studeez.data.local.models.timer_functional.Time +import be.ugent.sel.studeez.data.local.models.timer_info.CustomTimerInfo + +class CustomTimerEditScreen(private val customTimerInfo: CustomTimerInfo): AbstractTimerEditScreen(customTimerInfo) { + + @Composable + override fun ExtraFields() { + // If the user presses the OK button on the timepicker, the time in the button should change + var studyTime by remember { mutableStateOf(customTimerInfo.studyTime) } + + val hms: HoursMinutesSeconds = Time(studyTime).getAsHMS() + TimePickerButton(hms) { _, hour, minute -> + studyTime = hour * 60 * 60 + minute * 60 + } + } + + +} + +@Preview +@Composable +fun TimePickerPreview() { + val customTimerInfo = CustomTimerInfo("custom", "my description", 25) + CustomTimerEditScreen(customTimerInfo).ExtraFields() } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/EndlessTimerEditScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/EndlessTimerEditScreen.kt index 5c6263d..0f5b30a 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/EndlessTimerEditScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/EndlessTimerEditScreen.kt @@ -1,4 +1,6 @@ package be.ugent.sel.studeez.screens.timer_edit.editScreens -class EndlessTimerEditScreen { +import be.ugent.sel.studeez.data.local.models.timer_info.EndlessTimerInfo + +class EndlessTimerEditScreen(endlessTimerInfo: EndlessTimerInfo): AbstractTimerEditScreen(endlessTimerInfo) { } \ No newline at end of file From d1c23fce48b716a54b885a61f16c010aaa6d6bd8 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 1 May 2023 13:03:12 +0200 Subject: [PATCH 09/25] #30 Visitor implementatie om Edit scherm te verkrijgen --- .../screens/timer_edit/GetTimerEditScreen.kt | 30 +++++++------------ 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/GetTimerEditScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/GetTimerEditScreen.kt index c6579e8..b22b775 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/GetTimerEditScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/GetTimerEditScreen.kt @@ -1,34 +1,26 @@ package be.ugent.sel.studeez.screens.timer_edit -import android.annotation.SuppressLint -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.material.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -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.timer_info.CustomTimerInfo import be.ugent.sel.studeez.data.local.models.timer_info.EndlessTimerInfo import be.ugent.sel.studeez.data.local.models.timer_info.PomodoroTimerInfo import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfoVisitor +import be.ugent.sel.studeez.screens.timer_edit.editScreens.AbstractTimerEditScreen +import be.ugent.sel.studeez.screens.timer_edit.editScreens.BreakTimerEditScreen +import be.ugent.sel.studeez.screens.timer_edit.editScreens.CustomTimerEditScreen +import be.ugent.sel.studeez.screens.timer_edit.editScreens.EndlessTimerEditScreen -class GetTimerEditView: TimerInfoVisitor { - - @SuppressLint("ComposableNaming") - override fun visitCustomTimerInfo(customTimerInfo: CustomTimerInfo) { +class GetTimerEditScreen: TimerInfoVisitor { + override fun visitCustomTimerInfo(customTimerInfo: CustomTimerInfo): AbstractTimerEditScreen { + return CustomTimerEditScreen(customTimerInfo) } - @SuppressLint("ComposableNaming") - override fun visitEndlessTimerInfo(endlessTimerInfo: EndlessTimerInfo) { - + override fun visitEndlessTimerInfo(endlessTimerInfo: EndlessTimerInfo): AbstractTimerEditScreen { + return EndlessTimerEditScreen(endlessTimerInfo) } - @SuppressLint("ComposableNaming") - override fun visitBreakTimerInfo(pomodoroTimerInfo: PomodoroTimerInfo) { - + override fun visitBreakTimerInfo(pomodoroTimerInfo: PomodoroTimerInfo): AbstractTimerEditScreen { + return BreakTimerEditScreen(pomodoroTimerInfo) } From 6d8f9befb31b5a1d4db44db8b83a1bf0b85d7848 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 1 May 2023 13:04:06 +0200 Subject: [PATCH 10/25] #30 timerEdit screen and viewmodel --- .../screens/timer_edit/TimerEditScreen.kt | 80 +++++++++++++++++++ .../screens/timer_edit/TimerEditViewModel.kt | 26 +++++- 2 files changed, 105 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditScreen.kt index ac1ff8a..4540faa 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditScreen.kt @@ -1,2 +1,82 @@ package be.ugent.sel.studeez.screens.timer_edit + +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import be.ugent.sel.studeez.common.composable.SecondaryScreenTemplate +import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo +import be.ugent.sel.studeez.screens.timer_edit.editScreens.AbstractTimerEditScreen +import be.ugent.sel.studeez.ui.theme.StudeezTheme + +data class TimerEditActions( + val getTimerInfo: () -> TimerInfo, + val saveTimer: (TimerInfo) -> Unit +) + +fun getTimerEditActions( + viewModel: TimerEditViewModel, + open: (String) -> Unit +): TimerEditActions { + return TimerEditActions( + getTimerInfo = viewModel::getTimerInfo, + saveTimer = viewModel::saveTimer + ) +} + +@Composable +fun TimerEditRoute( + open: (String) -> Unit, + popUp: () -> Unit, + viewModel: TimerEditViewModel, +) { + TimerEditScreen( + timerEditActions = getTimerEditActions(viewModel, open), + popUp = popUp + ) +} + +@Composable +fun TimerEditScreen( + timerEditActions: TimerEditActions, + popUp: () -> Unit +) { + SecondaryScreenTemplate(title = "Edit Timer", popUp = { /*TODO*/ }) { + val timerEditScreen = timerEditActions.getTimerInfo().accept(GetTimerEditScreen()) + timerEditScreen { timerInfo -> timerEditActions.saveTimer(timerInfo) } + } +} + +//@Preview +//@Composable +//fun TimerEditScreenPreview() { +// val editEntries: List = listOf( +// EditEntry("Name", "MyTimer") {}, +// EditEntry("Description", "Dit is een leuke timer") {}, +// EditEntry("StudyTime", "25") {} +// ) +// val actions = TimerEditActions { editEntries } +// StudeezTheme { TimerEditScreen(timerEditActions = actions) {} } +//} + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditViewModel.kt index 20f5952..98d060f 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditViewModel.kt @@ -1,4 +1,28 @@ package be.ugent.sel.studeez.screens.timer_edit -class TimerEditViewModel { +import be.ugent.sel.studeez.data.EditTimerState +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.screens.StudeezViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class TimerEditViewModel @Inject constructor( + private val editTimerState: EditTimerState, + private val timerDAO: TimerDAO, + logService: LogService +) : StudeezViewModel(logService) { + + private val timerInfo: TimerInfo = editTimerState.timerInfo + + fun getTimerInfo(): TimerInfo { + return timerInfo + } + + fun saveTimer(timerInfo: TimerInfo) { + timerDAO.updateTimer(timerInfo) + } + } \ No newline at end of file From a218f5fcf59a84f8e178ad071b2ef1dfa06536c3 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 1 May 2023 13:05:45 +0200 Subject: [PATCH 11/25] #30 open wordt nu meegegeven aan de edit functie --- .../studeez/screens/timer_overview/TimerOverviewScreen.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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 9489a30..1f782e7 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 @@ -28,11 +28,12 @@ data class TimerOverviewActions( fun getTimerOverviewActions( viewModel: TimerOverviewViewModel, + open: (String) -> Unit, ): TimerOverviewActions { return TimerOverviewActions( getUserTimers = viewModel::getUserTimers, getDefaultTimers = viewModel::getDefaultTimers, - onEditClick = { viewModel.update(it) }, + onEditClick = { viewModel.update(it, open) }, ) } @@ -40,10 +41,11 @@ fun getTimerOverviewActions( fun TimerOverviewRoute( viewModel: TimerOverviewViewModel, drawerActions: DrawerActions, + open: (String) -> Unit ) { TimerOverviewScreen( - timerOverviewActions = getTimerOverviewActions(viewModel), - drawerActions = drawerActions, + timerOverviewActions = getTimerOverviewActions(viewModel, open), + drawerActions = drawerActions ) } From d9c281330f2333733e971e88ffb590f94d560771 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 1 May 2023 13:06:50 +0200 Subject: [PATCH 12/25] #30 geef timerinfo door naar edit scherm en open editscherm bij onEditClick --- .../screens/timer_overview/TimerOverviewViewModel.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_overview/TimerOverviewViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_overview/TimerOverviewViewModel.kt index c2be1e9..2f9457d 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_overview/TimerOverviewViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_overview/TimerOverviewViewModel.kt @@ -1,9 +1,11 @@ package be.ugent.sel.studeez.screens.timer_overview +import be.ugent.sel.studeez.data.EditTimerState import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo import be.ugent.sel.studeez.domain.ConfigurationService 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 @@ -13,6 +15,7 @@ import javax.inject.Inject class TimerOverviewViewModel @Inject constructor( private val configurationService: ConfigurationService, private val timerDAO: TimerDAO, + private val editTimerState: EditTimerState, logService: LogService ) : StudeezViewModel(logService) { @@ -24,7 +27,10 @@ class TimerOverviewViewModel @Inject constructor( return configurationService.getDefaultTimers() } - fun update(timerInfo: TimerInfo) = timerDAO.updateTimer(timerInfo) + fun update(timerInfo: TimerInfo, open: (String) -> Unit) { + editTimerState.timerInfo = timerInfo + open(StudeezDestinations.TIMER_EDIT_SCREEN) + } fun delete(timerInfo: TimerInfo) =timerDAO.deleteTimer(timerInfo) From e4fc0a9a0794a25db580333745c774a6b6814388 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 1 May 2023 13:09:24 +0200 Subject: [PATCH 13/25] #30 added edit screen specific text --- app/src/main/res/values/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5b9f561..d171ff4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -75,6 +75,14 @@ Done! Take a break! + + Name + Description + Study Time + Break Time + Number of Repeats + + Settings From 360097cfc5d4c4cb4a3b730b7bd293426b617807 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 1 May 2023 17:50:22 +0200 Subject: [PATCH 14/25] added timepicker card --- .../composable/TimePickerButtonComposable.kt | 86 ++++++++++++++++--- .../editScreens/EditScreenUIState.kt | 4 + 2 files changed, 78 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/EditScreenUIState.kt diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/TimePickerButtonComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/TimePickerButtonComposable.kt index 869d724..eab0d35 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/TimePickerButtonComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/TimePickerButtonComposable.kt @@ -3,45 +3,107 @@ package be.ugent.sel.studeez.common.composable import android.app.TimePickerDialog import android.app.TimePickerDialog.OnTimeSetListener import android.content.Context +import androidx.annotation.StringRes import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.Button -import androidx.compose.material.ButtonColors -import androidx.compose.material.ButtonDefaults -import androidx.compose.material.Text -import androidx.compose.runtime.Composable +import androidx.compose.material.* +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import be.ugent.sel.studeez.R +import be.ugent.sel.studeez.common.ext.fieldModifier import be.ugent.sel.studeez.data.local.models.timer_functional.HoursMinutesSeconds +import be.ugent.sel.studeez.ui.theme.StudeezTheme import java.util.* -// TODO codeduplicatie met Tibo, later wegdoen +@Composable +fun TimePickerCard( + @StringRes text: Int, + initialSeconds: Int, + onTimeChosen: (Int) -> Unit +) { + Card( + modifier = Modifier + .fillMaxWidth() + .fieldModifier(), + elevation = 10.dp + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .fieldModifier(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = stringResource(id = text), + fontWeight = FontWeight.Medium + ) + + TimePickerButton( + initialSeconds = initialSeconds, + onTimeChosen = onTimeChosen + ) + } + } +} + @Composable fun TimePickerButton( - hoursMinutesSeconds: HoursMinutesSeconds, + initialSeconds: Int, modifier: Modifier = Modifier, colors: ButtonColors = ButtonDefaults.buttonColors(), border: BorderStroke? = null, - onTimeSetListener: OnTimeSetListener + onTimeChosen: (Int) -> Unit ) { val context = LocalContext.current + val timeState: MutableState = remember { + mutableStateOf(initialSeconds) + } + Button( - onClick = { pickDuration(context, onTimeSetListener) }, + onClick = { pickDuration(context, onTimeChosen, timeState) }, modifier = modifier, shape = RoundedCornerShape(20.dp), colors = colors, border = border ) { - Text(text = hoursMinutesSeconds.toString()) + Text(text = HoursMinutesSeconds(timeState.value).toString()) } } -// TODO idem codedup Tibo -private fun pickDuration(context: Context, listener: OnTimeSetListener) { +private fun pickDuration(context: Context, nextStep: (Int) -> Unit, timeState: MutableState) { + val listener = OnTimeSetListener { _, hour, minute -> + timeState.value = hour * 60 * 60 + minute * 60 + nextStep(timeState.value) + } val mCalendar = Calendar.getInstance() val mHour = mCalendar[Calendar.HOUR] val mMinute = mCalendar[Calendar.MINUTE] val mTimePickerDialog = TimePickerDialog(context, listener, mHour, mMinute, true) mTimePickerDialog.show() +} + +@Preview +@Composable +fun TimePickerButtonPreview() { + StudeezTheme { + TimePickerButton(initialSeconds = 5 * 60 + 12, onTimeChosen = {}) + } +} + +@Preview +@Composable +fun TimePickerCardPreview() { + StudeezTheme { + TimePickerCard(text = R.string.studyTime, initialSeconds = 5 * 60 + 12, onTimeChosen = {}) + } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/EditScreenUIState.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/EditScreenUIState.kt new file mode 100644 index 0000000..219c06b --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/EditScreenUIState.kt @@ -0,0 +1,4 @@ +package be.ugent.sel.studeez.screens.timer_edit.editScreens + +class EditScreenUIState { +} \ No newline at end of file From dafa8cc606d7ae92f72514a037d5da93ae5bf5bb Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 1 May 2023 17:51:51 +0200 Subject: [PATCH 15/25] extra constructor HMS that takes total seconds --- .../local/models/timer_functional/HoursMinutesSeconds.kt | 6 ++++++ .../sel/studeez/data/local/models/timer_functional/Time.kt | 6 +----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/HoursMinutesSeconds.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/HoursMinutesSeconds.kt index 2f630c9..d09d8a7 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/HoursMinutesSeconds.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/HoursMinutesSeconds.kt @@ -2,6 +2,12 @@ package be.ugent.sel.studeez.data.local.models.timer_functional data class HoursMinutesSeconds(val hours: Int, val minutes: Int, val seconds: Int) { + constructor(sec: Int): this( + sec / (60 * 60), + (sec / (60)) % 60, + sec % 60 + ) + fun getTotalSeconds(): Int { return hours * 60 * 60 + minutes * 60 + seconds } diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/Time.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/Time.kt index c512d96..ae0d1ef 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/Time.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/Time.kt @@ -13,11 +13,7 @@ class Time(initialTime: Int) { } fun getAsHMS(): HoursMinutesSeconds { - val hours: Int = time / (60 * 60) - val minutes: Int = (time / (60)) % 60 - val seconds: Int = time % 60 - - return HoursMinutesSeconds(hours, minutes, seconds) + return HoursMinutesSeconds(time) } } \ No newline at end of file From bfde19caaf95d033d32d814eb38c00abdb1e5e3a Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 1 May 2023 17:52:40 +0200 Subject: [PATCH 16/25] making some fields public --- .../studeez/data/local/models/timer_info/CustomTimerInfo.kt | 2 +- .../studeez/data/local/models/timer_info/PomodoroTimerInfo.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/CustomTimerInfo.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/CustomTimerInfo.kt index b3ecea1..d88e39f 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/CustomTimerInfo.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/CustomTimerInfo.kt @@ -6,7 +6,7 @@ import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimer class CustomTimerInfo( name: String, description: String, - val studyTime: Int, + var studyTime: Int, id: String = "" ): TimerInfo(id, name, description) { diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/PomodoroTimerInfo.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/PomodoroTimerInfo.kt index dbbb0be..6dd6797 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/PomodoroTimerInfo.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/PomodoroTimerInfo.kt @@ -7,8 +7,8 @@ import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimerVi class PomodoroTimerInfo( name: String, description: String, - val studyTime: Int, - val breakTime: Int, + var studyTime: Int, + var breakTime: Int, val repeats: Int, id: String = "" ): TimerInfo(id, name, description) { From 48a1a50a5f27176c0077d055ada8cb5eacb9c7a1 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 1 May 2023 17:54:06 +0200 Subject: [PATCH 17/25] #30 added textfieldStates to editScreen --- .../editScreens/AbstractTimerEditScreen.kt | 50 +++++++++++-------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/AbstractTimerEditScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/AbstractTimerEditScreen.kt index eedaa78..437589b 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/AbstractTimerEditScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/AbstractTimerEditScreen.kt @@ -1,49 +1,57 @@ package be.ugent.sel.studeez.screens.timer_edit.editScreens +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material.OutlinedTextField -import androidx.compose.material.Text -import androidx.compose.runtime.Composable +import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import be.ugent.sel.studeez.R import be.ugent.sel.studeez.common.composable.BasicButton import be.ugent.sel.studeez.common.composable.LabelledInputField import be.ugent.sel.studeez.common.ext.basicButton -import be.ugent.sel.studeez.common.ext.fieldModifier import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo abstract class AbstractTimerEditScreen(private val timerInfo: TimerInfo) { @Composable operator fun invoke(onSaveClick: (TimerInfo) -> Unit) { - // TODO klassen hierarchie voor uistate - // TODO klassen extras implementeren + + var name by remember { mutableStateOf(timerInfo.name) } + var description by remember { mutableStateOf(timerInfo.description) } + + // This shall rerun whenever name and description change + timerInfo.name = name + timerInfo.description = description Column( - modifier = Modifier.fillMaxWidth().fillMaxHeight(), - horizontalAlignment = Alignment.CenterHorizontally + verticalArrangement = Arrangement.SpaceBetween, + modifier = Modifier.fillMaxHeight().verticalScroll(rememberScrollState()), ) { + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally + ) { - // Fields that every timer shares (ommited id) - LabelledInputField( - value = timerInfo.name, - onNewValue = {}, - label = R.string.name - ) - LabelledInputField( - value = timerInfo.description, - onNewValue = {}, - label = R.string.description, - singleLine = false - ) + // Fields that every timer shares (ommited id) + LabelledInputField( + value = name, + onNewValue = { name = it }, + label = R.string.name + ) + LabelledInputField( + value = description, + onNewValue = { description = it }, + label = R.string.description, + singleLine = false + ) - ExtraFields() + ExtraFields() + } BasicButton(R.string.save, Modifier.basicButton()) { onSaveClick(timerInfo) } From ea2c91d59a6d4a501b7bf9c691307ea679c31835 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 1 May 2023 17:55:25 +0200 Subject: [PATCH 18/25] #30 added timepicker card to custom timer edit screen --- .../editScreens/CustomTimerEditScreen.kt | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/CustomTimerEditScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/CustomTimerEditScreen.kt index 3e2e234..f3278d5 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/CustomTimerEditScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/CustomTimerEditScreen.kt @@ -2,21 +2,22 @@ package be.ugent.sel.studeez.screens.timer_edit.editScreens import androidx.compose.runtime.* import androidx.compose.ui.tooling.preview.Preview -import be.ugent.sel.studeez.common.composable.TimePickerButton -import be.ugent.sel.studeez.data.local.models.timer_functional.HoursMinutesSeconds -import be.ugent.sel.studeez.data.local.models.timer_functional.Time +import be.ugent.sel.studeez.common.composable.TimePickerCard import be.ugent.sel.studeez.data.local.models.timer_info.CustomTimerInfo +import be.ugent.sel.studeez.ui.theme.StudeezTheme +import be.ugent.sel.studeez.R.string as AppText -class CustomTimerEditScreen(private val customTimerInfo: CustomTimerInfo): AbstractTimerEditScreen(customTimerInfo) { +class CustomTimerEditScreen( + private val customTimerInfo: CustomTimerInfo + ): AbstractTimerEditScreen(customTimerInfo) { @Composable override fun ExtraFields() { - // If the user presses the OK button on the timepicker, the time in the button should change - var studyTime by remember { mutableStateOf(customTimerInfo.studyTime) } - - val hms: HoursMinutesSeconds = Time(studyTime).getAsHMS() - TimePickerButton(hms) { _, hour, minute -> - studyTime = hour * 60 * 60 + minute * 60 + TimePickerCard( + text = AppText.studyTime, + initialSeconds = customTimerInfo.studyTime + ) { newTime -> + customTimerInfo.studyTime = newTime } } @@ -25,7 +26,9 @@ class CustomTimerEditScreen(private val customTimerInfo: CustomTimerInfo): Abstr @Preview @Composable -fun TimePickerPreview() { +fun CustomEditScreenPreview() { val customTimerInfo = CustomTimerInfo("custom", "my description", 25) - CustomTimerEditScreen(customTimerInfo).ExtraFields() + StudeezTheme { + CustomTimerEditScreen(customTimerInfo).invoke(onSaveClick = {}) + } } \ No newline at end of file From cfb356cbf183e945e4d8931ddfa7ceb538eac6c9 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 1 May 2023 17:55:48 +0200 Subject: [PATCH 19/25] #30 added two timepicker cards to break timer edit screen --- .../editScreens/BreakTimerEditScreen.kt | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/BreakTimerEditScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/BreakTimerEditScreen.kt index f00e9f6..b6104b6 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/BreakTimerEditScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/BreakTimerEditScreen.kt @@ -1,10 +1,16 @@ package be.ugent.sel.studeez.screens.timer_edit.editScreens import androidx.compose.runtime.* +import androidx.compose.ui.tooling.preview.Preview +import be.ugent.sel.studeez.R import be.ugent.sel.studeez.common.composable.TimePickerButton +import be.ugent.sel.studeez.common.composable.TimePickerCard import be.ugent.sel.studeez.data.local.models.timer_functional.HoursMinutesSeconds import be.ugent.sel.studeez.data.local.models.timer_functional.Time +import be.ugent.sel.studeez.data.local.models.timer_info.CustomTimerInfo +import be.ugent.sel.studeez.data.local.models.timer_info.EndlessTimerInfo import be.ugent.sel.studeez.data.local.models.timer_info.PomodoroTimerInfo +import be.ugent.sel.studeez.ui.theme.StudeezTheme class BreakTimerEditScreen( private val breakTimerInfo: PomodoroTimerInfo @@ -13,17 +19,28 @@ class BreakTimerEditScreen( @Composable override fun ExtraFields() { // If the user presses the OK button on the timepicker, the time in the button should change - var studyTime: Int by remember { mutableStateOf(breakTimerInfo.studyTime) } - var breakTime: Int by remember { mutableStateOf(breakTimerInfo.breakTime) } - val breakHms: HoursMinutesSeconds = Time(breakTime).getAsHMS() - val studyHms: HoursMinutesSeconds = Time(studyTime).getAsHMS() - TimePickerButton(studyHms) { _, hour, minute -> - studyTime = hour * 60 * 60 + minute * 60 + TimePickerCard(R.string.studyTime, breakTimerInfo.studyTime) { newTime -> + breakTimerInfo.studyTime = newTime } - TimePickerButton(breakHms) { _, hour, minute -> - breakTime = hour * 60 * 60 + minute * 60 + TimePickerCard(R.string.breakTime, breakTimerInfo.breakTime) { newTime -> + breakTimerInfo.breakTime = newTime } } +} + +@Preview +@Composable +fun BreakEditScreenPreview() { + val pomodoroTimerInfo = PomodoroTimerInfo( + "Breaky the Breaktimer", + "Breaky is a breakdancer", + 10 * 60, + 60, + 5 + ) + StudeezTheme { + BreakTimerEditScreen(pomodoroTimerInfo).invoke(onSaveClick = {}) + } } \ No newline at end of file From f1d24087b448d159dc0ca37f2cbffde1edcf8575 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 1 May 2023 17:56:32 +0200 Subject: [PATCH 20/25] #30 added preview of endless edit screen --- .../editScreens/EndlessTimerEditScreen.kt | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/EndlessTimerEditScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/EndlessTimerEditScreen.kt index 0f5b30a..0e26209 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/EndlessTimerEditScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/EndlessTimerEditScreen.kt @@ -1,6 +1,23 @@ package be.ugent.sel.studeez.screens.timer_edit.editScreens +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview import be.ugent.sel.studeez.data.local.models.timer_info.EndlessTimerInfo +import be.ugent.sel.studeez.ui.theme.StudeezTheme -class EndlessTimerEditScreen(endlessTimerInfo: EndlessTimerInfo): AbstractTimerEditScreen(endlessTimerInfo) { +class EndlessTimerEditScreen( + endlessTimerInfo: EndlessTimerInfo +): AbstractTimerEditScreen(endlessTimerInfo) { +} + +@Preview +@Composable +fun EndlessEditScreenPreview() { + val endlessTimerInfo = EndlessTimerInfo( + "Forever and beyond", + "My endless timer description", + ) + StudeezTheme { + EndlessTimerEditScreen(endlessTimerInfo).invoke(onSaveClick = {}) + } } \ No newline at end of file From bd48a12d52a537dae5db2375add63c36d2bc3482 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 1 May 2023 17:57:42 +0200 Subject: [PATCH 21/25] #30 minor refactor --- .../screens/timer_edit/TimerEditScreen.kt | 35 +++++-------------- .../editScreens/EditScreenUIState.kt | 4 --- 2 files changed, 9 insertions(+), 30 deletions(-) delete mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/EditScreenUIState.kt diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditScreen.kt index 4540faa..649caf6 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditScreen.kt @@ -1,6 +1,7 @@ package be.ugent.sel.studeez.screens.timer_edit import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.ui.tooling.preview.Preview import be.ugent.sel.studeez.common.composable.SecondaryScreenTemplate import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo @@ -9,7 +10,7 @@ import be.ugent.sel.studeez.ui.theme.StudeezTheme data class TimerEditActions( val getTimerInfo: () -> TimerInfo, - val saveTimer: (TimerInfo) -> Unit + val saveTimer: (TimerInfo, () -> Unit) -> Unit ) fun getTimerEditActions( @@ -28,36 +29,18 @@ fun TimerEditRoute( popUp: () -> Unit, viewModel: TimerEditViewModel, ) { - TimerEditScreen( - timerEditActions = getTimerEditActions(viewModel, open), - popUp = popUp - ) -} -@Composable -fun TimerEditScreen( - timerEditActions: TimerEditActions, - popUp: () -> Unit -) { - SecondaryScreenTemplate(title = "Edit Timer", popUp = { /*TODO*/ }) { + val timerEditActions = getTimerEditActions(viewModel, open) + + SecondaryScreenTemplate(title = "Edit Timer", popUp = popUp) { + val timerEditScreen = timerEditActions.getTimerInfo().accept(GetTimerEditScreen()) - timerEditScreen { timerInfo -> timerEditActions.saveTimer(timerInfo) } + timerEditScreen { timerInfo -> + timerEditActions.saveTimer(timerInfo, popUp) + } } } -//@Preview -//@Composable -//fun TimerEditScreenPreview() { -// val editEntries: List = listOf( -// EditEntry("Name", "MyTimer") {}, -// EditEntry("Description", "Dit is een leuke timer") {}, -// EditEntry("StudyTime", "25") {} -// ) -// val actions = TimerEditActions { editEntries } -// StudeezTheme { TimerEditScreen(timerEditActions = actions) {} } -//} - - diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/EditScreenUIState.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/EditScreenUIState.kt deleted file mode 100644 index 219c06b..0000000 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/editScreens/EditScreenUIState.kt +++ /dev/null @@ -1,4 +0,0 @@ -package be.ugent.sel.studeez.screens.timer_edit.editScreens - -class EditScreenUIState { -} \ No newline at end of file From 853a09866a9614ec68c4520f96447f7ae6c7565d Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 1 May 2023 17:58:13 +0200 Subject: [PATCH 22/25] #30 go back when timer is saved --- .../ugent/sel/studeez/screens/timer_edit/TimerEditViewModel.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditViewModel.kt index 98d060f..3258f24 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_edit/TimerEditViewModel.kt @@ -21,8 +21,9 @@ class TimerEditViewModel @Inject constructor( return timerInfo } - fun saveTimer(timerInfo: TimerInfo) { + fun saveTimer(timerInfo: TimerInfo, goBack: () -> Unit) { timerDAO.updateTimer(timerInfo) + goBack() } } \ No newline at end of file From e0f46d676b69a7b7c4b4239f521c9a317a2bc542 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Wed, 3 May 2023 13:53:35 +0200 Subject: [PATCH 23/25] changed Time increase and decrease functions --- .../timer_functional/FunctionalCustomTimer.kt | 2 +- .../timer_functional/FunctionalEndlessTimer.kt | 2 +- .../timer_functional/FunctionalPomodoroTimer.kt | 2 +- .../models/timer_functional/FunctionalTimer.kt | 2 +- .../data/local/models/timer_functional/Time.kt | 16 +++++----------- 5 files changed, 9 insertions(+), 15 deletions(-) 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 7038c7d..e049054 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 @@ -4,7 +4,7 @@ class FunctionalCustomTimer(studyTime: Int) : FunctionalTimer(studyTime) { override fun tick() { if (!hasEnded()) { - time.minOne() + time++ 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 41be874..51ee182 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 @@ -11,7 +11,7 @@ class FunctionalEndlessTimer : FunctionalTimer(0) { } override fun tick() { - time.plusOne() + time++ totalStudyTime++ } 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 8eeb1c6..6d4f868 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 @@ -22,7 +22,7 @@ class FunctionalPomodoroTimer( } isInBreak = !isInBreak } - time.minOne() + time-- if (!isInBreak) { totalStudyTime++ 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 e95bbfb..1f4231a 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 @@ -4,7 +4,7 @@ import be.ugent.sel.studeez.data.local.models.SessionReport import com.google.firebase.Timestamp abstract class FunctionalTimer(initialValue: Int) { - val time: Time = Time(initialValue) + var time: Time = Time(initialValue) var totalStudyTime: Int = 0 fun getHoursMinutesSeconds(): HoursMinutesSeconds { diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/Time.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/Time.kt index ae0d1ef..7260faa 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/Time.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/Time.kt @@ -1,19 +1,13 @@ package be.ugent.sel.studeez.data.local.models.timer_functional -class Time(initialTime: Int) { +class Time(var time: Int) { + operator fun invoke() = time - var time = initialTime + operator fun inc(): Time = Time(time + 1) - fun minOne() { - time-- - } - - fun plusOne() { - time++ - } + operator fun dec(): Time = Time(time - 1) fun getAsHMS(): HoursMinutesSeconds { return HoursMinutesSeconds(time) } - -} \ No newline at end of file +} From 8e3cca531a1099c7954e6d8f12c45f0f26588c83 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Wed, 3 May 2023 16:19:27 +0200 Subject: [PATCH 24/25] time picker composable shows picked hour and not current hour --- .../composable/TimePickerButtonComposable.kt | 19 +++++--- .../screens/timer_add/TimerAddScreen.kt | 44 +++++++++++++++++++ .../screens/timer_add/TimerAddViewModel.kt | 29 ++++++++++++ .../timer_add/TimerTypeSelectScreen.kt | 43 ++++++++++++++++++ .../timer_add/TimerTypeSelectViewModel.kt | 25 +++++++++++ 5 files changed, 153 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/timer_add/TimerAddScreen.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/timer_add/TimerAddViewModel.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/timer_add/TimerTypeSelectScreen.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/timer_add/TimerTypeSelectViewModel.kt diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/TimePickerButtonComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/TimePickerButtonComposable.kt index eab0d35..e2b5216 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/TimePickerButtonComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/TimePickerButtonComposable.kt @@ -22,6 +22,7 @@ import be.ugent.sel.studeez.R import be.ugent.sel.studeez.common.ext.fieldModifier import be.ugent.sel.studeez.data.local.models.timer_functional.HoursMinutesSeconds import be.ugent.sel.studeez.ui.theme.StudeezTheme +import com.commandiron.wheel_picker_compose.WheelTimePicker import java.util.* @Composable @@ -80,15 +81,19 @@ fun TimePickerButton( } } -private fun pickDuration(context: Context, nextStep: (Int) -> Unit, timeState: MutableState) { +private fun pickDuration(context: Context, onTimeChosen: (Int) -> Unit, timeState: MutableState) { val listener = OnTimeSetListener { _, hour, minute -> - timeState.value = hour * 60 * 60 + minute * 60 - nextStep(timeState.value) + timeState.value = HoursMinutesSeconds(hour, minute, 0).getTotalSeconds() + onTimeChosen(timeState.value) } - val mCalendar = Calendar.getInstance() - val mHour = mCalendar[Calendar.HOUR] - val mMinute = mCalendar[Calendar.MINUTE] - val mTimePickerDialog = TimePickerDialog(context, listener, mHour, mMinute, true) + val hms = HoursMinutesSeconds(timeState.value) + val mTimePickerDialog = TimePickerDialog( + context, + listener, + hms.hours, + hms.minutes, + true + ) mTimePickerDialog.show() } diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_add/TimerAddScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_add/TimerAddScreen.kt new file mode 100644 index 0000000..7cb6a8f --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_add/TimerAddScreen.kt @@ -0,0 +1,44 @@ +package be.ugent.sel.studeez.screens.timer_add + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.tooling.preview.Preview +import be.ugent.sel.studeez.common.composable.SecondaryScreenTemplate +import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo +import be.ugent.sel.studeez.screens.timer_edit.GetTimerEditScreen +import be.ugent.sel.studeez.screens.timer_edit.TimerEditViewModel +import be.ugent.sel.studeez.screens.timer_edit.editScreens.AbstractTimerEditScreen +import be.ugent.sel.studeez.ui.theme.StudeezTheme + +data class TimerEditActions( + val getTimerInfo: () -> TimerInfo, + val saveTimer: (TimerInfo, () -> Unit) -> Unit +) + +fun getTimerEditActions( + viewModel: TimerEditViewModel, + open: (String) -> Unit +): TimerEditActions { + return TimerEditActions( + getTimerInfo = viewModel::getTimerInfo, + saveTimer = viewModel::saveTimer + ) +} + +@Composable +fun TimerEditRoute( + open: (String) -> Unit, + popUp: () -> Unit, + viewModel: TimerEditViewModel, +) { + + val timerEditActions = getTimerEditActions(viewModel, open) + + SecondaryScreenTemplate(title = "Edit Timer", popUp = popUp) { + + val timerEditScreen = timerEditActions.getTimerInfo().accept(GetTimerEditScreen()) + timerEditScreen { timerInfo -> + timerEditActions.saveTimer(timerInfo, popUp) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_add/TimerAddViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_add/TimerAddViewModel.kt new file mode 100644 index 0000000..9ab766c --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_add/TimerAddViewModel.kt @@ -0,0 +1,29 @@ +package be.ugent.sel.studeez.screens.timer_add + +import be.ugent.sel.studeez.data.EditTimerState +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.screens.StudeezViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class TimerAddViewModel @Inject constructor( + private val editTimerState: EditTimerState, + private val timerDAO: TimerDAO, + logService: LogService +) : StudeezViewModel(logService) { + + private val timerInfo: TimerInfo = editTimerState.timerInfo + + fun getTimerInfo(): TimerInfo { + return timerInfo + } + + fun saveTimer(timerInfo: TimerInfo, goBack: () -> Unit) { + timerDAO.updateTimer(timerInfo) + goBack() + } + +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_add/TimerTypeSelectScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_add/TimerTypeSelectScreen.kt new file mode 100644 index 0000000..d14bb86 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_add/TimerTypeSelectScreen.kt @@ -0,0 +1,43 @@ +package be.ugent.sel.studeez.screens.timer_add + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material.Button +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.hilt.navigation.compose.hiltViewModel +import be.ugent.sel.studeez.common.composable.SecondaryScreenTemplate +import be.ugent.sel.studeez.data.local.models.timer_info.* +import be.ugent.sel.studeez.data.local.models.timer_info.TimerType.CUSTOM +import be.ugent.sel.studeez.data.local.models.timer_info.TimerType.BREAK +import be.ugent.sel.studeez.data.local.models.timer_info.TimerType.ENDLESS + +val defaultTimerInfo: Map = mapOf( + CUSTOM to CustomTimerInfo("", "", 0), + BREAK to PomodoroTimerInfo("", "", 0, 0, 0), + ENDLESS to EndlessTimerInfo("", ""), +) + + +@Composable +fun TimerTypeSelectScreen( + open: (String) -> Unit, + popUp: () -> Unit, + viewModel: TimerTypeSelectViewModel = hiltViewModel() +) { + + SecondaryScreenTemplate(title = "Edit Timer", popUp = popUp) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.fillMaxWidth() + ) { + TimerType.values().forEach { timerType -> + Button(onClick = { viewModel.onTimerTypeChosen(defaultTimerInfo[timerType]!!, open) }) { + Text(text = timerType.name) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_add/TimerTypeSelectViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_add/TimerTypeSelectViewModel.kt new file mode 100644 index 0000000..1892833 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_add/TimerTypeSelectViewModel.kt @@ -0,0 +1,25 @@ +package be.ugent.sel.studeez.screens.timer_add + +import be.ugent.sel.studeez.data.EditTimerState +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 TimerTypeSelectViewModel @Inject constructor( + private val editTimerState: EditTimerState, + private val timerDAO: TimerDAO, + logService: LogService +) : StudeezViewModel(logService) { + + + fun onTimerTypeChosen(timerInfo: TimerInfo, open: (String) -> Unit) { + editTimerState.timerInfo = timerInfo + open(StudeezDestinations.TIMER_EDIT_SCREEN) + } +} \ No newline at end of file From ff77227ea87e1891ad10e4e44f9627abce236fac Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Wed, 3 May 2023 19:59:33 +0200 Subject: [PATCH 25/25] removed Wheelpicker from imports --- .../common/composable/TimePickerButtonComposable.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/TimePickerButtonComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/TimePickerButtonComposable.kt index e2b5216..c5e75cc 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/TimePickerButtonComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/TimePickerButtonComposable.kt @@ -10,7 +10,10 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.* -import androidx.compose.runtime.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext @@ -22,8 +25,6 @@ import be.ugent.sel.studeez.R import be.ugent.sel.studeez.common.ext.fieldModifier import be.ugent.sel.studeez.data.local.models.timer_functional.HoursMinutesSeconds import be.ugent.sel.studeez.ui.theme.StudeezTheme -import com.commandiron.wheel_picker_compose.WheelTimePicker -import java.util.* @Composable fun TimePickerCard(