From ba1eefb33e48e2738298d0cbcb4d4c99b560bd4f Mon Sep 17 00:00:00 2001
From: Juraj Kusnier <jurajkusnier@users.noreply.github.com>
Date: Tue, 13 Apr 2021 15:54:39 +0200
Subject: [PATCH] Event Creation - Self check-in flow (EXPOSUREAPP-6299)
 (#2812)

* Update self-check-in flow

* Update unit test

Co-authored-by: Mohamed <mohamed.metwalli@sap.com>
---
 .../attendee/checkins/CheckInEvent.kt             |  2 ++
 .../attendee/checkins/CheckInsFragment.kt         | 13 ++++++++++---
 .../attendee/checkins/CheckInsViewModel.kt        | 11 +++++++++--
 .../onboarding/CheckInOnboardingFragment.kt       |  7 ++++++-
 .../organizer/list/TraceLocationsFragment.kt      |  2 +-
 .../trace_location_attendee_nav_graph.xml         | 15 ++++++++++++++-
 .../attendee/checkins/CheckInsViewModelTest.kt    |  3 ++-
 7 files changed, 44 insertions(+), 9 deletions(-)

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/checkins/CheckInEvent.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/checkins/CheckInEvent.kt
index 5af35e5be..e39108ce2 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/checkins/CheckInEvent.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/checkins/CheckInEvent.kt
@@ -11,6 +11,8 @@ sealed class CheckInEvent {
 
     data class ConfirmCheckIn(val verifiedTraceLocation: VerifiedTraceLocation) : CheckInEvent()
 
+    data class ConfirmCheckInWithoutHistory(val verifiedTraceLocation: VerifiedTraceLocation) : CheckInEvent()
+
     data class EditCheckIn(val checkInId: Long, val position: Int) : CheckInEvent()
 
     data class ConfirmSwipeItem(val checkIn: CheckIn, val position: Int) : CheckInEvent()
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/checkins/CheckInsFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/checkins/CheckInsFragment.kt
index 4a99d5359..5b9a042b7 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/checkins/CheckInsFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/checkins/CheckInsFragment.kt
@@ -53,7 +53,8 @@ class CheckInsFragment : Fragment(R.layout.trace_location_attendee_checkins_frag
             factory as CheckInsViewModel.Factory
             factory.create(
                 savedState = savedState,
-                deepLink = navArgs.uri
+                deepLink = navArgs.uri,
+                cleanHistory = navArgs.cleanHistory
             )
         }
     )
@@ -97,6 +98,12 @@ class CheckInsFragment : Fragment(R.layout.trace_location_attendee_checkins_frag
                 )
             }
 
+            is CheckInEvent.ConfirmCheckInWithoutHistory -> doNavigate(
+                CheckInsFragmentDirections.actionCheckInsFragmentToConfirmCheckInFragmentCleanHistory(
+                    verifiedTraceLocation = event.verifiedTraceLocation
+                )
+            )
+
             is CheckInEvent.ConfirmSwipeItem -> showRemovalConfirmation(event.checkIn, event.position)
 
             is CheckInEvent.ConfirmRemoveItem -> showRemovalConfirmation(event.checkIn, null)
