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 0e822c842aca62574fad8ef7c5078b89262a2f97..a4213b87a71013a0975aa97cff48e1474479b7e6 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 a266e7e6d8ab74f5f64edcefa1e50e96e7963c4b..7cfc15b894c9aeb71ae03e455d3deed3ebb896f6 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 89f49d4ca8894f916057eb240bc49c8f5f93f857..c81751a1d61be0f975de25004fc941fcc2f3bb90 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 cab3723167e097ae414c81b2b58c9eed310ddff1..813647b6add831d706867c47231f9c3d781fd1fc 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 b748e76ead86b6fc283427c1629e237575db530e..f6a1f713c447a0c92f0d0f47e258d5db064d6aac 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>