From c859f411e6f798093c3116f8f9abf3bda7602008 Mon Sep 17 00:00:00 2001 From: Kolya Opahle <k.opahle@sap.com> Date: Thu, 8 Apr 2021 16:38:35 +0200 Subject: [PATCH] Event Registration: Restrict check-in time (EXPOSUREAPP-6177) (#2774) Fixed an issue with EditCheckInFragment where opening and closing the timepicker would enable the button Co-authored-by: Mohamed <mohamed.metwalli@sap.com> Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com> --- .../attendee/edit/EditCheckInFragment.kt | 4 +++- .../attendee/edit/EditCheckInViewModel.kt | 23 +++++++++++++------ .../res/layout/fragment_edit_check_in.xml | 12 +++++++++- .../values-de/event_registration_strings.xml | 2 ++ .../res/values/event_registration_strings.xml | 2 ++ 5 files changed, 34 insertions(+), 9 deletions(-) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/edit/EditCheckInFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/edit/EditCheckInFragment.kt index 0e822c842..a4213b87a 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/edit/EditCheckInFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/edit/EditCheckInFragment.kt @@ -94,7 +94,9 @@ class EditCheckInFragment : Fragment(R.layout.fragment_edit_check_in), AutoInjec editCheckinDurationEditHintCard.isGone = !uiState.diaryWarningVisible - editCheckinConfirmButton.isEnabled = uiState.canSaveChanges + editCheckinConfirmButton.isEnabled = uiState.saveButtonEnabled + + editCheckinWrongInputWarning.isGone = !uiState.wrongInputErrorShown } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/edit/EditCheckInViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/edit/EditCheckInViewModel.kt index a266e7e6d..7cfc15b89 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/edit/EditCheckInViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/edit/EditCheckInViewModel.kt @@ -14,6 +14,7 @@ import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.filterNotNull +import org.joda.time.Days import org.joda.time.Instant import org.joda.time.LocalDate import org.joda.time.LocalTime @@ -33,10 +34,10 @@ class EditCheckInViewModel @AssistedInject constructor( val checkIn = checkInRepository.checkInForId(editCheckInId ?: 0) if (checkInStartTime.value == null) { - checkInStartTime.value = checkIn.checkInStart + checkInStartTime.value = checkIn.checkInStart.toDateTime().toInstant() } if (checkInEndTime.value == null) { - checkInEndTime.value = checkIn.checkInEnd + checkInEndTime.value = checkIn.checkInEnd.toDateTime().toInstant() } checkInFlow.value = checkIn @@ -50,13 +51,13 @@ class EditCheckInViewModel @AssistedInject constructor( val uiState = combine( checkInFlow.filterNotNull(), - checkInStartTime, - checkInEndTime + checkInStartTime.filterNotNull(), + checkInEndTime.filterNotNull() ) { checkIn, checkInStartTime, checkInEndTime -> UiState( checkIn = checkIn, - checkInStartInstant = checkInStartTime ?: checkIn.checkInStart, - checkInEndInstant = checkInEndTime ?: checkIn.checkInEnd + checkInStartInstant = checkInStartTime, + checkInEndInstant = checkInEndTime ) }.asLiveData() @@ -144,7 +145,15 @@ class EditCheckInViewModel @AssistedInject constructor( val checkInStartTime: String get() = checkInStartInstant.toDateTime().toString(timeFormatter) val checkInEndDate: String get() = checkInEndInstant.toDateTime().toString(dateFormatter) val checkInEndTime: String get() = checkInEndInstant.toDateTime().toString(timeFormatter) - val canSaveChanges: Boolean get() = checkInStartInstant.isBefore(checkInEndInstant) + val saveButtonEnabled: Boolean get() = isInputValid() + val wrongInputErrorShown: Boolean get() = !saveButtonEnabled + + private fun isInputValid(): Boolean { + val startBeforeEnd = checkInStartInstant.isBefore(checkInEndInstant) + val lessThan24h = Days.daysBetween(checkInStartInstant, checkInEndInstant).days < 1 + + return startBeforeEnd and lessThan24h + } } sealed class DateTimePickerEvent { diff --git a/Corona-Warn-App/src/main/res/layout/fragment_edit_check_in.xml b/Corona-Warn-App/src/main/res/layout/fragment_edit_check_in.xml index 89f49d4ca..c81751a1d 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_edit_check_in.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_edit_check_in.xml @@ -223,7 +223,6 @@ style="@style/Card.NoElevation" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="24dp" android:layout_marginHorizontal="@dimen/spacing_normal" android:layout_marginTop="@dimen/spacing_tiny"> @@ -234,6 +233,17 @@ android:text="@string/edit_checkin_duration_edit_hint_card_text" /> </LinearLayout> + <TextView + android:id="@+id/edit_checkin_wrong_input_warning" + style="@style/body2" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginHorizontal="@dimen/spacing_normal" + android:layout_marginTop="@dimen/spacing_tiny" + android:text="@string/edit_checkin_wrong_input_warning_text" + android:textColor="@color/colorTextSemanticRed" + android:visibility="gone" /> + </LinearLayout> </androidx.core.widget.NestedScrollView> diff --git a/Corona-Warn-App/src/main/res/values-de/event_registration_strings.xml b/Corona-Warn-App/src/main/res/values-de/event_registration_strings.xml index cab372316..813647b6a 100644 --- a/Corona-Warn-App/src/main/res/values-de/event_registration_strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/event_registration_strings.xml @@ -238,6 +238,8 @@ <string name="edit_checkin_edit_card_checkin_time_label">"Eingecheckt"</string> <!-- XTXT: Checkin Edit: hint for unchanged contact diary checkin duration --> <string name="edit_checkin_duration_edit_hint_card_text">"Die Aufenthaltsdauer wird nicht automatisch in Ihrem Kontakt-Tagebuch angepasst."</string> + <!-- XTXT: Checkin Edit: warning if user input is incorrect --> + <string name="edit_checkin_wrong_input_warning_text">"Sie können für maximal 24 Stunden eingecheckt sein und die Auscheck-Zeit muss nach der Eincheck-Zeit liegen."</string> <!-- XBUT: Checkin Edit: Save Button --> <string name="edit_checkin_confirm_button_text">"Speichern"</string> diff --git a/Corona-Warn-App/src/main/res/values/event_registration_strings.xml b/Corona-Warn-App/src/main/res/values/event_registration_strings.xml index b748e76ea..f6a1f713c 100644 --- a/Corona-Warn-App/src/main/res/values/event_registration_strings.xml +++ b/Corona-Warn-App/src/main/res/values/event_registration_strings.xml @@ -239,6 +239,8 @@ <string name="edit_checkin_edit_card_checkin_time_label">"Eingecheckt"</string> <!-- XTXT: Checkin Edit: hint for unchanged contact diary checkin duration --> <string name="edit_checkin_duration_edit_hint_card_text">"Die Aufenthaltsdauer wird nicht automatisch in Ihrem Kontakt-Tagebuch angepasst."</string> + <!-- XTXT: Checkin Edit: warning if user input is incorrect --> + <string name="edit_checkin_wrong_input_warning_text">"Sie können für maximal 24 Stunden eingecheckt sein und die Auscheck-Zeit muss nach der Eincheck-Zeit liegen."</string> <!-- XBUT: Checkin Edit: Save Button --> <string name="edit_checkin_confirm_button_text">"Speichern"</string> -- GitLab