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/17] 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/17] #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/17] #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/17] #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/17] 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 d6496cb8ad33c611df326480f15ed1f31094a157 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Wed, 10 May 2023 12:44:51 +0200 Subject: [PATCH 06/17] 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 07/17] 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 a328d2194f2fd62d4da27d9933050fd6a8ba6e51 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Sat, 13 May 2023 15:36:04 +0200 Subject: [PATCH 08/17] 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 e8f2d71df3fb3c119ee30989fa8a5ce79ea8e2f2 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Sat, 13 May 2023 17:25:51 +0200 Subject: [PATCH 09/17] 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 10/17] 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 2971ae85aa59b404cb313542c918c7693fc9203d Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Sat, 13 May 2023 17:27:13 +0200 Subject: [PATCH 11/17] 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 12/17] 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 13/17] 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 14/17] 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 15/17] 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 16/17] 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 17/17] 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