From d6b2c17f29148636aaa2cef4c8e98a4ce13ceb48 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Wed, 10 May 2023 11:31:11 +0200 Subject: [PATCH 01/53] bug fix: singleline was by default false --- .../ugent/sel/studeez/common/composable/TextFieldComposable.kt | 2 +- 1 file changed, 1 insertion(+), 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 aadcee3..e3c54ef 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 @@ -47,7 +47,7 @@ fun LabelledInputField( value: String, onNewValue: (String) -> Unit, @StringRes label: Int, - singleLine: Boolean = false + singleLine: Boolean = true ) { OutlinedTextField( value = value, From 9bc64be1ee6657fab3054ca67e1f9463ac3e4950 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Wed, 10 May 2023 11:32:08 +0200 Subject: [PATCH 02/53] #110 added extra button in parameters of formscreen --- .../screens/timer_form/TimerFormRoute.kt | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/TimerFormRoute.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/TimerFormRoute.kt index 0323dc2..7cef001 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/TimerFormRoute.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/TimerFormRoute.kt @@ -3,6 +3,7 @@ package be.ugent.sel.studeez.screens.timer_form import androidx.annotation.StringRes import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource +import be.ugent.sel.studeez.common.composable.DeleteButton import be.ugent.sel.studeez.common.composable.SecondaryScreenTemplate import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo import be.ugent.sel.studeez.R.string as AppText @@ -12,8 +13,16 @@ fun TimerAddRoute( popUp: () -> Unit, viewModel: TimerFormViewModel ) { - TimerFormScreen(popUp = popUp, getTimerInfo = viewModel::getTimerInfo, AppText.add_timer) { - viewModel.saveTimer(it, goBack = popUp) + + + TimerFormScreen( + popUp = popUp, + getTimerInfo = viewModel::getTimerInfo, + extraButton= { }, + AppText.add_timer + ) { + viewModel.saveTimer(it, goBack = {popUp(); popUp()}) + } } @@ -22,7 +31,20 @@ fun TimerEditRoute( popUp: () -> Unit, viewModel: TimerFormViewModel ) { - TimerFormScreen(popUp = popUp, getTimerInfo = viewModel::getTimerInfo, AppText.edit_timer) { + + @Composable + fun deleteButton() { + DeleteButton(text = AppText.delete_subject) { + viewModel.deleteTimer(viewModel.getTimerInfo(), popUp) + } + } + + TimerFormScreen( + popUp = popUp, + getTimerInfo = viewModel::getTimerInfo, + extraButton= { deleteButton() }, + AppText.edit_timer + ) { viewModel.editTimer(it, goBack = popUp) } } @@ -31,12 +53,13 @@ fun TimerEditRoute( fun TimerFormScreen( popUp: () -> Unit, getTimerInfo: () -> TimerInfo, + extraButton: @Composable () -> Unit, @StringRes label: Int, onConfirmClick: (TimerInfo) -> Unit ) { val timerFormScreen = getTimerInfo().accept(GetTimerFormScreen()) SecondaryScreenTemplate(title = stringResource(id = label), popUp = popUp) { - timerFormScreen(onConfirmClick) + timerFormScreen(onConfirmClick, extraButton) } } From d9294155824a5e31692bdf11a1780f3441198da1 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Wed, 10 May 2023 11:32:36 +0200 Subject: [PATCH 03/53] #110 added delete timer function in viewmodel --- .../sel/studeez/screens/timer_form/TimerFormViewModel.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/TimerFormViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/TimerFormViewModel.kt index 8a0a4d4..c34cd06 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/TimerFormViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/TimerFormViewModel.kt @@ -23,6 +23,11 @@ class TimerFormViewModel @Inject constructor( goBack() } + fun deleteTimer(timerInfo: TimerInfo, goBack: () -> Unit) { + timerDAO.deleteTimer(timerInfo) + goBack() + } + fun saveTimer(timerInfo: TimerInfo, goBack: () -> Unit) { timerDAO.saveTimer(timerInfo) goBack() From 88ebbe4de1c6119beb7658cac036db28036ba294 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Wed, 10 May 2023 11:33:15 +0200 Subject: [PATCH 04/53] #110 extrabutton added (used for delete) --- .../form_screens/AbstractTimerFormScreen.kt | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/AbstractTimerFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/AbstractTimerFormScreen.kt index 5f4a17b..168a2f8 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/AbstractTimerFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/AbstractTimerFormScreen.kt @@ -23,7 +23,10 @@ import be.ugent.sel.studeez.R.string as AppText abstract class AbstractTimerFormScreen(private val timerInfo: TimerInfo) { @Composable - operator fun invoke(onSaveClick: (TimerInfo) -> Unit) { + operator fun invoke( + onSaveClick: (TimerInfo) -> Unit, + extraButton: @Composable () -> Unit + ) { var name by remember { mutableStateOf(timerInfo.name) } var description by remember { mutableStateOf(timerInfo.description) } @@ -34,7 +37,9 @@ abstract class AbstractTimerFormScreen(private val timerInfo: TimerInfo) { Column( verticalArrangement = Arrangement.SpaceBetween, - modifier = Modifier.fillMaxHeight().verticalScroll(rememberScrollState()), + modifier = Modifier + .fillMaxHeight() + .verticalScroll(rememberScrollState()), ) { Column( modifier = Modifier.fillMaxWidth(), @@ -45,7 +50,7 @@ abstract class AbstractTimerFormScreen(private val timerInfo: TimerInfo) { LabelledInputField( value = name, onNewValue = { name = it }, - label = R.string.name + label = R.string.name, ) LabelledInputField( @@ -58,8 +63,12 @@ abstract class AbstractTimerFormScreen(private val timerInfo: TimerInfo) { ExtraFields() } - BasicButton(R.string.save, Modifier.basicButton()) { - onSaveClick(timerInfo) + + Column { + BasicButton(R.string.save, Modifier.basicButton()) { + onSaveClick(timerInfo) + } + extraButton() } } } From 74d29205624303dafd53e44a30a7c4a39c899391 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Wed, 10 May 2023 11:33:34 +0200 Subject: [PATCH 05/53] fix previews for extra button --- .../screens/timer_form/form_screens/BreakTimerFormScreen.kt | 2 +- .../screens/timer_form/form_screens/CustomTimerFormScreen.kt | 2 +- .../screens/timer_form/form_screens/EndlessTimerFormScreen.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/BreakTimerFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/BreakTimerFormScreen.kt index 12d07a4..21e862d 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/BreakTimerFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/BreakTimerFormScreen.kt @@ -50,6 +50,6 @@ fun BreakEditScreenPreview() { 5 ) StudeezTheme { - BreakTimerFormScreen(pomodoroTimerInfo).invoke(onSaveClick = {}) + BreakTimerFormScreen(pomodoroTimerInfo).invoke(onSaveClick = {}, {}) } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/CustomTimerFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/CustomTimerFormScreen.kt index 27c0657..b0000a0 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/CustomTimerFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/CustomTimerFormScreen.kt @@ -29,6 +29,6 @@ class CustomTimerFormScreen( fun CustomEditScreenPreview() { val customTimerInfo = CustomTimerInfo("custom", "my description", 25) StudeezTheme { - CustomTimerFormScreen(customTimerInfo).invoke(onSaveClick = {}) + CustomTimerFormScreen(customTimerInfo).invoke(onSaveClick = {}, extraButton = {}) } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/EndlessTimerFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/EndlessTimerFormScreen.kt index 9009fff..e096946 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/EndlessTimerFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/EndlessTimerFormScreen.kt @@ -18,6 +18,6 @@ fun EndlessEditScreenPreview() { "My endless timer description", ) StudeezTheme { - EndlessTimerFormScreen(endlessTimerInfo).invoke(onSaveClick = {}) + EndlessTimerFormScreen(endlessTimerInfo).invoke(onSaveClick = {}, {}) } } \ No newline at end of file From 79ed70bb175bd8fdbc037a83c7c537922fcd7d60 Mon Sep 17 00:00:00 2001 From: brreynie Date: Wed, 10 May 2023 11:49:18 +0200 Subject: [PATCH 06/53] generate random color --- .../studeez/screens/subjects/form/SubjectFormViewModel.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormViewModel.kt index 533123b..e927a13 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormViewModel.kt @@ -10,6 +10,7 @@ import be.ugent.sel.studeez.navigation.StudeezDestinations import be.ugent.sel.studeez.screens.StudeezViewModel import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject +import kotlin.random.Random abstract class SubjectFormViewModel( protected val subjectDAO: SubjectDAO, @@ -42,9 +43,12 @@ class SubjectCreateFormViewModel @Inject constructor( override val uiState = mutableStateOf(SubjectFormUiState()) fun onCreate(openAndPopUp: (String, String) -> Unit) { + val random = Random + val mask: Long = (0x000000FFL shl random.nextInt(0, 3)).inv() + val randomColor = random.nextLong(0xFF000000L, 0xFFFFFFFFL) and mask val newSubject = Subject( name = name, - argb_color = color, + argb_color = randomColor, ) subjectDAO.saveSubject( newSubject From 00751aaf51f6fd3706fd8cb79790bcd918736607 Mon Sep 17 00:00:00 2001 From: brreynie Date: Wed, 10 May 2023 11:59:28 +0200 Subject: [PATCH 07/53] colorgenerator as extension of Color --- .../java/be/ugent/sel/studeez/common/ext/ColorExt.kt | 10 ++++++++++ .../screens/subjects/form/SubjectFormViewModel.kt | 8 +++----- 2 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/be/ugent/sel/studeez/common/ext/ColorExt.kt diff --git a/app/src/main/java/be/ugent/sel/studeez/common/ext/ColorExt.kt b/app/src/main/java/be/ugent/sel/studeez/common/ext/ColorExt.kt new file mode 100644 index 0000000..87ce226 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/common/ext/ColorExt.kt @@ -0,0 +1,10 @@ +package be.ugent.sel.studeez.common.ext + +import androidx.compose.ui.graphics.Color +import kotlin.random.Random + +fun Color.Companion.generateRandomArgb(): Long { + val random = Random + val mask: Long = (0x000000FFL shl random.nextInt(0, 3)).inv() + return random.nextLong(0xFF000000L, 0xFFFFFFFFL) and mask +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormViewModel.kt index e927a13..eb7ee6f 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormViewModel.kt @@ -2,6 +2,8 @@ package be.ugent.sel.studeez.screens.subjects.form import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf +import androidx.compose.ui.graphics.Color +import be.ugent.sel.studeez.common.ext.generateRandomArgb import be.ugent.sel.studeez.data.SelectedSubject import be.ugent.sel.studeez.data.local.models.task.Subject import be.ugent.sel.studeez.domain.LogService @@ -10,7 +12,6 @@ import be.ugent.sel.studeez.navigation.StudeezDestinations import be.ugent.sel.studeez.screens.StudeezViewModel import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject -import kotlin.random.Random abstract class SubjectFormViewModel( protected val subjectDAO: SubjectDAO, @@ -43,12 +44,9 @@ class SubjectCreateFormViewModel @Inject constructor( override val uiState = mutableStateOf(SubjectFormUiState()) fun onCreate(openAndPopUp: (String, String) -> Unit) { - val random = Random - val mask: Long = (0x000000FFL shl random.nextInt(0, 3)).inv() - val randomColor = random.nextLong(0xFF000000L, 0xFFFFFFFFL) and mask val newSubject = Subject( name = name, - argb_color = randomColor, + argb_color = Color.generateRandomArgb(), ) subjectDAO.saveSubject( newSubject From d6496cb8ad33c611df326480f15ed1f31094a157 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Wed, 10 May 2023 12:44:51 +0200 Subject: [PATCH 08/53] changed labeled error field to take some states --- .../common/composable/TextFieldComposable.kt | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) 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 e3c54ef..9922985 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 @@ -3,7 +3,6 @@ package be.ugent.sel.studeez.common.composable import androidx.annotation.StringRes import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.* import androidx.compose.material.icons.Icons @@ -22,7 +21,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import be.ugent.sel.studeez.common.ext.fieldModifier import be.ugent.sel.studeez.resources -import kotlin.math.sin import be.ugent.sel.studeez.R.drawable as AppIcon import be.ugent.sel.studeez.R.string as AppText @@ -119,7 +117,9 @@ fun LabeledErrorTextField( initialValue: String, @StringRes label: Int, singleLine: Boolean = false, - errorText: Int, + isValid: MutableState, + isFirst: MutableState = remember { mutableStateOf(false) }, + @StringRes errorText: Int, keyboardType: KeyboardType, predicate: (String) -> Boolean, onNewCorrectValue: (String) -> Unit @@ -128,31 +128,28 @@ fun LabeledErrorTextField( mutableStateOf(initialValue) } - var isValid by remember { - mutableStateOf(predicate(value)) - } - Column { OutlinedTextField( modifier = modifier.fieldModifier(), value = value, onValueChange = { newText -> + isFirst.value = false value = newText - isValid = predicate(value) - if (isValid) { + isValid.value = predicate(value) + if (isValid.value) { onNewCorrectValue(newText) } }, singleLine = singleLine, label = { Text(text = stringResource(id = label)) }, - isError = !isValid, + isError = !isValid.value && !isFirst.value, keyboardOptions = KeyboardOptions( keyboardType = keyboardType, imeAction = ImeAction.Done ) ) - if (!isValid) { + if (!isValid.value && !isFirst.value) { Text( modifier = Modifier.padding(start = 16.dp), text = stringResource(id = errorText), From b4166386a56e4e4c736745d800c23032f2944f04 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Wed, 10 May 2023 12:46:30 +0200 Subject: [PATCH 09/53] added error input field for name and discription --- .../form_screens/AbstractTimerFormScreen.kt | 47 ++++++++++++++----- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/AbstractTimerFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/AbstractTimerFormScreen.kt index 168a2f8..e936898 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/AbstractTimerFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/AbstractTimerFormScreen.kt @@ -13,8 +13,10 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.text.input.KeyboardType import be.ugent.sel.studeez.R import be.ugent.sel.studeez.common.composable.BasicButton +import be.ugent.sel.studeez.common.composable.LabeledErrorTextField import be.ugent.sel.studeez.common.composable.LabelledInputField import be.ugent.sel.studeez.common.ext.basicButton import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo @@ -28,8 +30,14 @@ abstract class AbstractTimerFormScreen(private val timerInfo: TimerInfo) { extraButton: @Composable () -> Unit ) { + var name by remember { mutableStateOf(timerInfo.name) } + val isNameValid = remember { mutableStateOf(false) } + val hasEditedName = remember { mutableStateOf(true) } + var description by remember { mutableStateOf(timerInfo.description) } + val isDescriptionValid = remember { mutableStateOf(false) } + val hasEditedDescription = remember { mutableStateOf(true) } // This shall rerun whenever name and description change timerInfo.name = name @@ -47,18 +55,30 @@ abstract class AbstractTimerFormScreen(private val timerInfo: TimerInfo) { ) { // Fields that every timer shares (ommited id) - LabelledInputField( - value = name, - onNewValue = { name = it }, + LabeledErrorTextField( + initialValue = timerInfo.name, label = R.string.name, - ) + errorText = AppText.name_error, + isValid = isNameValid, + isFirst = hasEditedName, + keyboardType = KeyboardType.Text, + predicate = { it.isNotBlank() } + ) { correctName -> + name = correctName + } - LabelledInputField( - value = description, - onNewValue = { description = it }, - label = AppText.description, - singleLine = false - ) + LabeledErrorTextField( + initialValue = timerInfo.description, + label = R.string.description, + errorText = AppText.description_error, + isValid = isDescriptionValid, + isFirst = hasEditedDescription, + singleLine= false, + keyboardType = KeyboardType.Text, + predicate = { it.isNotBlank() } + ) { correctName -> + description = correctName + } ExtraFields() @@ -66,7 +86,12 @@ abstract class AbstractTimerFormScreen(private val timerInfo: TimerInfo) { Column { BasicButton(R.string.save, Modifier.basicButton()) { - onSaveClick(timerInfo) + if (isNameValid.value && isDescriptionValid.value) { + onSaveClick(timerInfo) + } else { + hasEditedName.value = false + hasEditedDescription.value = false + } } extraButton() } From d9f4170fbd24c173ee217d90bcbe858dd0c31c98 Mon Sep 17 00:00:00 2001 From: Rune Dyselinck Date: Wed, 10 May 2023 15:10:01 +0200 Subject: [PATCH 10/53] emojis in sessionrecap --- .idea/misc.xml | 1 - .../FloatingActionButtonComposable.kt | 1 - .../common/composable/ImageComposable.kt | 39 +++++++++++ .../session_recap/SessionRecapScreen.kt | 67 ++++++++++++++++++- app/src/main/res/drawable/mood_1.xml | 5 ++ app/src/main/res/drawable/mood_2.xml | 5 ++ app/src/main/res/values/strings.xml | 7 ++ 7 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/be/ugent/sel/studeez/common/composable/ImageComposable.kt create mode 100644 app/src/main/res/drawable/mood_1.xml create mode 100644 app/src/main/res/drawable/mood_2.xml diff --git a/.idea/misc.xml b/.idea/misc.xml index 0ad17cb..8978d23 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/FloatingActionButtonComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/FloatingActionButtonComposable.kt index bc40ead..ea2b52d 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/FloatingActionButtonComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/FloatingActionButtonComposable.kt @@ -2,7 +2,6 @@ package be.ugent.sel.studeez.common.composable import androidx.compose.animation.core.animateFloat import androidx.compose.animation.core.updateTransition -import androidx.compose.foundation.border import androidx.compose.foundation.layout.* import androidx.compose.material.FloatingActionButton import androidx.compose.material.Icon diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/ImageComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/ImageComposable.kt new file mode 100644 index 0000000..39e7272 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/ImageComposable.kt @@ -0,0 +1,39 @@ +package be.ugent.sel.studeez.common.composable + +import androidx.compose.foundation.Image +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.unit.dp + +@Composable +fun ImageBackgroundButton( + paint: Painter, + str: String, + background2: Color, + setBackground1: (Color) -> Unit, + setBackground2: (Color) -> Unit +) { + Image( + painter = paint, + str, + modifier = Modifier + .clickable { + if (background2 == Color.Transparent) { + setBackground1(Color.LightGray) + setBackground2(Color.Transparent) + } else { + setBackground2(Color.Transparent) + } + } + .border( + width = 2.dp, + color = background2, + shape = RoundedCornerShape(16.dp) + ) + ) +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapScreen.kt index 2d06e0b..1e02ad9 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapScreen.kt @@ -1,13 +1,30 @@ package be.ugent.sel.studeez.screens.session_recap +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding import androidx.compose.material.ButtonDefaults import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +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.sp +import androidx.hilt.navigation.compose.hiltViewModel import be.ugent.sel.studeez.R import be.ugent.sel.studeez.common.composable.BasicButton +import be.ugent.sel.studeez.common.composable.ImageBackgroundButton import be.ugent.sel.studeez.common.ext.basicButton import be.ugent.sel.studeez.data.local.models.SessionReport import be.ugent.sel.studeez.data.local.models.timer_functional.HoursMinutesSeconds @@ -47,10 +64,49 @@ fun SessionRecapScreen(modifier: Modifier, sessionRecapActions: SessionRecapActi val sessionReport: SessionReport = sessionRecapActions.getSessionReport() val studyTime: Int = sessionReport.studyTime val hms: HoursMinutesSeconds = Time(studyTime).getAsHMS() + val (background1, setBackground1) = remember { mutableStateOf(Color.Transparent) } + val (background2, setBackground2) = remember { mutableStateOf(Color.Transparent) } Column( modifier = modifier + .fillMaxWidth() + .fillMaxHeight() + .padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center ) { - Text(text = "You studied: $hms") + Text( + text = stringResource(R.string.congrats) + hms, + modifier = Modifier.fillMaxWidth(), + textAlign = TextAlign.Center, + fontWeight = FontWeight.Light, + fontSize = 30.sp + ) + + Text( + text = stringResource(R.string.how_did_it_go), + modifier = Modifier.fillMaxWidth(), + textAlign = TextAlign.Center, + fontWeight = FontWeight.Light, + fontSize = 30.sp + ) + + Row { + ImageBackgroundButton( + paint = painterResource(id = R.drawable.mood_1), + str = stringResource(id = R.string.good), + background2 = background2, + setBackground1 = setBackground2, + setBackground2 = setBackground1 + ) + + ImageBackgroundButton( + paint = painterResource(id = R.drawable.mood_2), + str = stringResource(id = R.string.bad), + background2 = background1, + setBackground1 = setBackground1, + setBackground2 = setBackground2 + ) + } BasicButton( R.string.save, Modifier.basicButton() @@ -65,3 +121,12 @@ fun SessionRecapScreen(modifier: Modifier, sessionRecapActions: SessionRecapActi } } } + +@Preview +@Composable +fun SessionRecapScreenPreview() { + SessionRecapScreen( + modifier = Modifier, + sessionRecapActions = SessionRecapActions(hiltViewModel(), {}, {}) + ) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/mood_1.xml b/app/src/main/res/drawable/mood_1.xml new file mode 100644 index 0000000..bf009f2 --- /dev/null +++ b/app/src/main/res/drawable/mood_1.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/mood_2.xml b/app/src/main/res/drawable/mood_2.xml new file mode 100644 index 0000000..0fd3daa --- /dev/null +++ b/app/src/main/res/drawable/mood_2.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0ec0e9d..9ebb196 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -138,4 +138,11 @@ Break Time Number of Repeats + + "Congratulations! You studied: " + How did it go? + Good + Bad + + From 6bef378fc043d8566fd56301a8477bdbc34d040a Mon Sep 17 00:00:00 2001 From: Rune Dyselinck Date: Wed, 10 May 2023 15:32:39 +0200 Subject: [PATCH 11/53] correct aligment --- .../session_recap/SessionRecapScreen.kt | 83 +++++++++++-------- 1 file changed, 48 insertions(+), 35 deletions(-) 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 1e02ad9..06a15e1 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 @@ -72,52 +72,65 @@ fun SessionRecapScreen(modifier: Modifier, sessionRecapActions: SessionRecapActi .fillMaxHeight() .padding(16.dp), horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center + verticalArrangement = Arrangement.SpaceBetween ) { Text( text = stringResource(R.string.congrats) + hms, - modifier = Modifier.fillMaxWidth(), + modifier = Modifier + .fillMaxWidth(), textAlign = TextAlign.Center, fontWeight = FontWeight.Light, - fontSize = 30.sp + fontSize = 30.sp, + ) - Text( - text = stringResource(R.string.how_did_it_go), - modifier = Modifier.fillMaxWidth(), - textAlign = TextAlign.Center, - fontWeight = FontWeight.Light, - fontSize = 30.sp - ) - - Row { - ImageBackgroundButton( - paint = painterResource(id = R.drawable.mood_1), - str = stringResource(id = R.string.good), - background2 = background2, - setBackground1 = setBackground2, - setBackground2 = setBackground1 + Column( + modifier = Modifier.fillMaxWidth() + ) { + Text( + text = stringResource(R.string.how_did_it_go), + modifier = Modifier.fillMaxWidth(), + textAlign = TextAlign.Center, + fontWeight = FontWeight.Light, + fontSize = 30.sp ) - ImageBackgroundButton( - paint = painterResource(id = R.drawable.mood_2), - str = stringResource(id = R.string.bad), - background2 = background1, - setBackground1 = setBackground1, - setBackground2 = setBackground2 - ) + Row( + horizontalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxWidth() + .align(Alignment.CenterHorizontally) + ) { + ImageBackgroundButton( + paint = painterResource(id = R.drawable.mood_1), + str = stringResource(id = R.string.good), + background2 = background2, + setBackground1 = setBackground2, + setBackground2 = setBackground1 + ) + + ImageBackgroundButton( + paint = painterResource(id = R.drawable.mood_2), + str = stringResource(id = R.string.bad), + background2 = background1, + setBackground1 = setBackground1, + setBackground2 = setBackground2 + ) + } } - BasicButton( - R.string.save, Modifier.basicButton() - ) { - sessionRecapActions.saveSession() - } - BasicButton( - R.string.discard, Modifier.basicButton(), - colors = ButtonDefaults.buttonColors(backgroundColor = Color.Red) - ) { - sessionRecapActions.discardSession() + Column { + BasicButton( + R.string.save, Modifier.basicButton() + ) { + sessionRecapActions.saveSession() + } + BasicButton( + R.string.discard, Modifier.basicButton(), + colors = ButtonDefaults.buttonColors(backgroundColor = Color.Red) + ) { + sessionRecapActions.discardSession() + } } } } From 45efd5cb3f82d7abeb68edbaef14b28501c3737a Mon Sep 17 00:00:00 2001 From: Rune Dyselinck Date: Wed, 10 May 2023 15:37:34 +0200 Subject: [PATCH 12/53] small fix --- .../sel/studeez/screens/session_recap/SessionRecapScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapScreen.kt index 06a15e1..72082c8 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 @@ -142,4 +142,4 @@ fun SessionRecapScreenPreview() { modifier = Modifier, sessionRecapActions = SessionRecapActions(hiltViewModel(), {}, {}) ) -} \ No newline at end of file +} From de25ed85b53746ae704d87c1a3729afacbe1554a Mon Sep 17 00:00:00 2001 From: brreynie Date: Wed, 10 May 2023 15:50:54 +0200 Subject: [PATCH 13/53] #99 fix subjectentry to use flows for computed values --- .../common/composable/tasks/SubjectEntry.kt | 16 +++++++--- .../studeez/data/local/models/task/Subject.kt | 4 --- .../be/ugent/sel/studeez/domain/SubjectDAO.kt | 4 +-- .../implementation/FireBaseSubjectDAO.kt | 31 +++++-------------- .../studeez/screens/subjects/SubjectScreen.kt | 13 ++++++-- .../screens/subjects/SubjectViewModel.kt | 8 +++++ 6 files changed, 40 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/tasks/SubjectEntry.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/tasks/SubjectEntry.kt index 5db2af3..c6631ce 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/tasks/SubjectEntry.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/tasks/SubjectEntry.kt @@ -31,9 +31,13 @@ import be.ugent.sel.studeez.R.string as AppText fun SubjectEntry( subject: Subject, onViewSubject: () -> Unit, + getTaskCount: () -> Flow, + getCompletedTaskCount: () -> Flow, getStudyTime: () -> Flow, ) { val studytime by getStudyTime().collectAsState(initial = 0) + val taskCount by getTaskCount().collectAsState(initial = 0) + val completedTaskCount by getCompletedTaskCount().collectAsState(initial = 0) Card( modifier = Modifier .fillMaxWidth() @@ -80,7 +84,7 @@ fun SubjectEntry( imageVector = Icons.Default.List, contentDescription = stringResource(id = AppText.tasks) ) - Text(text = "${subject.taskCompletedCount}/${subject.taskCount}") + Text(text = "${completedTaskCount}/${taskCount}") } } } @@ -104,11 +108,11 @@ fun SubjectEntryPreview() { subject = Subject( name = "Test Subject", argb_color = 0xFFFFD200, - taskCount = 5, - taskCompletedCount = 2, ), onViewSubject = {}, - getStudyTime = { flowOf() } + getTaskCount = { flowOf() }, + getCompletedTaskCount = { flowOf() }, + getStudyTime = { flowOf() }, ) } @@ -121,6 +125,8 @@ fun OverflowSubjectEntryPreview() { argb_color = 0xFFFFD200, ), onViewSubject = {}, - getStudyTime = { flowOf() } + getTaskCount = { flowOf() }, + getCompletedTaskCount = { flowOf() }, + getStudyTime = { flowOf() }, ) } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/task/Subject.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/task/Subject.kt index 74ebe9f..261f3e0 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/task/Subject.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/task/Subject.kt @@ -8,10 +8,6 @@ data class Subject( val name: String = "", val argb_color: Long = 0, var archived: Boolean = false, - @get:Exclude @set:Exclude - var taskCount: Int = 0, - @get:Exclude @set:Exclude - var taskCompletedCount: Int = 0, ) object SubjectDocument { diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/SubjectDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/SubjectDAO.kt index bad8106..c9f6a8a 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/SubjectDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/SubjectDAO.kt @@ -13,8 +13,8 @@ interface SubjectDAO { fun updateSubject(newSubject: Subject) - suspend fun getTaskCount(subject: Subject): Int - suspend fun getCompletedTaskCount(subject: Subject): Int + fun getTaskCount(subject: Subject): Flow + fun getCompletedTaskCount(subject: Subject): Flow fun getStudyTime(subject: Subject): Flow suspend fun getSubject(subjectId: String): Subject? diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FireBaseSubjectDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FireBaseSubjectDAO.kt index b023986..e8931ed 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FireBaseSubjectDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FireBaseSubjectDAO.kt @@ -2,10 +2,10 @@ package be.ugent.sel.studeez.domain.implementation import be.ugent.sel.studeez.data.local.models.task.Subject import be.ugent.sel.studeez.data.local.models.task.SubjectDocument +import be.ugent.sel.studeez.data.local.models.task.Task import be.ugent.sel.studeez.domain.AccountDAO import be.ugent.sel.studeez.domain.SubjectDAO import be.ugent.sel.studeez.domain.TaskDAO -import com.google.firebase.firestore.AggregateSource import com.google.firebase.firestore.CollectionReference import com.google.firebase.firestore.FirebaseFirestore import com.google.firebase.firestore.Query @@ -15,6 +15,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.tasks.await import javax.inject.Inject +import kotlin.collections.count class FireBaseSubjectDAO @Inject constructor( private val firestore: FirebaseFirestore, @@ -26,13 +27,6 @@ class FireBaseSubjectDAO @Inject constructor( .subjectNotArchived() .snapshots() .map { it.toObjects(Subject::class.java) } - .map { subjects -> - subjects.map { subject -> - subject.taskCount = getTaskCount(subject) - subject.taskCompletedCount = getCompletedTaskCount(subject) - subject - } - } } override suspend fun getSubject(subjectId: String): Subject? { @@ -51,23 +45,14 @@ class FireBaseSubjectDAO @Inject constructor( currentUserSubjectsCollection().document(newSubject.id).set(newSubject) } - override suspend fun getTaskCount(subject: Subject): Int { - return subjectTasksCollection(subject) - .taskNotArchived() - .count() - .get(AggregateSource.SERVER) - .await() - .count.toInt() + override fun getTaskCount(subject: Subject): Flow { + return taskDAO.getTasks(subject) + .map(List::count) } - override suspend fun getCompletedTaskCount(subject: Subject): Int { - return subjectTasksCollection(subject) - .taskNotArchived() - .taskNotCompleted() - .count() - .get(AggregateSource.SERVER) - .await() - .count.toInt() + override fun getCompletedTaskCount(subject: Subject): Flow { + return taskDAO.getTasks(subject) + .map { tasks -> tasks.count { it.completed && !it.archived } } } override fun getStudyTime(subject: Subject): Flow { diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/SubjectScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/SubjectScreen.kt index ab2cff4..852c0e5 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/SubjectScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/SubjectScreen.kt @@ -36,6 +36,8 @@ fun SubjectRoute( navigationBarActions = navigationBarActions, onAddSubject = { viewModel.onAddSubject(open) }, onViewSubject = { viewModel.onViewSubject(it, open) }, + getTaskCount = viewModel::getTaskCount, + getCompletedTaskCount = viewModel::getCompletedTaskCount, getStudyTime = viewModel::getStudyTime, uiState, ) @@ -47,6 +49,8 @@ fun SubjectScreen( navigationBarActions: NavigationBarActions, onAddSubject: () -> Unit, onViewSubject: (Subject) -> Unit, + getTaskCount: (Subject) -> Flow, + getCompletedTaskCount: (Subject) -> Flow, getStudyTime: (Subject) -> Flow, uiState: SubjectUiState, ) { @@ -76,6 +80,8 @@ fun SubjectScreen( SubjectEntry( subject = it, onViewSubject = { onViewSubject(it) }, + getTaskCount = { getTaskCount(it) }, + getCompletedTaskCount = { getCompletedTaskCount(it) }, getStudyTime = { getStudyTime(it) }, ) } @@ -94,13 +100,14 @@ fun SubjectScreenPreview() { navigationBarActions = NavigationBarActions({ false }, {}, {}, {}, {}, {}, {}, {}), onAddSubject = {}, onViewSubject = {}, + getTaskCount = { flowOf() }, + getCompletedTaskCount = { flowOf() }, getStudyTime = { flowOf() }, uiState = SubjectUiState.Succes( listOf( Subject( name = "Test Subject", argb_color = 0xFFFFD200, - taskCount = 5, taskCompletedCount = 2, ) ) ) @@ -115,7 +122,9 @@ fun SubjectScreenLoadingPreview() { navigationBarActions = NavigationBarActions({ false }, {}, {}, {}, {}, {}, {}, {}), onAddSubject = {}, onViewSubject = {}, + getTaskCount = { flowOf() }, + getCompletedTaskCount = { flowOf() }, getStudyTime = { flowOf() }, - uiState = SubjectUiState.Loading + uiState = SubjectUiState.Loading, ) } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/SubjectViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/SubjectViewModel.kt index c158529..19ba396 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/SubjectViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/SubjectViewModel.kt @@ -30,6 +30,14 @@ class SubjectViewModel @Inject constructor( open(StudeezDestinations.ADD_SUBJECT_FORM) } + fun getTaskCount(subject: Subject): Flow { + return subjectDAO.getTaskCount(subject) + } + + fun getCompletedTaskCount(subject: Subject): Flow { + return subjectDAO.getCompletedTaskCount(subject) + } + fun getStudyTime(subject: Subject): Flow { return subjectDAO.getStudyTime(subject) } From a7752e5706128163c8210dec9e906f358c2ad1ad Mon Sep 17 00:00:00 2001 From: brreynie Date: Wed, 10 May 2023 16:43:14 +0200 Subject: [PATCH 14/53] #99 fix update subject name after edit --- .../screens/subjects/form/SubjectFormViewModel.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormViewModel.kt index 533123b..7c2f601 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormViewModel.kt @@ -75,11 +75,13 @@ class SubjectEditFormViewModel @Inject constructor( } fun onEdit(openAndPopUp: (String, String) -> Unit) { - val newSubject = selectedSubject().copy( - name = name, - argb_color = color, + selectedSubject.set( + selectedSubject().copy( + name = name, + argb_color = color, + ) ) - subjectDAO.updateSubject(newSubject) + subjectDAO.updateSubject(selectedSubject()) openAndPopUp(StudeezDestinations.TASKS_SCREEN, StudeezDestinations.EDIT_SUBJECT_FORM) } } \ No newline at end of file From 61de50ea557bcf2f736b718a326210f7db7fe806 Mon Sep 17 00:00:00 2001 From: brreynie Date: Wed, 10 May 2023 16:52:41 +0200 Subject: [PATCH 15/53] reformat and optimize imports --- .../screens/session_recap/SessionRecapScreen.kt | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) 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 72082c8..f3a5739 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapScreen.kt @@ -1,11 +1,6 @@ package be.ugent.sel.studeez.screens.session_recap -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.* import androidx.compose.material.ButtonDefaults import androidx.compose.material.Text import androidx.compose.runtime.Composable @@ -42,8 +37,8 @@ fun getSessionRecapActions( ): SessionRecapActions { return SessionRecapActions( viewModel::getSessionReport, - {viewModel.saveSession(openAndPopUp)}, - {viewModel.discardSession(openAndPopUp)} + { viewModel.saveSession(openAndPopUp) }, + { viewModel.discardSession(openAndPopUp) } ) } @@ -82,7 +77,7 @@ fun SessionRecapScreen(modifier: Modifier, sessionRecapActions: SessionRecapActi fontWeight = FontWeight.Light, fontSize = 30.sp, - ) + ) Column( modifier = Modifier.fillMaxWidth() From 93aae20f85bc9390082e95e84b019dcaf5880693 Mon Sep 17 00:00:00 2001 From: brreynie Date: Sat, 13 May 2023 13:22:12 +0200 Subject: [PATCH 16/53] #109 archiving subject archives all tasks of subject --- .../java/be/ugent/sel/studeez/domain/SubjectDAO.kt | 2 ++ .../domain/implementation/FireBaseSubjectDAO.kt | 14 ++++++++++++++ .../screens/subjects/form/SubjectFormScreen.kt | 7 ++++++- .../screens/subjects/form/SubjectFormViewModel.kt | 6 ++++-- 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/SubjectDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/SubjectDAO.kt index c9f6a8a..d887ef5 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/SubjectDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/SubjectDAO.kt @@ -13,6 +13,8 @@ interface SubjectDAO { fun updateSubject(newSubject: Subject) + suspend fun archiveSubject(subject: Subject) + fun getTaskCount(subject: Subject): Flow fun getCompletedTaskCount(subject: Subject): Flow fun getStudyTime(subject: Subject): Flow diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FireBaseSubjectDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FireBaseSubjectDAO.kt index e8931ed..66815dc 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FireBaseSubjectDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FireBaseSubjectDAO.kt @@ -1,8 +1,10 @@ package be.ugent.sel.studeez.domain.implementation +import android.util.Log import be.ugent.sel.studeez.data.local.models.task.Subject import be.ugent.sel.studeez.data.local.models.task.SubjectDocument import be.ugent.sel.studeez.data.local.models.task.Task +import be.ugent.sel.studeez.data.local.models.task.TaskDocument import be.ugent.sel.studeez.domain.AccountDAO import be.ugent.sel.studeez.domain.SubjectDAO import be.ugent.sel.studeez.domain.TaskDAO @@ -45,6 +47,18 @@ class FireBaseSubjectDAO @Inject constructor( currentUserSubjectsCollection().document(newSubject.id).set(newSubject) } + override suspend fun archiveSubject(subject: Subject) { + currentUserSubjectsCollection().document(subject.id).update(SubjectDocument.archived, true) + currentUserSubjectsCollection().document(subject.id) + .collection(FireBaseCollections.TASK_COLLECTION) + .taskNotArchived() + .get().await() + .documents + .forEach { + it.reference.update(TaskDocument.archived, true) + } + } + override fun getTaskCount(subject: Subject): Flow { return taskDAO.getTasks(subject) .map(List::count) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormScreen.kt index 19e6816..bd81c8c 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormScreen.kt @@ -6,6 +6,7 @@ import androidx.compose.material.OutlinedTextField import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource @@ -16,6 +17,7 @@ import be.ugent.sel.studeez.common.composable.SecondaryScreenTemplate import be.ugent.sel.studeez.common.ext.basicButton import be.ugent.sel.studeez.common.ext.fieldModifier import be.ugent.sel.studeez.resources +import kotlinx.coroutines.launch import be.ugent.sel.studeez.R.string as AppText @Composable @@ -42,6 +44,7 @@ fun SubjectEditRoute( viewModel: SubjectEditFormViewModel, ) { val uiState by viewModel.uiState + val coroutineScope = rememberCoroutineScope() SubjectForm( title = AppText.edit_subject, goBack = goBack, @@ -51,7 +54,9 @@ fun SubjectEditRoute( onColorChange = {}, ) { DeleteButton(text = AppText.delete_subject) { - viewModel.onDelete(openAndPopUp) + coroutineScope.launch { + viewModel.onDelete(openAndPopUp) + } } } } diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormViewModel.kt index 7c2f601..84162d0 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormViewModel.kt @@ -6,6 +6,7 @@ import be.ugent.sel.studeez.data.SelectedSubject import be.ugent.sel.studeez.data.local.models.task.Subject import be.ugent.sel.studeez.domain.LogService import be.ugent.sel.studeez.domain.SubjectDAO +import be.ugent.sel.studeez.domain.TaskDAO import be.ugent.sel.studeez.navigation.StudeezDestinations import be.ugent.sel.studeez.screens.StudeezViewModel import dagger.hilt.android.lifecycle.HiltViewModel @@ -59,6 +60,7 @@ class SubjectCreateFormViewModel @Inject constructor( @HiltViewModel class SubjectEditFormViewModel @Inject constructor( subjectDAO: SubjectDAO, + private val taskDAO: TaskDAO, selectedSubject: SelectedSubject, logService: LogService, ) : SubjectFormViewModel(subjectDAO, selectedSubject, logService) { @@ -69,8 +71,8 @@ class SubjectEditFormViewModel @Inject constructor( ) ) - fun onDelete(openAndPopUp: (String, String) -> Unit) { - subjectDAO.updateSubject(selectedSubject().copy(archived = true)) + suspend fun onDelete(openAndPopUp: (String, String) -> Unit) { + subjectDAO.archiveSubject(selectedSubject()) openAndPopUp(StudeezDestinations.SUBJECT_SCREEN, StudeezDestinations.EDIT_SUBJECT_FORM) } From a328d2194f2fd62d4da27d9933050fd6a8ba6e51 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Sat, 13 May 2023 15:36:04 +0200 Subject: [PATCH 17/53] isValid is optional and by default true --- .../ugent/sel/studeez/common/composable/TextFieldComposable.kt | 2 +- .../screens/timer_form/form_screens/BreakTimerFormScreen.kt | 1 + 2 files changed, 2 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 9922985..47bdec5 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 @@ -117,7 +117,7 @@ fun LabeledErrorTextField( initialValue: String, @StringRes label: Int, singleLine: Boolean = false, - isValid: MutableState, + isValid: MutableState = remember { mutableStateOf(true) }, isFirst: MutableState = remember { mutableStateOf(false) }, @StringRes errorText: Int, keyboardType: KeyboardType, diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/BreakTimerFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/BreakTimerFormScreen.kt index 21e862d..333fc24 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/BreakTimerFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/BreakTimerFormScreen.kt @@ -30,6 +30,7 @@ class BreakTimerFormScreen( initialValue = breakTimerInfo.repeats.toString(), label = R.string.repeats, errorText = AppText.repeats_error, + isValid = mutableStateOf(false), keyboardType = KeyboardType.Decimal, predicate = { it.matches(Regex("[1-9]+\\d*")) } ) { correctlyTypedInt -> From d666733abea05e26000b1145ae1039ea6b3878ae Mon Sep 17 00:00:00 2001 From: brreynie Date: Sat, 13 May 2023 15:51:50 +0200 Subject: [PATCH 18/53] #109 fix pomodorotimer doing too many cycles --- .../local/models/timer_functional/FunctionalPomodoroTimer.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 765fbcd..f5237d6 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 @@ -6,14 +6,13 @@ class FunctionalPomodoroTimer( val repeats: Int ) : FunctionalTimer(studyTime) { - var breaksRemaining = repeats + var breaksRemaining = repeats - 1 var isInBreak = false override fun tick() { if (hasEnded()) { return } - if (hasCurrentCountdownEnded()) { if (isInBreak) { breaksRemaining-- From ad0780416db5b6a1464342cf8a1343ab2042a6b1 Mon Sep 17 00:00:00 2001 From: brreynie Date: Sat, 13 May 2023 15:54:59 +0200 Subject: [PATCH 19/53] fix dots not showing up correctly --- .../screens/session/sessionScreens/BreakSessionScreen.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakSessionScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakSessionScreen.kt index 9c59b46..f49a60b 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakSessionScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakSessionScreen.kt @@ -37,11 +37,11 @@ class BreakSessionScreen( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Center, ) { - repeat(funPomoDoroTimer.repeats - funPomoDoroTimer.breaksRemaining) { + repeat(funPomoDoroTimer.repeats - funPomoDoroTimer.breaksRemaining - 1) { Dot(color = Color.DarkGray) } if (!funPomoDoroTimer.isInBreak) Dot(Color.Green) else Dot(Color.DarkGray) - repeat(funPomoDoroTimer.breaksRemaining - 1) { + repeat(funPomoDoroTimer.breaksRemaining) { Dot(color = Color.Gray) } } From 5f0bdc948fc35e9b916f97dc5f3aaf367a7c2a4d Mon Sep 17 00:00:00 2001 From: brreynie Date: Sat, 13 May 2023 15:57:20 +0200 Subject: [PATCH 20/53] all dots green when ended --- .../sessionScreens/BreakSessionScreen.kt | 37 ++++++++++--------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakSessionScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakSessionScreen.kt index f49a60b..f328c5f 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakSessionScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakSessionScreen.kt @@ -4,18 +4,13 @@ import android.media.MediaPlayer import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.font.FontWeight -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.sp -import be.ugent.sel.studeez.R import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalPomodoroTimer import be.ugent.sel.studeez.resources import be.ugent.sel.studeez.R.string as AppText @@ -23,7 +18,7 @@ import be.ugent.sel.studeez.R.string as AppText class BreakSessionScreen( private val funPomoDoroTimer: FunctionalPomodoroTimer, private var mediaplayer: MediaPlayer? -): AbstractSessionScreen() { +) : AbstractSessionScreen() { @Composable override fun MidSection() { @@ -37,23 +32,31 @@ class BreakSessionScreen( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Center, ) { - repeat(funPomoDoroTimer.repeats - funPomoDoroTimer.breaksRemaining - 1) { - Dot(color = Color.DarkGray) - } - if (!funPomoDoroTimer.isInBreak) Dot(Color.Green) else Dot(Color.DarkGray) - repeat(funPomoDoroTimer.breaksRemaining) { - Dot(color = Color.Gray) + if (funPomoDoroTimer.hasEnded()) { + repeat(funPomoDoroTimer.repeats) { + Dot(Color.Green) + } + } else { + repeat(funPomoDoroTimer.repeats - funPomoDoroTimer.breaksRemaining - 1) { + Dot(color = Color.DarkGray) + } + if (!funPomoDoroTimer.isInBreak) Dot(Color.Green) else Dot(Color.DarkGray) + repeat(funPomoDoroTimer.breaksRemaining) { + Dot(color = Color.Gray) + } } } } @Composable private fun Dot(color: Color) { - Box(modifier = Modifier - .padding(5.dp) - .size(10.dp) - .clip(CircleShape) - .background(color)) + Box( + modifier = Modifier + .padding(5.dp) + .size(10.dp) + .clip(CircleShape) + .background(color) + ) } @Composable From 0341fcf137c66987f713c4bde5298f0fdadea866 Mon Sep 17 00:00:00 2001 From: brreynie Date: Sat, 13 May 2023 16:31:03 +0200 Subject: [PATCH 21/53] clear navStack when ending session --- .../be/ugent/sel/studeez/navigation/StudeezNavGraph.kt | 5 +++-- .../screens/session_recap/SessionRecapScreen.kt | 10 +++++----- .../screens/session_recap/SessionRecapViewModel.kt | 8 ++++---- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezNavGraph.kt b/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezNavGraph.kt index 37085f1..0a0e8b4 100644 --- a/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezNavGraph.kt +++ b/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezNavGraph.kt @@ -25,9 +25,9 @@ import be.ugent.sel.studeez.screens.settings.SettingsRoute import be.ugent.sel.studeez.screens.sign_up.SignUpRoute import be.ugent.sel.studeez.screens.splash.SplashRoute import be.ugent.sel.studeez.screens.subjects.SubjectRoute -import be.ugent.sel.studeez.screens.tasks.TaskRoute import be.ugent.sel.studeez.screens.subjects.form.SubjectCreateRoute import be.ugent.sel.studeez.screens.subjects.form.SubjectEditRoute +import be.ugent.sel.studeez.screens.tasks.TaskRoute import be.ugent.sel.studeez.screens.tasks.form.TaskCreateRoute import be.ugent.sel.studeez.screens.tasks.form.TaskEditRoute import be.ugent.sel.studeez.screens.timer_form.TimerAddRoute @@ -51,6 +51,7 @@ fun StudeezNavGraph( val open: (String) -> Unit = { appState.navigate(it) } val openAndPopUp: (String, String) -> Unit = { route, popUp -> appState.navigateAndPopUp(route, popUp) } + val clearAndNavigate: (route: String) -> Unit = { route -> appState.clearAndNavigate(route) } val drawerActions: DrawerActions = getDrawerActions(drawerViewModel, open, openAndPopUp) val navigationBarActions: NavigationBarActions = @@ -200,7 +201,7 @@ fun StudeezNavGraph( composable(StudeezDestinations.SESSION_RECAP) { SessionRecapRoute( - openAndPopUp = openAndPopUp, + clearAndNavigate = clearAndNavigate, viewModel = hiltViewModel() ) } 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 2d06e0b..e49c8d6 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 @@ -21,24 +21,24 @@ data class SessionRecapActions( fun getSessionRecapActions( viewModel: SessionRecapViewModel, - openAndPopUp: (String, String) -> Unit, + clearAndNavigate: (String) -> Unit, ): SessionRecapActions { return SessionRecapActions( viewModel::getSessionReport, - {viewModel.saveSession(openAndPopUp)}, - {viewModel.discardSession(openAndPopUp)} + { viewModel.saveSession(clearAndNavigate) }, + { viewModel.discardSession(clearAndNavigate) } ) } @Composable fun SessionRecapRoute( - openAndPopUp: (String, String) -> Unit, + clearAndNavigate: (String) -> Unit, modifier: Modifier = Modifier, viewModel: SessionRecapViewModel, ) { SessionRecapScreen( modifier = modifier, - getSessionRecapActions(viewModel, openAndPopUp) + getSessionRecapActions(viewModel, clearAndNavigate) ) } diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapViewModel.kt index c11e28f..bf11b93 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapViewModel.kt @@ -24,15 +24,15 @@ class SessionRecapViewModel @Inject constructor( return selectedSessionReport() } - fun saveSession(open: (String, String) -> Unit) { + fun saveSession(open: (String) -> Unit) { sessionDAO.saveSession(getSessionReport()) val newTask = selectedTask().copy(time = selectedTask().time + selectedSessionReport().studyTime) taskDAO.updateTask(newTask) - open(StudeezDestinations.HOME_SCREEN, StudeezDestinations.SESSION_RECAP) + open(StudeezDestinations.HOME_SCREEN) } - fun discardSession(open: (String, String) -> Unit) { - open(StudeezDestinations.HOME_SCREEN, StudeezDestinations.SESSION_RECAP) + fun discardSession(open: (String) -> Unit) { + open(StudeezDestinations.HOME_SCREEN) } } \ No newline at end of file From 05e8951edff72431c8e78493ad3de3258f17ca3a Mon Sep 17 00:00:00 2001 From: brreynie Date: Sat, 13 May 2023 16:48:53 +0200 Subject: [PATCH 22/53] #109 refactor forms to be more consistent --- .../common/composable/FormComposable.kt | 22 +++++++++ .../subjects/form/SubjectFormScreen.kt | 4 +- .../screens/tasks/form/TaskFormScreen.kt | 4 +- .../{TimerFormRoute.kt => TimerFormScreen.kt} | 7 ++- .../form_screens/AbstractTimerFormScreen.kt | 48 ++++++------------- 5 files changed, 46 insertions(+), 39 deletions(-) create mode 100644 app/src/main/java/be/ugent/sel/studeez/common/composable/FormComposable.kt rename app/src/main/java/be/ugent/sel/studeez/screens/timer_form/{TimerFormRoute.kt => TimerFormScreen.kt} (87%) diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/FormComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/FormComposable.kt new file mode 100644 index 0000000..1fbcfb2 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/FormComposable.kt @@ -0,0 +1,22 @@ +package be.ugent.sel.studeez.common.composable + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier + +@Composable +fun FormComposable( + title: String, + popUp: () -> Unit, + content: @Composable () -> Unit, +) { + SecondaryScreenTemplate(title = title, popUp = popUp) { + Box( + modifier = Modifier.verticalScroll(rememberScrollState()), + ) { + content() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormScreen.kt index bd81c8c..26097ce 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormScreen.kt @@ -13,7 +13,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import be.ugent.sel.studeez.common.composable.BasicButton import be.ugent.sel.studeez.common.composable.DeleteButton -import be.ugent.sel.studeez.common.composable.SecondaryScreenTemplate +import be.ugent.sel.studeez.common.composable.FormComposable import be.ugent.sel.studeez.common.ext.basicButton import be.ugent.sel.studeez.common.ext.fieldModifier import be.ugent.sel.studeez.resources @@ -71,7 +71,7 @@ fun SubjectForm( onColorChange: (Color) -> Unit, extraButton: @Composable () -> Unit = {}, ) { - SecondaryScreenTemplate( + FormComposable( title = resources().getString(title), popUp = goBack, ) { diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/tasks/form/TaskFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/tasks/form/TaskFormScreen.kt index 92302ea..79c744d 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/tasks/form/TaskFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/tasks/form/TaskFormScreen.kt @@ -11,7 +11,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import be.ugent.sel.studeez.common.composable.BasicButton import be.ugent.sel.studeez.common.composable.DeleteButton -import be.ugent.sel.studeez.common.composable.SecondaryScreenTemplate +import be.ugent.sel.studeez.common.composable.FormComposable import be.ugent.sel.studeez.common.ext.basicButton import be.ugent.sel.studeez.common.ext.fieldModifier import be.ugent.sel.studeez.resources @@ -62,7 +62,7 @@ fun TaskForm( onNameChange: (String) -> Unit, extraButton: @Composable () -> Unit = {} ) { - SecondaryScreenTemplate( + FormComposable( title = resources().getString(title), popUp = goBack, ) { diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/TimerFormRoute.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/TimerFormScreen.kt similarity index 87% rename from app/src/main/java/be/ugent/sel/studeez/screens/timer_form/TimerFormRoute.kt rename to app/src/main/java/be/ugent/sel/studeez/screens/timer_form/TimerFormScreen.kt index 0323dc2..542a7f0 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/TimerFormRoute.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/TimerFormScreen.kt @@ -3,7 +3,7 @@ package be.ugent.sel.studeez.screens.timer_form import androidx.annotation.StringRes import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource -import be.ugent.sel.studeez.common.composable.SecondaryScreenTemplate +import be.ugent.sel.studeez.common.composable.FormComposable import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo import be.ugent.sel.studeez.R.string as AppText @@ -36,7 +36,10 @@ fun TimerFormScreen( ) { val timerFormScreen = getTimerInfo().accept(GetTimerFormScreen()) - SecondaryScreenTemplate(title = stringResource(id = label), popUp = popUp) { + FormComposable( + title = stringResource(id = label), + popUp = popUp + ) { timerFormScreen(onConfirmClick) } } diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/AbstractTimerFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/AbstractTimerFormScreen.kt index 5f4a17b..69d02ef 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/AbstractTimerFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/AbstractTimerFormScreen.kt @@ -1,17 +1,7 @@ package be.ugent.sel.studeez.screens.timer_form.form_screens -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.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment +import androidx.compose.runtime.* import androidx.compose.ui.Modifier import be.ugent.sel.studeez.R import be.ugent.sel.studeez.common.composable.BasicButton @@ -32,32 +22,24 @@ abstract class AbstractTimerFormScreen(private val timerInfo: TimerInfo) { timerInfo.name = name timerInfo.description = description - Column( - verticalArrangement = Arrangement.SpaceBetween, - modifier = Modifier.fillMaxHeight().verticalScroll(rememberScrollState()), - ) { - Column( - modifier = Modifier.fillMaxWidth(), - horizontalAlignment = Alignment.CenterHorizontally - ) { + Column { - // Fields that every timer shares (ommited id) - LabelledInputField( - value = name, - onNewValue = { name = it }, - label = R.string.name - ) + // Fields that every timer shares (ommited id) + LabelledInputField( + value = name, + onNewValue = { name = it }, + label = R.string.name + ) - LabelledInputField( - value = description, - onNewValue = { description = it }, - label = AppText.description, - singleLine = false - ) + LabelledInputField( + value = description, + onNewValue = { description = it }, + label = AppText.description, + singleLine = false + ) - ExtraFields() + ExtraFields() - } BasicButton(R.string.save, Modifier.basicButton()) { onSaveClick(timerInfo) } From 4b09a8011c5aeb48cd83f0f40afb141305225297 Mon Sep 17 00:00:00 2001 From: brreynie Date: Sat, 13 May 2023 17:22:40 +0200 Subject: [PATCH 23/53] button to regenerate color --- app/build.gradle | 3 -- .../subjects/form/SubjectFormScreen.kt | 45 +++++++++++++++---- .../subjects/form/SubjectFormUiState.kt | 5 ++- .../subjects/form/SubjectFormViewModel.kt | 2 +- 4 files changed, 41 insertions(+), 14 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a19cbd7..68d4e47 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -123,9 +123,6 @@ dependencies { implementation 'com.google.firebase:firebase-firestore-ktx' implementation 'com.google.firebase:firebase-perf-ktx' implementation 'com.google.firebase:firebase-config-ktx' - - // Colorpicker - implementation 'com.github.skydoves:colorpicker-compose:1.0.2' } // Allow references to generate code diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormScreen.kt index 19e6816..da59eda 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormScreen.kt @@ -1,20 +1,26 @@ package be.ugent.sel.studeez.screens.subjects.form import androidx.annotation.StringRes +import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.layout.Column -import androidx.compose.material.OutlinedTextField +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Button +import androidx.compose.material.ButtonDefaults +import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp import be.ugent.sel.studeez.common.composable.BasicButton import be.ugent.sel.studeez.common.composable.DeleteButton +import be.ugent.sel.studeez.common.composable.LabelledInputField import be.ugent.sel.studeez.common.composable.SecondaryScreenTemplate import be.ugent.sel.studeez.common.ext.basicButton import be.ugent.sel.studeez.common.ext.fieldModifier +import be.ugent.sel.studeez.common.ext.generateRandomArgb import be.ugent.sel.studeez.resources import be.ugent.sel.studeez.R.string as AppText @@ -31,7 +37,7 @@ fun SubjectCreateRoute( uiState = uiState, onConfirm = { viewModel.onCreate(openAndPopUp) }, onNameChange = viewModel::onNameChange, - onColorChange = {}, + onColorChange = viewModel::onColorChange, ) } @@ -48,7 +54,7 @@ fun SubjectEditRoute( uiState = uiState, onConfirm = { viewModel.onEdit(openAndPopUp) }, onNameChange = viewModel::onNameChange, - onColorChange = {}, + onColorChange = viewModel::onColorChange, ) { DeleteButton(text = AppText.delete_subject) { viewModel.onDelete(openAndPopUp) @@ -63,7 +69,7 @@ fun SubjectForm( uiState: SubjectFormUiState, onConfirm: () -> Unit, onNameChange: (String) -> Unit, - onColorChange: (Color) -> Unit, + onColorChange: (Long) -> Unit, extraButton: @Composable () -> Unit = {}, ) { SecondaryScreenTemplate( @@ -71,13 +77,13 @@ fun SubjectForm( popUp = goBack, ) { Column { - OutlinedTextField( + LabelledInputField( singleLine = true, value = uiState.name, - onValueChange = onNameChange, - placeholder = { Text(stringResource(id = AppText.name)) }, - modifier = Modifier.fieldModifier(), + onNewValue = onNameChange, + label = AppText.name, ) + ColorPicker(onColorChange, uiState) BasicButton( text = AppText.confirm, modifier = Modifier.basicButton(), @@ -88,6 +94,27 @@ fun SubjectForm( } } +@Composable +fun ColorPicker( + onColorChange: (Long) -> Unit, + uiState: SubjectFormUiState, +) { + Button( + onClick = { onColorChange(Color.generateRandomArgb()) }, + modifier = Modifier + .fieldModifier(), + colors = ButtonDefaults.buttonColors( + backgroundColor = Color(uiState.color), +// contentColor = MaterialTheme.colors.onSurface.copy(alpha = 0.4f), + ), + shape = RoundedCornerShape(4.dp), +// border = BorderStroke(1.dp, MaterialTheme.colors.onSurface.copy(alpha = 0.4f)), + elevation = null, + ) { + Text(text = "Regenerate color") + } +} + @Preview @Composable fun AddSubjectFormPreview() { diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormUiState.kt b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormUiState.kt index 9fdba01..10a18e8 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormUiState.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormUiState.kt @@ -1,6 +1,9 @@ package be.ugent.sel.studeez.screens.subjects.form +import androidx.compose.ui.graphics.Color +import be.ugent.sel.studeez.common.ext.generateRandomArgb + data class SubjectFormUiState( val name: String = "", - val color: Long = 0xFFFFD200, + val color: Long = Color.generateRandomArgb(), ) \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormViewModel.kt index eb7ee6f..7847a63 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormViewModel.kt @@ -46,7 +46,7 @@ class SubjectCreateFormViewModel @Inject constructor( fun onCreate(openAndPopUp: (String, String) -> Unit) { val newSubject = Subject( name = name, - argb_color = Color.generateRandomArgb(), + argb_color = color, ) subjectDAO.saveSubject( newSubject From 360fb122f73bce5f7bdc6442aed131a7de8c7437 Mon Sep 17 00:00:00 2001 From: brreynie Date: Sat, 13 May 2023 17:24:46 +0200 Subject: [PATCH 24/53] some code polishing --- .../sel/studeez/screens/subjects/form/SubjectFormScreen.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormScreen.kt index da59eda..d01061b 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormScreen.kt @@ -101,15 +101,11 @@ fun ColorPicker( ) { Button( onClick = { onColorChange(Color.generateRandomArgb()) }, - modifier = Modifier - .fieldModifier(), + modifier = Modifier.fieldModifier(), colors = ButtonDefaults.buttonColors( backgroundColor = Color(uiState.color), -// contentColor = MaterialTheme.colors.onSurface.copy(alpha = 0.4f), ), shape = RoundedCornerShape(4.dp), -// border = BorderStroke(1.dp, MaterialTheme.colors.onSurface.copy(alpha = 0.4f)), - elevation = null, ) { Text(text = "Regenerate color") } From e8f2d71df3fb3c119ee30989fa8a5ce79ea8e2f2 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Sat, 13 May 2023 17:25:51 +0200 Subject: [PATCH 25/53] deleteTimer Apptext --- .../be/ugent/sel/studeez/screens/timer_form/TimerFormRoute.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/TimerFormRoute.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/TimerFormRoute.kt index 7cef001..cf8f374 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/TimerFormRoute.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/TimerFormRoute.kt @@ -34,7 +34,7 @@ fun TimerEditRoute( @Composable fun deleteButton() { - DeleteButton(text = AppText.delete_subject) { + DeleteButton(text = AppText.delete_timer) { viewModel.deleteTimer(viewModel.getTimerInfo(), popUp) } } From eb28fa4ae40d9255347f5d2c409405d34ff67c26 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Sat, 13 May 2023 17:26:19 +0200 Subject: [PATCH 26/53] valid and first booleans in map --- .../form_screens/AbstractTimerFormScreen.kt | 56 +++++++++---------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/AbstractTimerFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/AbstractTimerFormScreen.kt index e936898..8ea31d2 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/AbstractTimerFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/AbstractTimerFormScreen.kt @@ -6,43 +6,37 @@ 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.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue +import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.input.KeyboardType import be.ugent.sel.studeez.R import be.ugent.sel.studeez.common.composable.BasicButton import be.ugent.sel.studeez.common.composable.LabeledErrorTextField -import be.ugent.sel.studeez.common.composable.LabelledInputField import be.ugent.sel.studeez.common.ext.basicButton +import be.ugent.sel.studeez.common.snackbar.SnackbarManager import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo import be.ugent.sel.studeez.R.string as AppText abstract class AbstractTimerFormScreen(private val timerInfo: TimerInfo) { + protected val valids = mutableMapOf( + "name" to mutableStateOf(textPredicate(timerInfo.name)), + "description" to mutableStateOf(textPredicate(timerInfo.description)) + ) + + protected val firsts = mutableMapOf( + "name" to mutableStateOf(true), + "description" to mutableStateOf(true) + ) + + @Composable operator fun invoke( onSaveClick: (TimerInfo) -> Unit, extraButton: @Composable () -> Unit ) { - - var name by remember { mutableStateOf(timerInfo.name) } - val isNameValid = remember { mutableStateOf(false) } - val hasEditedName = remember { mutableStateOf(true) } - - var description by remember { mutableStateOf(timerInfo.description) } - val isDescriptionValid = remember { mutableStateOf(false) } - val hasEditedDescription = remember { mutableStateOf(true) } - - // This shall rerun whenever name and description change - timerInfo.name = name - timerInfo.description = description - Column( verticalArrangement = Arrangement.SpaceBetween, modifier = Modifier @@ -59,25 +53,25 @@ abstract class AbstractTimerFormScreen(private val timerInfo: TimerInfo) { initialValue = timerInfo.name, label = R.string.name, errorText = AppText.name_error, - isValid = isNameValid, - isFirst = hasEditedName, + isValid = valids.getValue("name"), + isFirst = firsts.getValue("name"), keyboardType = KeyboardType.Text, predicate = { it.isNotBlank() } ) { correctName -> - name = correctName + timerInfo.name = correctName } LabeledErrorTextField( initialValue = timerInfo.description, label = R.string.description, errorText = AppText.description_error, - isValid = isDescriptionValid, - isFirst = hasEditedDescription, + isValid = valids.getValue("description"), + isFirst = firsts.getValue("description"), singleLine= false, keyboardType = KeyboardType.Text, - predicate = { it.isNotBlank() } + predicate = { textPredicate(it) } ) { correctName -> - description = correctName + timerInfo.description = correctName } ExtraFields() @@ -86,11 +80,11 @@ abstract class AbstractTimerFormScreen(private val timerInfo: TimerInfo) { Column { BasicButton(R.string.save, Modifier.basicButton()) { - if (isNameValid.value && isDescriptionValid.value) { + if (valids.all { it.component2().value }) { // All fields are valid onSaveClick(timerInfo) } else { - hasEditedName.value = false - hasEditedDescription.value = false + firsts.map { it.component2().value = false } // dont mask error because its not been filled out yet + SnackbarManager.showMessage(AppText.fill_out_error) } } extraButton() @@ -98,6 +92,10 @@ abstract class AbstractTimerFormScreen(private val timerInfo: TimerInfo) { } } + private fun textPredicate(text: String): Boolean { + return text.isNotBlank() + } + @Composable open fun ExtraFields() { // By default no extra fields, unless overwritten by subclass. From df0325074d04bbf042383d0653eb7e2125ca420a Mon Sep 17 00:00:00 2001 From: brreynie Date: Sat, 13 May 2023 17:29:25 +0200 Subject: [PATCH 27/53] i18n for regenerate button --- .../sel/studeez/screens/subjects/form/SubjectFormScreen.kt | 6 +++--- app/src/main/res/values/strings.xml | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormScreen.kt index d01061b..b89a851 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/form/SubjectFormScreen.kt @@ -1,17 +1,16 @@ package be.ugent.sel.studeez.screens.subjects.form import androidx.annotation.StringRes -import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.layout.Column import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Button import androidx.compose.material.ButtonDefaults -import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import be.ugent.sel.studeez.common.composable.BasicButton @@ -104,10 +103,11 @@ fun ColorPicker( modifier = Modifier.fieldModifier(), colors = ButtonDefaults.buttonColors( backgroundColor = Color(uiState.color), + contentColor = Color.White, ), shape = RoundedCornerShape(4.dp), ) { - Text(text = "Regenerate color") + Text(text = stringResource(id = AppText.regenerate_color)) } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 70c4558..fa27f51 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -46,6 +46,7 @@ Delete Subject Delete Task View + Regenerate Color Looks like you found the sessions screen! In here, your upcoming studying sessions with friends will be listed. You can accept invites or edit your own. From 2971ae85aa59b404cb313542c918c7693fc9203d Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Sat, 13 May 2023 17:27:13 +0200 Subject: [PATCH 28/53] map implementation --- .../form_screens/BreakTimerFormScreen.kt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/BreakTimerFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/BreakTimerFormScreen.kt index 333fc24..44ae76a 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/BreakTimerFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/BreakTimerFormScreen.kt @@ -15,6 +15,8 @@ class BreakTimerFormScreen( private val breakTimerInfo: PomodoroTimerInfo ): AbstractTimerFormScreen(breakTimerInfo) { + + @Composable override fun ExtraFields() { // If the user presses the OK button on the timepicker, the time in the button should change @@ -26,13 +28,17 @@ class BreakTimerFormScreen( breakTimerInfo.breakTime = newTime } + valids["repeats"] = remember {mutableStateOf(true)} + firsts["repeats"] = remember { mutableStateOf(true) } + LabeledErrorTextField( initialValue = breakTimerInfo.repeats.toString(), label = R.string.repeats, errorText = AppText.repeats_error, - isValid = mutableStateOf(false), + isValid = valids.getValue("repeats"), + isFirst = firsts.getValue("repeats"), keyboardType = KeyboardType.Decimal, - predicate = { it.matches(Regex("[1-9]+\\d*")) } + predicate = { isNumber(it) } ) { correctlyTypedInt -> breakTimerInfo.repeats = correctlyTypedInt.toInt() } @@ -40,6 +46,10 @@ class BreakTimerFormScreen( } } +fun isNumber(text: String): Boolean { + return text.matches(Regex("[1-9]+\\d*")) +} + @Preview @Composable fun BreakEditScreenPreview() { From 1330396ba8f7e9294157f34bdf16d0a0d33927c7 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Sat, 13 May 2023 17:38:04 +0200 Subject: [PATCH 29/53] made buttons fill out screen --- .../timer_type_select/TimerTypeSelectScreen.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/timer_type_select/TimerTypeSelectScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/timer_type_select/TimerTypeSelectScreen.kt index fa8d650..4825c63 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/timer_type_select/TimerTypeSelectScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/timer_type_select/TimerTypeSelectScreen.kt @@ -1,13 +1,13 @@ package be.ugent.sel.studeez.screens.timer_form.timer_type_select -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.* 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.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import be.ugent.sel.studeez.common.composable.SecondaryScreenTemplate import be.ugent.sel.studeez.data.local.models.timer_info.* @@ -37,7 +37,10 @@ fun TimerTypeSelectScreen( ) { TimerType.values().forEach { timerType -> val default: TimerInfo = defaultTimerInfo.getValue(timerType) - Button(onClick = { viewModel.onTimerTypeChosen(default, open) }) { + Button( + onClick = { viewModel.onTimerTypeChosen(default, open) }, + modifier = Modifier.fillMaxWidth().padding(5.dp) + ) { Text(text = timerType.name) } } From eef4a8caf5dfe979754125d2c44efb7f72bda479 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Sat, 13 May 2023 17:38:29 +0200 Subject: [PATCH 30/53] added fillout error text --- app/src/main/res/values/strings.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 70c4558..303fa29 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -69,8 +69,15 @@ Timers + Delete Timer Edit Add timer + + Name should not be blank + Description should not be blank + Fill out all the fields correctly! + + Select time Focus! From 9d13a3395955dd933ace60e43a9552190d5d7079 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 15 May 2023 11:02:56 +0200 Subject: [PATCH 31/53] Update app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/AbstractTimerFormScreen.kt Co-authored-by: brreynie --- .../screens/timer_form/form_screens/AbstractTimerFormScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/AbstractTimerFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/AbstractTimerFormScreen.kt index 8ea31d2..8afe306 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/AbstractTimerFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/AbstractTimerFormScreen.kt @@ -34,7 +34,7 @@ abstract class AbstractTimerFormScreen(private val timerInfo: TimerInfo) { @Composable operator fun invoke( onSaveClick: (TimerInfo) -> Unit, - extraButton: @Composable () -> Unit + extraButton: @Composable () -> Unit = {}, ) { Column( From 29b976cae426d2a1879ed5bd0621dd13e6adf475 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 15 May 2023 11:03:21 +0200 Subject: [PATCH 32/53] Update app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/BreakTimerFormScreen.kt Co-authored-by: brreynie --- .../screens/timer_form/form_screens/BreakTimerFormScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/BreakTimerFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/BreakTimerFormScreen.kt index 44ae76a..c87bd7b 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/BreakTimerFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/BreakTimerFormScreen.kt @@ -61,6 +61,6 @@ fun BreakEditScreenPreview() { 5 ) StudeezTheme { - BreakTimerFormScreen(pomodoroTimerInfo).invoke(onSaveClick = {}, {}) + BreakTimerFormScreen(pomodoroTimerInfo).invoke(onSaveClick = {}) } } \ No newline at end of file From f722218abe0f8e8de0113c62478ff271ab3a440c Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 15 May 2023 11:03:29 +0200 Subject: [PATCH 33/53] Update app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/CustomTimerFormScreen.kt Co-authored-by: brreynie --- .../screens/timer_form/form_screens/CustomTimerFormScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/CustomTimerFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/CustomTimerFormScreen.kt index b0000a0..27c0657 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/CustomTimerFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/CustomTimerFormScreen.kt @@ -29,6 +29,6 @@ class CustomTimerFormScreen( fun CustomEditScreenPreview() { val customTimerInfo = CustomTimerInfo("custom", "my description", 25) StudeezTheme { - CustomTimerFormScreen(customTimerInfo).invoke(onSaveClick = {}, extraButton = {}) + CustomTimerFormScreen(customTimerInfo).invoke(onSaveClick = {}) } } \ No newline at end of file From bd1c4df3012a53f25a360dbb7681e4554225188f Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 15 May 2023 11:03:37 +0200 Subject: [PATCH 34/53] Update app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/EndlessTimerFormScreen.kt Co-authored-by: brreynie --- .../screens/timer_form/form_screens/EndlessTimerFormScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/EndlessTimerFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/EndlessTimerFormScreen.kt index e096946..9009fff 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/EndlessTimerFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/EndlessTimerFormScreen.kt @@ -18,6 +18,6 @@ fun EndlessEditScreenPreview() { "My endless timer description", ) StudeezTheme { - EndlessTimerFormScreen(endlessTimerInfo).invoke(onSaveClick = {}, {}) + EndlessTimerFormScreen(endlessTimerInfo).invoke(onSaveClick = {}) } } \ No newline at end of file From 6938b3e868ca5ebd48ff45d576054098dd0811a3 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 15 May 2023 12:52:57 +0200 Subject: [PATCH 35/53] #118 AbstractSessionScreen -> this file --- .../composables/BreakTimerScreenComposable.kt | 2 + .../CustomTimerSessionScreenComposable.kt | 2 + .../EndlessTimerSessionScreenComposable.kt | 4 ++ .../composables/SessionScreenComposable.kt | 67 +++++++++++++++++++ .../composables/TimerComposable.kt | 2 + 5 files changed, 77 insertions(+) create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/CustomTimerSessionScreenComposable.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/EndlessTimerSessionScreenComposable.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/SessionScreenComposable.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt new file mode 100644 index 0000000..da72fe0 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt @@ -0,0 +1,2 @@ +package be.ugent.sel.studeez.screens.session.sessionScreens.composables + diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/CustomTimerSessionScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/CustomTimerSessionScreenComposable.kt new file mode 100644 index 0000000..da72fe0 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/CustomTimerSessionScreenComposable.kt @@ -0,0 +1,2 @@ +package be.ugent.sel.studeez.screens.session.sessionScreens.composables + diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/EndlessTimerSessionScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/EndlessTimerSessionScreenComposable.kt new file mode 100644 index 0000000..683b284 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/EndlessTimerSessionScreenComposable.kt @@ -0,0 +1,4 @@ +package be.ugent.sel.studeez.screens.session.sessionScreens.composables + +class EndlessTimerSessionScreenComposable { +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/SessionScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/SessionScreenComposable.kt new file mode 100644 index 0000000..d148e19 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/SessionScreenComposable.kt @@ -0,0 +1,67 @@ +package be.ugent.sel.studeez.screens.session.sessionScreens.composables + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Text +import androidx.compose.material.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimer +import be.ugent.sel.studeez.screens.session.SessionActions + +@Composable +fun SessionScreen( + open: (String) -> Unit, + sessionActions: SessionActions, + motivationString: @Composable () -> String +) { + Column( + modifier = Modifier.padding(10.dp) + ) { + Timer(sessionActions = sessionActions, motivationString = motivationString) + Box( + contentAlignment = Alignment.Center, modifier = Modifier + .fillMaxWidth() + .padding(50.dp) + ) { + EndSessionButton(sessionActions = sessionActions) + } + } +} + +@Composable +fun EndSessionButton(sessionActions: SessionActions) { + TextButton( + onClick = { + sessionActions.releaseMediaPlayer + sessionActions.endSession() + }, + modifier = Modifier + .padding(horizontal = 20.dp) + .border(1.dp, Color.Red, RoundedCornerShape(32.dp)) + .background(Color.Transparent) + ) { + EndsessionText() + } +} + +@Composable +fun EndsessionText() { + Text( + text = "End session", + color = Color.Red, + fontWeight = FontWeight.Bold, + fontSize = 18.sp, + modifier = Modifier.padding(1.dp) + ) +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt new file mode 100644 index 0000000..ba3f71d --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt @@ -0,0 +1,2 @@ +package be.ugent.sel.studeez.screens.session.sessionScreens + From 5073e5cb224c8a77d0d67a3309558403dd7aa9cf Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 15 May 2023 12:54:07 +0200 Subject: [PATCH 36/53] #118 subclass of AbstractSessionScreen -> this file --- .../composables/BreakTimerScreenComposable.kt | 36 +++++++++++++++++++ .../CustomTimerSessionScreenComposable.kt | 27 ++++++++++++++ .../EndlessTimerSessionScreenComposable.kt | 22 +++++++++++- 3 files changed, 84 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt index da72fe0..11cce8d 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt @@ -1,2 +1,38 @@ package be.ugent.sel.studeez.screens.session.sessionScreens.composables +import androidx.compose.runtime.Composable +import be.ugent.sel.studeez.R +import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalPomodoroTimer +import be.ugent.sel.studeez.resources +import be.ugent.sel.studeez.screens.session.SessionActions + +@Composable +fun BreakSessionScreenComposable( + open: (String) -> Unit, + sessionActions: SessionActions, + pomodoroTimer: FunctionalPomodoroTimer +) { + SessionScreen( + open = open, + sessionActions = sessionActions + ) { + motivationString(pomodoroTimer = pomodoroTimer) + } +} + +@Composable +private fun motivationString(pomodoroTimer: FunctionalPomodoroTimer): String { + if (pomodoroTimer.isInBreak) { + return resources().getString(R.string.state_take_a_break) + } + + if (pomodoroTimer.hasEnded()) { + return resources().getString(R.string.state_done) + } + + return resources().getQuantityString( + R.plurals.state_focus_remaining, + pomodoroTimer.breaksRemaining, + pomodoroTimer.breaksRemaining + ) +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/CustomTimerSessionScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/CustomTimerSessionScreenComposable.kt index da72fe0..bafcb19 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/CustomTimerSessionScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/CustomTimerSessionScreenComposable.kt @@ -1,2 +1,29 @@ package be.ugent.sel.studeez.screens.session.sessionScreens.composables +import androidx.compose.runtime.Composable +import be.ugent.sel.studeez.R +import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalCustomTimer +import be.ugent.sel.studeez.resources +import be.ugent.sel.studeez.screens.session.SessionActions + +@Composable +fun CustomTimerSessionScreenComposable( + open: (String) -> Unit, + sessionActions: SessionActions, + customTimer: FunctionalCustomTimer +) { + SessionScreen( + open = open, + sessionActions = sessionActions + ) { + motivationString(customTimer = customTimer) + } +} + +@Composable +private fun motivationString(customTimer: FunctionalCustomTimer): String { + if (customTimer.hasEnded()) { + return resources().getString(R.string.state_done) + } + return resources().getString(R.string.state_focus) +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/EndlessTimerSessionScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/EndlessTimerSessionScreenComposable.kt index 683b284..b223f52 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/EndlessTimerSessionScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/EndlessTimerSessionScreenComposable.kt @@ -1,4 +1,24 @@ package be.ugent.sel.studeez.screens.session.sessionScreens.composables -class EndlessTimerSessionScreenComposable { +import androidx.compose.runtime.Composable +import be.ugent.sel.studeez.R +import be.ugent.sel.studeez.resources +import be.ugent.sel.studeez.screens.session.SessionActions + +@Composable +fun EndlessTimerSessionScreenComposable( + open: (String) -> Unit, + sessionActions: SessionActions, +) { + SessionScreen( + open = open, + sessionActions = sessionActions + ) { + motivationString() + } +} + +@Composable +private fun motivationString(): String { + return resources().getString(R.string.state_focus) } \ No newline at end of file From fdd0429e320b69d9e5ff9648cb4be898ce4e0ef4 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 15 May 2023 12:54:37 +0200 Subject: [PATCH 37/53] TimerComposable als apparte file --- .../composables/TimerComposable.kt | 92 ++++++++++++++++++- 1 file changed, 91 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt index ba3f71d..6123a8a 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt @@ -1,2 +1,92 @@ -package be.ugent.sel.studeez.screens.session.sessionScreens +package be.ugent.sel.studeez.screens.session.sessionScreens.composables +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Text +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import be.ugent.sel.studeez.data.local.models.timer_functional.HoursMinutesSeconds +import be.ugent.sel.studeez.screens.session.SessionActions +import kotlinx.coroutines.delay +import kotlin.time.Duration.Companion.seconds + +@Composable +fun Timer( + sessionActions: SessionActions, + motivationString: @Composable () -> String +) { + var tikker by remember { mutableStateOf(false) } + LaunchedEffect(tikker) { + delay(1.seconds) + sessionActions.getTimer().tick() + // callMediaPlayer() TODO + tikker = !tikker + } + + val hms = sessionActions.getTimer().getHoursMinutesSeconds() + Column { + + TimerClock(hms) + MotivationText(text = motivationString()) + + Box( + contentAlignment = Alignment.Center, modifier = Modifier + .fillMaxWidth() + .padding(50.dp) + ) { + Box( + contentAlignment = Alignment.Center, + modifier = Modifier + .padding(16.dp) + .background(Color.Blue, RoundedCornerShape(32.dp)) + ) { + TaskText(taskName = sessionActions.getTask()) + } + } + } +} + +@Composable +fun TimerClock(hms: HoursMinutesSeconds) { + Text( + text = hms.toString(), + modifier = Modifier + .fillMaxWidth() + .padding(50.dp), + textAlign = TextAlign.Center, + fontWeight = FontWeight.Bold, + fontSize = 40.sp, + ) +} + +@Composable +fun MotivationText(text: String) { + Text( + text = text, + modifier = Modifier.fillMaxWidth(), + textAlign = TextAlign.Center, + fontWeight = FontWeight.Light, + fontSize = 30.sp + ) +} + +@Composable +fun TaskText(taskName: String) { + Text( + text = taskName, + color = Color.White, + fontSize = 18.sp, + fontWeight = FontWeight.Bold, + modifier = Modifier.padding(vertical = 4.dp, horizontal = 20.dp) + ) +} \ No newline at end of file From 492775565c014b131f8821ec5220198f35b0b80e Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 15 May 2023 13:23:11 +0200 Subject: [PATCH 38/53] #118 integrated dots in composition --- .../composables/BreakTimerScreenComposable.kt | 39 ++++++++++++++++++- .../composables/SessionScreenComposable.kt | 10 ++++- .../composables/TimerComposable.kt | 4 +- 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt index 11cce8d..b548591 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt @@ -1,6 +1,14 @@ package be.ugent.sel.studeez.screens.session.sessionScreens.composables +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.CircleShape import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp import be.ugent.sel.studeez.R import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalPomodoroTimer import be.ugent.sel.studeez.resources @@ -14,12 +22,39 @@ fun BreakSessionScreenComposable( ) { SessionScreen( open = open, - sessionActions = sessionActions + sessionActions = sessionActions, + midSection = { Dots(pomodoroTimer) }, + motivationString = { motivationString(pomodoroTimer = pomodoroTimer) } + ) +} + +@Composable +private fun Dots(pomodoroTimer: FunctionalPomodoroTimer) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center, ) { - motivationString(pomodoroTimer = pomodoroTimer) + repeat(pomodoroTimer.repeats - pomodoroTimer.breaksRemaining) { + Dot(color = Color.DarkGray) + } + if (!pomodoroTimer.isInBreak) Dot(Color.Green) else Dot(Color.DarkGray) + repeat(pomodoroTimer.breaksRemaining - 1) { + Dot(color = Color.Gray) + } } } +@Composable +private fun Dot(color: Color) { + Box(modifier = Modifier + .padding(5.dp) + .size(10.dp) + .clip(CircleShape) + .background(color)) +} + + @Composable private fun motivationString(pomodoroTimer: FunctionalPomodoroTimer): String { if (pomodoroTimer.isInBreak) { diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/SessionScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/SessionScreenComposable.kt index d148e19..5ed29f8 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/SessionScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/SessionScreenComposable.kt @@ -23,12 +23,18 @@ import be.ugent.sel.studeez.screens.session.SessionActions fun SessionScreen( open: (String) -> Unit, sessionActions: SessionActions, - motivationString: @Composable () -> String + midSection: @Composable () -> Unit = {}, + motivationString: @Composable () -> String, + ) { Column( modifier = Modifier.padding(10.dp) ) { - Timer(sessionActions = sessionActions, motivationString = motivationString) + Timer( + sessionActions = sessionActions, + motivationString = motivationString, + midSection = midSection + ) Box( contentAlignment = Alignment.Center, modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt index 6123a8a..3b65599 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt @@ -23,7 +23,8 @@ import kotlin.time.Duration.Companion.seconds @Composable fun Timer( sessionActions: SessionActions, - motivationString: @Composable () -> String + motivationString: @Composable () -> String, + midSection: @Composable () -> Unit ) { var tikker by remember { mutableStateOf(false) } LaunchedEffect(tikker) { @@ -39,6 +40,7 @@ fun Timer( TimerClock(hms) MotivationText(text = motivationString()) + Box( contentAlignment = Alignment.Center, modifier = Modifier .fillMaxWidth() From b614f7d530204521f910892466893f13fe87769c Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 15 May 2023 16:30:13 +0200 Subject: [PATCH 39/53] Dots now returns an int --- .../composables/BreakTimerScreenComposable.kt | 21 +++++++++++-------- .../composables/GetSessionScreenComposable.kt | 4 ++++ .../composables/SessionScreenComposable.kt | 4 ++-- .../composables/TimerComposable.kt | 4 ++-- 4 files changed, 20 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/GetSessionScreenComposable.kt diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt index b548591..89bcc24 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt @@ -3,6 +3,7 @@ package be.ugent.sel.studeez.screens.session.sessionScreens.composables import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -18,18 +19,18 @@ import be.ugent.sel.studeez.screens.session.SessionActions fun BreakSessionScreenComposable( open: (String) -> Unit, sessionActions: SessionActions, - pomodoroTimer: FunctionalPomodoroTimer + pomodoroTimer: FunctionalPomodoroTimer, ) { SessionScreen( open = open, sessionActions = sessionActions, - midSection = { Dots(pomodoroTimer) }, - motivationString = { motivationString(pomodoroTimer = pomodoroTimer) } + midSection = { Dots(pomodoroTimer = pomodoroTimer) }, + motivationString = { motivationString (pomodoroTimer = pomodoroTimer) } ) } @Composable -private fun Dots(pomodoroTimer: FunctionalPomodoroTimer) { +private fun Dots(pomodoroTimer: FunctionalPomodoroTimer): Int { Row( modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, @@ -43,6 +44,7 @@ private fun Dots(pomodoroTimer: FunctionalPomodoroTimer) { Dot(color = Color.Gray) } } + return pomodoroTimer.breaksRemaining } @Composable @@ -65,9 +67,10 @@ private fun motivationString(pomodoroTimer: FunctionalPomodoroTimer): String { return resources().getString(R.string.state_done) } - return resources().getQuantityString( - R.plurals.state_focus_remaining, - pomodoroTimer.breaksRemaining, - pomodoroTimer.breaksRemaining - ) + return resources().getString(R.string.state_focus) +} + +@Composable +private fun test(pomodoroTimer: FunctionalPomodoroTimer): String { + return pomodoroTimer.breaksRemaining.toString() } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/GetSessionScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/GetSessionScreenComposable.kt new file mode 100644 index 0000000..3f8762b --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/GetSessionScreenComposable.kt @@ -0,0 +1,4 @@ +package be.ugent.sel.studeez.screens.session.sessionScreens.composables + +class GetSessionScreenComposable { +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/SessionScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/SessionScreenComposable.kt index 5ed29f8..b31ee45 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/SessionScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/SessionScreenComposable.kt @@ -23,7 +23,7 @@ import be.ugent.sel.studeez.screens.session.SessionActions fun SessionScreen( open: (String) -> Unit, sessionActions: SessionActions, - midSection: @Composable () -> Unit = {}, + midSection: @Composable () -> Int = {0}, motivationString: @Composable () -> String, ) { @@ -33,7 +33,7 @@ fun SessionScreen( Timer( sessionActions = sessionActions, motivationString = motivationString, - midSection = midSection + MidSection = midSection ) Box( contentAlignment = Alignment.Center, modifier = Modifier diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt index 3b65599..87a6839 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt @@ -24,7 +24,7 @@ import kotlin.time.Duration.Companion.seconds fun Timer( sessionActions: SessionActions, motivationString: @Composable () -> String, - midSection: @Composable () -> Unit + MidSection: @Composable () -> Int ) { var tikker by remember { mutableStateOf(false) } LaunchedEffect(tikker) { @@ -39,7 +39,7 @@ fun Timer( TimerClock(hms) MotivationText(text = motivationString()) - + MidSection() Box( contentAlignment = Alignment.Center, modifier = Modifier From 052ebb8c32996f48ec376d17cab9e35891b3802d Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 15 May 2023 16:31:36 +0200 Subject: [PATCH 40/53] #118 new visitor for session screen --- .../composables/GetSessionScreenComposable.kt | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/GetSessionScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/GetSessionScreenComposable.kt index 3f8762b..bae4d92 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/GetSessionScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/GetSessionScreenComposable.kt @@ -1,4 +1,49 @@ package be.ugent.sel.studeez.screens.session.sessionScreens.composables -class GetSessionScreenComposable { +import android.media.MediaPlayer +import androidx.compose.runtime.Composable +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 +import be.ugent.sel.studeez.screens.session.SessionActions +import be.ugent.sel.studeez.screens.session.sessionScreens.AbstractSessionScreen +import be.ugent.sel.studeez.screens.session.sessionScreens.BreakSessionScreen +import be.ugent.sel.studeez.screens.session.sessionScreens.CustomSessionScreen +import be.ugent.sel.studeez.screens.session.sessionScreens.EndlessSessionScreen + +class GetSessionScreenComposable( + private val mediaplayer: MediaPlayer?, + private val open: (String) -> Unit, + private val sessionActions: SessionActions + ) : + FunctionalTimerVisitor<@Composable () -> Unit> { + + override fun visitFunctionalCustomTimer(functionalCustomTimer: FunctionalCustomTimer): @Composable () -> Unit { + return { CustomTimerSessionScreenComposable( + open = open, + sessionActions = sessionActions, + customTimer = functionalCustomTimer + ) + } + } + + override fun visitFunctionalEndlessTimer(functionalEndlessTimer: FunctionalEndlessTimer): @Composable () -> Unit { + return { + EndlessTimerSessionScreenComposable( + open = open, + sessionActions = sessionActions, + ) + } + } + + override fun visitFunctionalBreakTimer(functionalPomodoroTimer: FunctionalPomodoroTimer): @Composable () -> Unit { + return { + BreakSessionScreenComposable( + open = open, + sessionActions = sessionActions, + pomodoroTimer = functionalPomodoroTimer + ) + } + } } \ No newline at end of file From 4466f3646f9d730be0b1f8009be25174552a2cfc Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 15 May 2023 16:34:19 +0200 Subject: [PATCH 41/53] #118 gebruik nieuwe visitor om sessionScreen te instantieren --- .../ugent/sel/studeez/screens/session/SessionRoute.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt index 084ff43..959bc74 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt @@ -5,9 +5,12 @@ import android.media.RingtoneManager import android.net.Uri import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext +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.screens.session.sessionScreens.AbstractSessionScreen import be.ugent.sel.studeez.screens.session.sessionScreens.GetSessionScreen +import be.ugent.sel.studeez.screens.session.sessionScreens.composables.BreakSessionScreenComposable +import be.ugent.sel.studeez.screens.session.sessionScreens.composables.GetSessionScreenComposable data class SessionActions( val getTimer: () -> FunctionalTimer, @@ -47,10 +50,8 @@ fun SessionRoute( mediaplayer = mediaplayer ) - val sessionScreen: AbstractSessionScreen = viewModel.getTimer().accept(GetSessionScreen(mediaplayer)) + val sessionActions = getSessionActions(viewModel, openAndPopUp, mediaplayer) + val sessionScreen = viewModel.getTimer().accept(GetSessionScreenComposable(mediaplayer, open, sessionActions)) - sessionScreen( - open = open, - sessionActions = getSessionActions(viewModel, openAndPopUp, mediaplayer) - ) + sessionScreen() } From 4519bf2e3037766c979a8f32b485dbe7f8bfee5a Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 15 May 2023 18:57:24 +0200 Subject: [PATCH 42/53] added soundplayer --- .../session/sessionScreens/GetSessionScreen.kt | 18 ------------------ .../session/sessionScreens/SoundPlayer.kt | 4 ++++ .../composables/BreakTimerScreenComposable.kt | 9 +++------ .../CustomTimerSessionScreenComposable.kt | 5 ++++- 4 files changed, 11 insertions(+), 25 deletions(-) delete mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/GetSessionScreen.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/SoundPlayer.kt diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/GetSessionScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/GetSessionScreen.kt deleted file mode 100644 index 98b2d5e..0000000 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/GetSessionScreen.kt +++ /dev/null @@ -1,18 +0,0 @@ -package be.ugent.sel.studeez.screens.session.sessionScreens - -import android.media.MediaPlayer -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(private val mediaplayer: MediaPlayer?) : FunctionalTimerVisitor { - override fun visitFunctionalCustomTimer(functionalCustomTimer: FunctionalCustomTimer): AbstractSessionScreen = - CustomSessionScreen(functionalCustomTimer, mediaplayer) - - override fun visitFunctionalEndlessTimer(functionalEndlessTimer: FunctionalEndlessTimer): AbstractSessionScreen = - EndlessSessionScreen() - - override fun visitFunctionalBreakTimer(functionalPomodoroTimer: FunctionalPomodoroTimer): AbstractSessionScreen = - BreakSessionScreen(functionalPomodoroTimer, mediaplayer) -} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/SoundPlayer.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/SoundPlayer.kt new file mode 100644 index 0000000..f9c0942 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/SoundPlayer.kt @@ -0,0 +1,4 @@ +package be.ugent.sel.studeez.screens.session.sessionScreens + +class SoundPlayer { +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt index 89bcc24..57d73e2 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt @@ -3,7 +3,6 @@ package be.ugent.sel.studeez.screens.session.sessionScreens.composables import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -14,17 +13,20 @@ import be.ugent.sel.studeez.R import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalPomodoroTimer import be.ugent.sel.studeez.resources import be.ugent.sel.studeez.screens.session.SessionActions +import be.ugent.sel.studeez.screens.session.sessionScreens.SoundPlayer @Composable fun BreakSessionScreenComposable( open: (String) -> Unit, sessionActions: SessionActions, pomodoroTimer: FunctionalPomodoroTimer, + soundPlayer: SoundPlayer, ) { SessionScreen( open = open, sessionActions = sessionActions, midSection = { Dots(pomodoroTimer = pomodoroTimer) }, + callMediaPlayer = { soundPlayer.playOn(pomodoroTimer.hasCurrentCountdownEnded()) }, motivationString = { motivationString (pomodoroTimer = pomodoroTimer) } ) } @@ -68,9 +70,4 @@ private fun motivationString(pomodoroTimer: FunctionalPomodoroTimer): String { } return resources().getString(R.string.state_focus) -} - -@Composable -private fun test(pomodoroTimer: FunctionalPomodoroTimer): String { - return pomodoroTimer.breaksRemaining.toString() } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/CustomTimerSessionScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/CustomTimerSessionScreenComposable.kt index bafcb19..5cdc62c 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/CustomTimerSessionScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/CustomTimerSessionScreenComposable.kt @@ -5,15 +5,18 @@ import be.ugent.sel.studeez.R import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalCustomTimer import be.ugent.sel.studeez.resources import be.ugent.sel.studeez.screens.session.SessionActions +import be.ugent.sel.studeez.screens.session.sessionScreens.SoundPlayer @Composable fun CustomTimerSessionScreenComposable( open: (String) -> Unit, sessionActions: SessionActions, - customTimer: FunctionalCustomTimer + customTimer: FunctionalCustomTimer, + soundPlayer: SoundPlayer ) { SessionScreen( open = open, + callMediaPlayer = { soundPlayer.playOn(customTimer.hasEnded()) }, sessionActions = sessionActions ) { motivationString(customTimer = customTimer) From 4a04a703db101141b396f5d52f130bd10951d37f Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 15 May 2023 18:58:46 +0200 Subject: [PATCH 43/53] soundplayer wrapper to make mediaplayer easier to work with --- .../studeez/screens/session/SoundPlayer.kt | 29 +++++++++++++++++++ .../session/sessionScreens/SoundPlayer.kt | 4 --- 2 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/session/SoundPlayer.kt delete mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/SoundPlayer.kt diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/SoundPlayer.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/SoundPlayer.kt new file mode 100644 index 0000000..14fae19 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/SoundPlayer.kt @@ -0,0 +1,29 @@ +package be.ugent.sel.studeez.screens.session + +import android.content.Context +import android.media.MediaPlayer +import android.media.RingtoneManager + +class SoundPlayer(private val context: Context) { + + var oldValue: Boolean = false + var mediaPlayer: MediaPlayer = initPlayer() + + fun playOn(newValue: Boolean) { + if (oldValue != newValue) { + mediaPlayer.start() + mediaPlayer.setOnCompletionListener { + mediaPlayer = initPlayer() + } + oldValue = newValue + } + } + + + private fun initPlayer(): MediaPlayer { + return MediaPlayer.create( + context, + RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/SoundPlayer.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/SoundPlayer.kt deleted file mode 100644 index f9c0942..0000000 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/SoundPlayer.kt +++ /dev/null @@ -1,4 +0,0 @@ -package be.ugent.sel.studeez.screens.session.sessionScreens - -class SoundPlayer { -} \ No newline at end of file From 1db5a4160ea5c84b996b50df79286f291142bd1a Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 15 May 2023 19:00:36 +0200 Subject: [PATCH 44/53] refactor soundplayer location --- .../sessionScreens/composables/BreakTimerScreenComposable.kt | 2 +- .../composables/CustomTimerSessionScreenComposable.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt index 57d73e2..cac3509 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt @@ -13,7 +13,7 @@ import be.ugent.sel.studeez.R import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalPomodoroTimer import be.ugent.sel.studeez.resources import be.ugent.sel.studeez.screens.session.SessionActions -import be.ugent.sel.studeez.screens.session.sessionScreens.SoundPlayer +import be.ugent.sel.studeez.screens.session.SoundPlayer @Composable fun BreakSessionScreenComposable( diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/CustomTimerSessionScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/CustomTimerSessionScreenComposable.kt index 5cdc62c..ec3c2d8 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/CustomTimerSessionScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/CustomTimerSessionScreenComposable.kt @@ -5,7 +5,7 @@ import be.ugent.sel.studeez.R import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalCustomTimer import be.ugent.sel.studeez.resources import be.ugent.sel.studeez.screens.session.SessionActions -import be.ugent.sel.studeez.screens.session.sessionScreens.SoundPlayer +import be.ugent.sel.studeez.screens.session.SoundPlayer @Composable fun CustomTimerSessionScreenComposable( From 47491089928c438ac9861d49da86da91802e0704 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 15 May 2023 19:01:06 +0200 Subject: [PATCH 45/53] soundplayer to screens instead of mediaplayer --- .../composables/GetSessionScreenComposable.kt | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/GetSessionScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/GetSessionScreenComposable.kt index bae4d92..3780f42 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/GetSessionScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/GetSessionScreenComposable.kt @@ -1,19 +1,15 @@ package be.ugent.sel.studeez.screens.session.sessionScreens.composables -import android.media.MediaPlayer import androidx.compose.runtime.Composable 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 import be.ugent.sel.studeez.screens.session.SessionActions -import be.ugent.sel.studeez.screens.session.sessionScreens.AbstractSessionScreen -import be.ugent.sel.studeez.screens.session.sessionScreens.BreakSessionScreen -import be.ugent.sel.studeez.screens.session.sessionScreens.CustomSessionScreen -import be.ugent.sel.studeez.screens.session.sessionScreens.EndlessSessionScreen +import be.ugent.sel.studeez.screens.session.SoundPlayer class GetSessionScreenComposable( - private val mediaplayer: MediaPlayer?, + private val soundPlayer: SoundPlayer, private val open: (String) -> Unit, private val sessionActions: SessionActions ) : @@ -23,7 +19,8 @@ class GetSessionScreenComposable( return { CustomTimerSessionScreenComposable( open = open, sessionActions = sessionActions, - customTimer = functionalCustomTimer + soundPlayer = soundPlayer, + customTimer = functionalCustomTimer, ) } } @@ -42,6 +39,7 @@ class GetSessionScreenComposable( BreakSessionScreenComposable( open = open, sessionActions = sessionActions, + soundPlayer = soundPlayer, pomodoroTimer = functionalPomodoroTimer ) } From 8294d63e92d9c7445f7361077cde75f24581cb42 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 15 May 2023 19:02:23 +0200 Subject: [PATCH 46/53] added callmedia to session screen --- .../sessionScreens/composables/SessionScreenComposable.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/SessionScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/SessionScreenComposable.kt index b31ee45..0d02add 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/SessionScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/SessionScreenComposable.kt @@ -16,13 +16,13 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimer import be.ugent.sel.studeez.screens.session.SessionActions @Composable fun SessionScreen( open: (String) -> Unit, sessionActions: SessionActions, + callMediaPlayer: () -> Unit = {}, midSection: @Composable () -> Int = {0}, motivationString: @Composable () -> String, @@ -32,6 +32,7 @@ fun SessionScreen( ) { Timer( sessionActions = sessionActions, + callMediaPlayer = callMediaPlayer, motivationString = motivationString, MidSection = midSection ) @@ -49,7 +50,6 @@ fun SessionScreen( fun EndSessionButton(sessionActions: SessionActions) { TextButton( onClick = { - sessionActions.releaseMediaPlayer sessionActions.endSession() }, modifier = Modifier From 53bdf7d21588a5f5199a3861d807a447343ab2f5 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 15 May 2023 19:02:55 +0200 Subject: [PATCH 47/53] added callMediaPlayer call --- .../session/sessionScreens/composables/TimerComposable.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt index 87a6839..cade06f 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt @@ -23,6 +23,7 @@ import kotlin.time.Duration.Companion.seconds @Composable fun Timer( sessionActions: SessionActions, + callMediaPlayer: () -> Unit, motivationString: @Composable () -> String, MidSection: @Composable () -> Int ) { @@ -30,7 +31,7 @@ fun Timer( LaunchedEffect(tikker) { delay(1.seconds) sessionActions.getTimer().tick() - // callMediaPlayer() TODO + callMediaPlayer() tikker = !tikker } From 346b24aabe952a0d46f4b5f537901a71771631d6 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 15 May 2023 19:05:43 +0200 Subject: [PATCH 48/53] give soundplayer to visitor --- .../studeez/screens/session/SessionRoute.kt | 14 +- .../sessionScreens/AbstractSessionScreen.kt | 150 ------------------ .../sessionScreens/BreakSessionScreen.kt | 93 ----------- .../sessionScreens/CustomSessionScreen.kt | 35 ---- .../sessionScreens/EndlessSessionScreen.kt | 16 -- 5 files changed, 3 insertions(+), 305 deletions(-) delete mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/AbstractSessionScreen.kt delete mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakSessionScreen.kt delete mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/CustomSessionScreen.kt delete mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/EndlessSessionScreen.kt diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt index 959bc74..3572b5e 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt @@ -5,32 +5,23 @@ import android.media.RingtoneManager import android.net.Uri import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext -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.screens.session.sessionScreens.AbstractSessionScreen -import be.ugent.sel.studeez.screens.session.sessionScreens.GetSessionScreen -import be.ugent.sel.studeez.screens.session.sessionScreens.composables.BreakSessionScreenComposable import be.ugent.sel.studeez.screens.session.sessionScreens.composables.GetSessionScreenComposable data class SessionActions( val getTimer: () -> FunctionalTimer, val getTask: () -> String, - val startMediaPlayer: () -> Unit, - val releaseMediaPlayer: () -> Unit, val endSession: () -> Unit ) private fun getSessionActions( viewModel: SessionViewModel, openAndPopUp: (String, String) -> Unit, - mediaplayer: MediaPlayer, ): SessionActions { return SessionActions( getTimer = viewModel::getTimer, getTask = viewModel::getTask, endSession = { viewModel.endSession(openAndPopUp) }, - startMediaPlayer = mediaplayer::start, - releaseMediaPlayer = mediaplayer::release, ) } @@ -50,8 +41,9 @@ fun SessionRoute( mediaplayer = mediaplayer ) - val sessionActions = getSessionActions(viewModel, openAndPopUp, mediaplayer) - val sessionScreen = viewModel.getTimer().accept(GetSessionScreenComposable(mediaplayer, open, sessionActions)) + val soundPlayer = SoundPlayer(LocalContext.current) + val sessionActions = getSessionActions(viewModel, openAndPopUp) + val sessionScreen = viewModel.getTimer().accept(GetSessionScreenComposable(soundPlayer, open, sessionActions)) sessionScreen() } 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 deleted file mode 100644 index 08a8a72..0000000 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/AbstractSessionScreen.kt +++ /dev/null @@ -1,150 +0,0 @@ -package be.ugent.sel.studeez.screens.session.sessionScreens - -import androidx.compose.foundation.background -import androidx.compose.foundation.border -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.Text -import androidx.compose.material.TextButton -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.font.FontWeight -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.sp -import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalEndlessTimer -import be.ugent.sel.studeez.screens.session.SessionActions -import kotlinx.coroutines.delay -import kotlin.time.Duration.Companion.seconds - -abstract class AbstractSessionScreen { - - @Composable - operator fun invoke( - open: (String) -> Unit, - sessionActions: SessionActions, - ) { - Column( - modifier = Modifier.padding(10.dp) - ) { - Timer( - sessionActions = sessionActions, - ) - Box( - contentAlignment = Alignment.Center, modifier = Modifier - .fillMaxWidth() - .padding(50.dp) - ) { - TextButton( - onClick = { - sessionActions.releaseMediaPlayer - sessionActions.endSession() - }, - modifier = Modifier - .padding(horizontal = 20.dp) - .border(1.dp, Color.Red, RoundedCornerShape(32.dp)) - .background(Color.Transparent) - ) { - Text( - text = "End session", - color = Color.Red, - fontWeight = FontWeight.Bold, - fontSize = 18.sp, - modifier = Modifier.padding(1.dp) - ) - } - } - } - } - - @Composable - fun Timer( - sessionActions: SessionActions, - ) { - var tikker by remember { mutableStateOf(false) } - LaunchedEffect(tikker) { - delay(1.seconds) - sessionActions.getTimer().tick() - callMediaPlayer() - tikker = !tikker - } - - val hms = sessionActions.getTimer().getHoursMinutesSeconds() - Column { - Text( - text = hms.toString(), - modifier = Modifier - .fillMaxWidth() - .padding(50.dp), - textAlign = TextAlign.Center, - fontWeight = FontWeight.Bold, - fontSize = 40.sp, - ) - - Text( - text = motivationString(), - modifier = Modifier.fillMaxWidth(), - textAlign = TextAlign.Center, - fontWeight = FontWeight.Light, - fontSize = 30.sp - ) - - MidSection() - - Box( - contentAlignment = Alignment.Center, modifier = Modifier - .fillMaxWidth() - .padding(50.dp) - ) { - Box( - contentAlignment = Alignment.Center, - modifier = Modifier - .padding(16.dp) - .background(Color.Blue, RoundedCornerShape(32.dp)) - ) { - Text( - text = sessionActions.getTask(), - color = Color.White, - fontSize = 18.sp, - fontWeight = FontWeight.Bold, - modifier = Modifier.padding(vertical = 4.dp, horizontal = 20.dp) - ) - } - } - } - } - - @Composable - abstract fun motivationString(): String - - @Composable - open fun MidSection() { - // Default has no midsection, unless overwritten. - } - - abstract fun callMediaPlayer() - -} - -@Preview -@Composable -fun TimerPreview() { - val sessionScreen = object : AbstractSessionScreen() { - @Composable - override fun motivationString(): String = "Test" - override fun callMediaPlayer() {} - - } - sessionScreen.Timer(sessionActions = SessionActions({ FunctionalEndlessTimer() }, { "Preview" }, {}, {}, {})) -} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakSessionScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakSessionScreen.kt deleted file mode 100644 index 9c59b46..0000000 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakSessionScreen.kt +++ /dev/null @@ -1,93 +0,0 @@ -package be.ugent.sel.studeez.screens.session.sessionScreens - -import android.media.MediaPlayer -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.font.FontWeight -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.sp -import be.ugent.sel.studeez.R -import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalPomodoroTimer -import be.ugent.sel.studeez.resources -import be.ugent.sel.studeez.R.string as AppText - -class BreakSessionScreen( - private val funPomoDoroTimer: FunctionalPomodoroTimer, - private var mediaplayer: MediaPlayer? -): AbstractSessionScreen() { - - @Composable - override fun MidSection() { - Dots() - } - - @Composable - fun Dots() { - Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center, - ) { - repeat(funPomoDoroTimer.repeats - funPomoDoroTimer.breaksRemaining) { - Dot(color = Color.DarkGray) - } - if (!funPomoDoroTimer.isInBreak) Dot(Color.Green) else Dot(Color.DarkGray) - repeat(funPomoDoroTimer.breaksRemaining - 1) { - Dot(color = Color.Gray) - } - } - } - - @Composable - private fun Dot(color: Color) { - Box(modifier = Modifier - .padding(5.dp) - .size(10.dp) - .clip(CircleShape) - .background(color)) - } - - @Composable - override fun motivationString(): String { - if (funPomoDoroTimer.isInBreak) { - return resources().getString(AppText.state_take_a_break) - } - - if (funPomoDoroTimer.hasEnded()) { - return resources().getString(AppText.state_done) - } - - return resources().getString(AppText.state_focus) - } - - override fun callMediaPlayer() { - if (funPomoDoroTimer.hasEnded()) { - mediaplayer?.let { it: MediaPlayer -> - it.setOnCompletionListener { - it.release() - mediaplayer = null - } - it.start() - } - } else if (funPomoDoroTimer.hasCurrentCountdownEnded()) { - mediaplayer?.start() - } - } -} - -@Preview -@Composable -fun MidsectionPreview() { - val funPomoDoroTimer = FunctionalPomodoroTimer(15, 60, 5) - val breakSessionScreen = BreakSessionScreen(funPomoDoroTimer, MediaPlayer()) - breakSessionScreen.MidSection() -} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/CustomSessionScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/CustomSessionScreen.kt deleted file mode 100644 index 7fc60bc..0000000 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/CustomSessionScreen.kt +++ /dev/null @@ -1,35 +0,0 @@ -package be.ugent.sel.studeez.screens.session.sessionScreens - -import android.media.MediaPlayer -import androidx.compose.runtime.Composable -import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalCustomTimer -import be.ugent.sel.studeez.resources -import be.ugent.sel.studeez.R.string as AppText - - -class CustomSessionScreen( - private val functionalTimer: FunctionalCustomTimer, - private var mediaplayer: MediaPlayer? -): AbstractSessionScreen() { - - @Composable - override fun motivationString(): String { - if (functionalTimer.hasEnded()) { - return resources().getString(AppText.state_done) - } - return resources().getString(AppText.state_focus) - } - - override fun callMediaPlayer() { - if (functionalTimer.hasEnded()) { - mediaplayer?.let { it: MediaPlayer -> - it.setOnCompletionListener { - it.release() - mediaplayer = null - } - it.start() - } - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/EndlessSessionScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/EndlessSessionScreen.kt deleted file mode 100644 index be67cff..0000000 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/EndlessSessionScreen.kt +++ /dev/null @@ -1,16 +0,0 @@ -package be.ugent.sel.studeez.screens.session.sessionScreens - -import androidx.compose.runtime.Composable -import be.ugent.sel.studeez.resources -import be.ugent.sel.studeez.R.string as AppText - - -class EndlessSessionScreen : AbstractSessionScreen() { - - @Composable - override fun motivationString(): String { - return resources().getString(AppText.state_focus) - } - - override fun callMediaPlayer() {} -} \ No newline at end of file From 9573a2eb5c8b91220ba8784ec80e5275933fec22 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 15 May 2023 19:09:14 +0200 Subject: [PATCH 49/53] changed location of sessionscreens --- .../java/be/ugent/sel/studeez/screens/session/SessionRoute.kt | 2 +- .../{composables => }/BreakTimerScreenComposable.kt | 2 +- .../{composables => }/CustomTimerSessionScreenComposable.kt | 2 +- .../{composables => }/EndlessTimerSessionScreenComposable.kt | 2 +- .../{composables => }/GetSessionScreenComposable.kt | 2 +- .../sessionScreens/{composables => }/SessionScreenComposable.kt | 2 +- .../session/sessionScreens/{composables => }/TimerComposable.kt | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) rename app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/{composables => }/BreakTimerScreenComposable.kt (96%) rename app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/{composables => }/CustomTimerSessionScreenComposable.kt (93%) rename app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/{composables => }/EndlessTimerSessionScreenComposable.kt (87%) rename app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/{composables => }/GetSessionScreenComposable.kt (96%) rename app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/{composables => }/SessionScreenComposable.kt (96%) rename app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/{composables => }/TimerComposable.kt (97%) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt index 3572b5e..0db1e73 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt @@ -6,7 +6,7 @@ import android.net.Uri import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimer -import be.ugent.sel.studeez.screens.session.sessionScreens.composables.GetSessionScreenComposable +import be.ugent.sel.studeez.screens.session.sessionScreens.GetSessionScreenComposable data class SessionActions( val getTimer: () -> FunctionalTimer, diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakTimerScreenComposable.kt similarity index 96% rename from app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt rename to app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakTimerScreenComposable.kt index cac3509..093c16a 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/BreakTimerScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakTimerScreenComposable.kt @@ -1,4 +1,4 @@ -package be.ugent.sel.studeez.screens.session.sessionScreens.composables +package be.ugent.sel.studeez.screens.session.sessionScreens import androidx.compose.foundation.background import androidx.compose.foundation.layout.* diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/CustomTimerSessionScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/CustomTimerSessionScreenComposable.kt similarity index 93% rename from app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/CustomTimerSessionScreenComposable.kt rename to app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/CustomTimerSessionScreenComposable.kt index ec3c2d8..a0c385c 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/CustomTimerSessionScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/CustomTimerSessionScreenComposable.kt @@ -1,4 +1,4 @@ -package be.ugent.sel.studeez.screens.session.sessionScreens.composables +package be.ugent.sel.studeez.screens.session.sessionScreens import androidx.compose.runtime.Composable import be.ugent.sel.studeez.R diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/EndlessTimerSessionScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/EndlessTimerSessionScreenComposable.kt similarity index 87% rename from app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/EndlessTimerSessionScreenComposable.kt rename to app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/EndlessTimerSessionScreenComposable.kt index b223f52..4f1dbe3 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/EndlessTimerSessionScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/EndlessTimerSessionScreenComposable.kt @@ -1,4 +1,4 @@ -package be.ugent.sel.studeez.screens.session.sessionScreens.composables +package be.ugent.sel.studeez.screens.session.sessionScreens import androidx.compose.runtime.Composable import be.ugent.sel.studeez.R diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/GetSessionScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/GetSessionScreenComposable.kt similarity index 96% rename from app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/GetSessionScreenComposable.kt rename to app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/GetSessionScreenComposable.kt index 3780f42..47ca52e 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/GetSessionScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/GetSessionScreenComposable.kt @@ -1,4 +1,4 @@ -package be.ugent.sel.studeez.screens.session.sessionScreens.composables +package be.ugent.sel.studeez.screens.session.sessionScreens import androidx.compose.runtime.Composable import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalCustomTimer diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/SessionScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/SessionScreenComposable.kt similarity index 96% rename from app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/SessionScreenComposable.kt rename to app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/SessionScreenComposable.kt index 0d02add..c94d2a5 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/SessionScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/SessionScreenComposable.kt @@ -1,4 +1,4 @@ -package be.ugent.sel.studeez.screens.session.sessionScreens.composables +package be.ugent.sel.studeez.screens.session.sessionScreens import androidx.compose.foundation.background import androidx.compose.foundation.border diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/TimerComposable.kt similarity index 97% rename from app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt rename to app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/TimerComposable.kt index cade06f..2a29403 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/composables/TimerComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/TimerComposable.kt @@ -1,4 +1,4 @@ -package be.ugent.sel.studeez.screens.session.sessionScreens.composables +package be.ugent.sel.studeez.screens.session.sessionScreens import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box From 0487347c8f4882c51afa8bf0b6b64552f943c5d0 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 15 May 2023 19:18:47 +0200 Subject: [PATCH 50/53] cleanup sessionroute --- .../studeez/screens/session/InvisibleSessionManager.kt | 10 ++++++++-- .../ugent/sel/studeez/screens/session/SessionRoute.kt | 9 +-------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/InvisibleSessionManager.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/InvisibleSessionManager.kt index 9051fa8..763fb1d 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/InvisibleSessionManager.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/InvisibleSessionManager.kt @@ -1,6 +1,10 @@ package be.ugent.sel.studeez.screens.session +import android.annotation.SuppressLint +import android.content.Context import android.media.MediaPlayer +import android.media.RingtoneManager +import android.net.Uri import kotlinx.coroutines.delay import javax.inject.Singleton import kotlin.time.Duration.Companion.seconds @@ -10,9 +14,11 @@ object InvisibleSessionManager { private var viewModel: SessionViewModel? = null private lateinit var mediaPlayer: MediaPlayer - fun setParameters(viewModel: SessionViewModel, mediaplayer: MediaPlayer) { + fun setParameters(viewModel: SessionViewModel, context: Context) { + val uri: Uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) + this.mediaPlayer = MediaPlayer.create(context, uri) + this.mediaPlayer.isLooping = false this.viewModel = viewModel - this.mediaPlayer = mediaplayer } suspend fun updateTimer() { diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt index 0db1e73..9d1953b 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt @@ -31,15 +31,8 @@ fun SessionRoute( openAndPopUp: (String, String) -> Unit, viewModel: SessionViewModel, ) { - val context = LocalContext.current - val uri: Uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) - val mediaplayer = MediaPlayer.create(context, uri) - mediaplayer.isLooping = false - InvisibleSessionManager.setParameters( - viewModel = viewModel, - mediaplayer = mediaplayer - ) + InvisibleSessionManager.setParameters(viewModel = viewModel, context = LocalContext.current) val soundPlayer = SoundPlayer(LocalContext.current) val sessionActions = getSessionActions(viewModel, openAndPopUp) From 6554a92f837285b43e200e7face8cdbd3e348671 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 15 May 2023 19:20:42 +0200 Subject: [PATCH 51/53] remove imports sessionroute --- .../java/be/ugent/sel/studeez/screens/session/SessionRoute.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt index 9d1953b..aeaf544 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt @@ -1,8 +1,5 @@ package be.ugent.sel.studeez.screens.session -import android.media.MediaPlayer -import android.media.RingtoneManager -import android.net.Uri import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimer From 9ea4f73187835fe465f9c1db5d409e192d7aa65e Mon Sep 17 00:00:00 2001 From: brreynie Date: Mon, 15 May 2023 20:54:47 +0200 Subject: [PATCH 52/53] i18n improvement --- .../screens/session_recap/SessionRecapScreen.kt | 11 ++++++++--- app/src/main/res/values/strings.xml | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) 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 f3a5739..73f4100 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 @@ -16,7 +16,6 @@ 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.sp -import androidx.hilt.navigation.compose.hiltViewModel import be.ugent.sel.studeez.R import be.ugent.sel.studeez.common.composable.BasicButton import be.ugent.sel.studeez.common.composable.ImageBackgroundButton @@ -70,7 +69,7 @@ fun SessionRecapScreen(modifier: Modifier, sessionRecapActions: SessionRecapActi verticalArrangement = Arrangement.SpaceBetween ) { Text( - text = stringResource(R.string.congrats) + hms, + text = stringResource(R.string.congrats, hms), modifier = Modifier .fillMaxWidth(), textAlign = TextAlign.Center, @@ -135,6 +134,12 @@ fun SessionRecapScreen(modifier: Modifier, sessionRecapActions: SessionRecapActi fun SessionRecapScreenPreview() { SessionRecapScreen( modifier = Modifier, - sessionRecapActions = SessionRecapActions(hiltViewModel(), {}, {}) + sessionRecapActions = SessionRecapActions( + { SessionReport( + studyTime = 100, + ) }, + {}, + {}, + ) ) } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index be6b7ef..58e952d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -150,7 +150,7 @@ Number of Repeats - "Congratulations! You studied: " + "Congratulations! You studied: %s" How did it go? Good Bad From 5ddd92a66fd6862b1755eb50fba70c25206ab721 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Mon, 15 May 2023 20:58:37 +0200 Subject: [PATCH 53/53] 'merge' dots --- .../FunctionalPomodoroTimer.kt | 2 +- .../BreakTimerScreenComposable.kt | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) 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 765fbcd..e754963 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 @@ -6,7 +6,7 @@ class FunctionalPomodoroTimer( val repeats: Int ) : FunctionalTimer(studyTime) { - var breaksRemaining = repeats + var breaksRemaining = repeats - 1 var isInBreak = false override fun tick() { diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakTimerScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakTimerScreenComposable.kt index 093c16a..42ec4f7 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakTimerScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakTimerScreenComposable.kt @@ -38,12 +38,18 @@ private fun Dots(pomodoroTimer: FunctionalPomodoroTimer): Int { verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Center, ) { - repeat(pomodoroTimer.repeats - pomodoroTimer.breaksRemaining) { - Dot(color = Color.DarkGray) - } - if (!pomodoroTimer.isInBreak) Dot(Color.Green) else Dot(Color.DarkGray) - repeat(pomodoroTimer.breaksRemaining - 1) { - Dot(color = Color.Gray) + if (pomodoroTimer.hasEnded()) { + repeat(pomodoroTimer.repeats) { + Dot(Color.Green) + } + } else { + repeat(pomodoroTimer.repeats - pomodoroTimer.breaksRemaining - 1) { + Dot(color = Color.DarkGray) + } + if (!pomodoroTimer.isInBreak) Dot(Color.Green) else Dot(Color.DarkGray) + repeat(pomodoroTimer.breaksRemaining) { + Dot(color = Color.Gray) + } } } return pomodoroTimer.breaksRemaining