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 5af35e5be9608b289d8430ec27353589a67d2d08..e39108ce29600a74f267bbf33eca0ed36ff2bb96 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 4a99d53591edb92a549e77939ecd19b82604adb6..5b9a042b7d75a2fabf76e7a0d616a15c71b204b5 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 cad63ea577b336f62629b952f6668ac15b133842..f80b589f139c25a5a4f4c9f0d3811bc119e146aa 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 1a9eb4cd3eb753544367c454dbdc177f2c9f16c3..3c3cd2f0c9b6a16b76f0cdd46feb621e293573e1 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 32fccb915730437caa226c162b27f14acfd248d6..6cf9139837b6ba6c194dcd9128985c4652de5de4 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 bbf7abe775c1afe85f8994a4eba64e519d054a59..bf5f0ba98e89a4ec1d90780dbb2337213e3bb056 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 c1adf45da1f8b75e2e530e7cd7bb86f1d120bf61..1d0e83df047be9ac627d9f6da5b08c377055dadb 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 {