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