@@ -232,14 +239,14 @@ class CheckInsFragment : Fragment(R.layout.trace_location_attendee_checkins_frag
     }
 
     companion object {
-        fun createCheckInUri(rootUri: String): Uri {
+        fun createCheckInUri(rootUri: String, cleanHistory: Boolean = false): Uri {
             val encodedUrl = try {
                 URLEncoder.encode(rootUri, Charsets.UTF_8.name())
             } catch (e: Exception) {
                 Timber.d(e, "URL Encoding failed url($rootUri)")
                 rootUri // Pass original
             }
-            return "coronawarnapp://check-ins/$encodedUrl".toUri()
+            return "coronawarnapp://check-ins/$encodedUrl/?cleanHistory=$cleanHistory".toUri()
         }
     }
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/checkins/CheckInsViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/checkins/CheckInsViewModel.kt
index cad63ea57..f80b589f1 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/checkins/CheckInsViewModel.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/checkins/CheckInsViewModel.kt
@@ -31,6 +31,7 @@ import timber.log.Timber
 class CheckInsViewModel @AssistedInject constructor(
     @Assisted private val savedState: SavedStateHandle,
     @Assisted private val deepLink: String?,
+    @Assisted private val cleanHistory: Boolean,
     dispatcherProvider: DispatcherProvider,
     @AppScope private val appScope: CoroutineScope,
     private val qrCodeUriParser: QRCodeUriParser,
@@ -143,7 +144,12 @@ class CheckInsViewModel @AssistedInject constructor(
             Timber.i("uri: $uri")
             val qrCodePayload = qrCodeUriParser.getQrCodePayload(uri)
             val verifiedTraceLocation = VerifiedTraceLocation(qrCodePayload)
-            events.postValue(CheckInEvent.ConfirmCheckIn(verifiedTraceLocation))
+            events.postValue(
+                if (cleanHistory)
+                    CheckInEvent.ConfirmCheckInWithoutHistory(verifiedTraceLocation)
+                else
+                    CheckInEvent.ConfirmCheckIn(verifiedTraceLocation)
+            )
         } catch (e: Exception) {
             Timber.d(e, "TraceLocation verification failed")
             e.report(ExceptionCategory.INTERNAL)
@@ -162,7 +168,8 @@ class CheckInsViewModel @AssistedInject constructor(
     interface Factory : CWAViewModelFactory<CheckInsViewModel> {
         fun create(
             savedState: SavedStateHandle,
-            deepLink: String?
+            deepLink: String?,
+            cleanHistory: Boolean
         ): CheckInsViewModel
     }
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/onboarding/CheckInOnboardingFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/onboarding/CheckInOnboardingFragment.kt
index 1a9eb4cd3..3c3cd2f0c 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/onboarding/CheckInOnboardingFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/onboarding/CheckInOnboardingFragment.kt
@@ -36,7 +36,12 @@ class CheckInOnboardingFragment : Fragment(R.layout.fragment_trace_location_onbo
         super.onViewCreated(view, savedInstanceState)
 
         if (viewModel.isOnboardingComplete && args.uri != null) {
-            doNavigate(CheckInOnboardingFragmentDirections.actionCheckInOnboardingFragmentToCheckInsFragment(args.uri))
+            doNavigate(
+                CheckInOnboardingFragmentDirections.actionCheckInOnboardingFragmentToCheckInsFragment(
+                    args.uri,
+                    args.cleanHistory
+                )
+            )
         }
 
         with(binding) {
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/organizer/list/TraceLocationsFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/organizer/list/TraceLocationsFragment.kt
index 32fccb915..6cf913983 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/organizer/list/TraceLocationsFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/organizer/list/TraceLocationsFragment.kt
@@ -116,7 +116,7 @@ class TraceLocationsFragment : Fragment(R.layout.trace_location_organizer_trace_
 
                 is TraceLocationEvent.SelfCheckIn -> {
                     findNavController().navigate(
-                        CheckInsFragment.createCheckInUri(it.traceLocation.locationUrl),
+                        CheckInsFragment.createCheckInUri(it.traceLocation.locationUrl, true),
                         NavOptions.Builder()
                             .setPopUpTo(R.id.checkInsFragment, true)
                             .build()
diff --git a/Corona-Warn-App/src/main/res/navigation/trace_location_attendee_nav_graph.xml b/Corona-Warn-App/src/main/res/navigation/trace_location_attendee_nav_graph.xml
index bbf7abe77..bf5f0ba98 100644
--- a/Corona-Warn-App/src/main/res/navigation/trace_location_attendee_nav_graph.xml
+++ b/Corona-Warn-App/src/main/res/navigation/trace_location_attendee_nav_graph.xml
@@ -9,7 +9,7 @@
         android:name="de.rki.coronawarnapp.ui.eventregistration.attendee.onboarding.CheckInOnboardingFragment"
         android:label="CheckInOnboardingFragment"
         tools:layout="@layout/fragment_trace_location_onboarding">
-        <deepLink app:uri="coronawarnapp://check-ins/{uri}" />
+        <deepLink app:uri="coronawarnapp://check-ins/{uri}/?cleanHistory={cleanHistory}" />
         <action
             android:id="@+id/action_checkInOnboardingFragment_to_checkInsFragment"
             app:destination="@id/checkInsFragment"
@@ -22,6 +22,10 @@
             android:name="showBottomNav"
             android:defaultValue="true"
             app:argType="boolean" />
+        <argument
+            android:name="cleanHistory"
+            android:defaultValue="false"
+            app:argType="boolean" />
         <argument
             android:name="uri"
             android:defaultValue="@null"
@@ -68,11 +72,20 @@
         <action
             android:id="@+id/action_checkInsFragment_to_confirmCheckInFragment"
             app:destination="@id/confirmCheckInFragment" />
+        <action
+            android:id="@+id/action_checkInsFragment_to_confirmCheckInFragment_cleanHistory"
+            app:popUpTo="@id/checkInsFragment"
+            app:popUpToInclusive="true"
+            app:destination="@id/confirmCheckInFragment" />
         <argument
             android:name="uri"
             android:defaultValue="@null"
             app:argType="string"
             app:nullable="true" />
+        <argument
+            android:name="cleanHistory"
+            android:defaultValue="false"
+            app:argType="boolean" />
         <action
             android:id="@+id/action_checkInsFragment_to_editCheckInFragment"
             app:destination="@id/editCheckInFragment" />
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/eventregistration/attendee/checkins/CheckInsViewModelTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/eventregistration/attendee/checkins/CheckInsViewModelTest.kt
index c1adf45da..1d0e83df0 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/eventregistration/attendee/checkins/CheckInsViewModelTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/eventregistration/attendee/checkins/CheckInsViewModelTest.kt
@@ -185,7 +185,8 @@ class CheckInsViewModelTest : BaseTest() {
             qrCodeUriParser = qrCodeUriParser,
             checkInsRepository = checkInsRepository,
             checkOutHandler = checkOutHandler,
-            cameraPermissionProvider = cameraPermissionProvider
+            cameraPermissionProvider = cameraPermissionProvider,
+            cleanHistory = false
         )
 
     companion object {
-- 
GitLab