From 21f37b3a65b29ffff50f8e1b2f519c9cded2eb1f Mon Sep 17 00:00:00 2001
From: Lukas Lechner <lukas.lechner@sap.com>
Date: Thu, 8 Apr 2021 17:03:47 +0200
Subject: [PATCH] Only use check-ins of last 15 days (EXPOSUREAPP-5910) (#2752)

* Only use check-ins of last 15 days

* Refactor TraceLocation Retention

* Fix SubmissionTaskTest.kt

* Fix MainActivityViewModelTest.kt

* Address PR feedback

* Add CheckInRetentionTest.kt and TraceLocationRetentionTest.kt

* Add some comments

* Add more comments

* Fix tests

* Load checkInsWithinRetention instead of allCheckIns in ContactDiary, PresenceTracingWarningTask.kt and TraceWarningPackageSyncTool.kt

Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com>
Co-authored-by: Mohamed <mohamed.metwalli@sap.com>
---
 .../overview/ContactDiaryOverviewViewModel.kt |  4 +-
 .../checkins/CheckInRepository.kt             | 21 +++++-
 .../checkins/CheckInRetention.kt              | 21 ++++++
 .../repo/DefaultTraceLocationRepository.kt    | 24 +++++-
 .../storage/repo/TraceLocationRepository.kt   | 13 ++++
 .../storage/retention/CheckInCleaner.kt       | 18 ++---
 .../storage/retention/TraceLocationCleaner.kt | 15 ++--
 .../retention/TraceLocationRetention.kt       | 27 +++++++
 .../execution/PresenceTracingWarningTask.kt   |  2 +-
 .../download/TraceWarningPackageSyncTool.kt   |  2 +-
 .../submission/task/SubmissionTask.kt         |  2 +-
 .../attendee/checkins/CheckInsViewModel.kt    |  2 +-
 .../organizer/list/TraceLocationsViewModel.kt |  8 +-
 .../ui/main/MainActivityViewModel.kt          |  2 +-
 .../ContactDiaryOverviewViewModelTest.kt      | 12 +--
 .../checkins/CheckInRepositoryTest.kt         | 47 +++++++++++-
 .../checkins/CheckInRetentionTest.kt          | 44 +++++++++++
 .../DefaultTraceLocationRepositoryTest.kt     | 74 +++++++++++++++++++
 .../retention/TraceLocationRetentionTest.kt   | 46 ++++++++++++
 .../main/MainActivityViewModelTest.kt         |  2 +-
 .../PresenceTracingWarningTaskTest.kt         | 12 +--
 .../submission/task/SubmissionTaskTest.kt     |  4 +-
 .../checkins/CheckInsViewModelTest.kt         |  6 +-
 23 files changed, 353 insertions(+), 55 deletions(-)
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRetention.kt
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/retention/TraceLocationRetention.kt
 create mode 100644 Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRetentionTest.kt
 create mode 100644 Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/repo/DefaultTraceLocationRepositoryTest.kt
 create mode 100644 Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/retention/TraceLocationRetentionTest.kt

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewViewModel.kt
index bb81b5205..09ca3ef2e 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewViewModel.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewViewModel.kt
@@ -60,7 +60,7 @@ class ContactDiaryOverviewViewModel @AssistedInject constructor(
 
     private val riskLevelPerDateFlow = riskLevelStorage.ewDayRiskStates
     private val traceLocationCheckInRiskFlow = riskLevelStorage.traceLocationCheckInRiskStates
-    private val allCheckInsFlow = checkInRepository.allCheckIns
+    private val checkInsWithinRetentionFlow = checkInRepository.checkInsWithinRetention
 
     val listItems = combine(
         flowOf(dates),
@@ -68,7 +68,7 @@ class ContactDiaryOverviewViewModel @AssistedInject constructor(
         personEncountersFlow,
         riskLevelPerDateFlow,
         traceLocationCheckInRiskFlow,
-        allCheckInsFlow
+        checkInsWithinRetentionFlow
     ) { dateList, locationVisists, personEncounters, riskLevelPerDateList, traceLocationCheckInRiskList, checkInList ->
         mutableListOf<DiaryOverviewItem>().apply {
             add(OverviewSubHeaderItem)
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRepository.kt
index 3420d4832..dbac99970 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRepository.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRepository.kt
@@ -3,6 +3,7 @@ package de.rki.coronawarnapp.eventregistration.checkins
 import de.rki.coronawarnapp.eventregistration.storage.TraceLocationDatabase
 import de.rki.coronawarnapp.eventregistration.storage.dao.CheckInDao
 import de.rki.coronawarnapp.eventregistration.storage.entity.toCheckIn
+import de.rki.coronawarnapp.util.TimeStamper
 import kotlinx.coroutines.NonCancellable
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.map
@@ -13,7 +14,8 @@ import javax.inject.Singleton
 
 @Singleton
 class CheckInRepository @Inject constructor(
-    traceLocationDatabaseFactory: TraceLocationDatabase.Factory
+    traceLocationDatabaseFactory: TraceLocationDatabase.Factory,
+    private val timeStamper: TimeStamper
 ) {
 
     private val traceLocationDatabase: TraceLocationDatabase by lazy {
@@ -24,10 +26,27 @@ class CheckInRepository @Inject constructor(
         traceLocationDatabase.eventCheckInDao()
     }
 
+    /**
+     * Returns all stored check-ins
+     *
+     * Attention: this could also include check-ins that are older than
+     * the retention period. Therefore, you should probably use [checkInsWithinRetention]
+     */
     val allCheckIns: Flow<List<CheckIn>> = checkInDao
         .allEntries()
         .map { list -> list.map { it.toCheckIn() } }
 
+    /**
+     * Returns check-ins that are within the retention period. Even though we have a worker that deletes all stale
+     * check-ins it's still possible to have stale check-ins in the database because the worker only runs once a day.
+     */
+    val checkInsWithinRetention: Flow<List<CheckIn>> = allCheckIns.map { checkInList ->
+        val now = timeStamper.nowUTC
+        checkInList.filter { checkIn ->
+            checkIn.isWithinRetention(now)
+        }
+    }
+
     suspend fun getCheckInById(checkInId: Long): CheckIn? {
         Timber.d("getCheckInById(checkInId=$checkInId)")
         return checkInDao.entryForId(checkInId)?.toCheckIn()
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRetention.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRetention.kt
new file mode 100644
index 000000000..875612a2a
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRetention.kt
@@ -0,0 +1,21 @@
+package de.rki.coronawarnapp.eventregistration.checkins
+
+import de.rki.coronawarnapp.util.TimeAndDateExtensions.seconds
+import org.joda.time.Instant
+import java.util.concurrent.TimeUnit
+
+private const val CHECK_IN_RETENTION_DAYS = 15
+private val CHECK_IN_RETENTION_SECONDS = TimeUnit.DAYS.toSeconds(CHECK_IN_RETENTION_DAYS.toLong())
+
+/**
+ * returns true if the end date of the check-in isn't older than [CHECK_IN_RETENTION_DAYS], otherwise false
+ */
+fun CheckIn.isWithinRetention(now: Instant): Boolean {
+    val retentionThreshold = (now.seconds - CHECK_IN_RETENTION_SECONDS)
+    return checkInEnd.seconds >= retentionThreshold
+}
+
+/**
+ * Returns true if a check-in is stale and therefore can be deleted, otherwise false
+ */
+fun CheckIn.isOutOfRetention(now: Instant) = !isWithinRetention(now)
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/repo/DefaultTraceLocationRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/repo/DefaultTraceLocationRepository.kt
index 46a93d873..56463d80c 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/repo/DefaultTraceLocationRepository.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/repo/DefaultTraceLocationRepository.kt
@@ -6,6 +6,8 @@ import de.rki.coronawarnapp.eventregistration.checkins.qrcode.toTraceLocations
 import de.rki.coronawarnapp.eventregistration.storage.TraceLocationDatabase
 import de.rki.coronawarnapp.eventregistration.storage.dao.TraceLocationDao
 import de.rki.coronawarnapp.eventregistration.storage.entity.toTraceLocationEntity
+import de.rki.coronawarnapp.eventregistration.storage.retention.isWithinRetention
+import de.rki.coronawarnapp.util.TimeStamper
 import de.rki.coronawarnapp.util.coroutine.AppScope
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.Flow
@@ -18,7 +20,8 @@ import javax.inject.Singleton
 @Singleton
 class DefaultTraceLocationRepository @Inject constructor(
     traceLocationDatabaseFactory: TraceLocationDatabase.Factory,
-    @AppScope private val appScope: CoroutineScope
+    @AppScope private val appScope: CoroutineScope,
+    private val timeStamper: TimeStamper
 ) : TraceLocationRepository {
 
     private val traceLocationDatabase: TraceLocationDatabase by lazy {
@@ -36,9 +39,28 @@ class DefaultTraceLocationRepository @Inject constructor(
         return checkIn.toTraceLocation()
     }
 
+    /**
+     * Returns all stored trace locations
+     *
+     * Attention: this could also include trace locations that are older than
+     * the retention period. Therefore, you should probably use [traceLocationsWithinRetention]
+     */
     override val allTraceLocations: Flow<List<TraceLocation>>
         get() = traceLocationDao.allEntries().map { it.toTraceLocations() }
 
+    /**
+     * Returns trace locations that are within the retention period. Even though we have a worker that deletes all stale
+     * trace locations it's still possible to have stale trace-locations in the database because the worker only runs
+     * once a day.
+     */
+    override val traceLocationsWithinRetention: Flow<List<TraceLocation>>
+        get() = allTraceLocations.map { traceLocationList ->
+            val now = timeStamper.nowUTC
+            traceLocationList.filter { traceLocation ->
+                traceLocation.isWithinRetention(now)
+            }
+        }
+
     override suspend fun addTraceLocation(traceLocation: TraceLocation): TraceLocation {
         Timber.d("Add trace location: %s", traceLocation)
         val traceLocationEntity = traceLocation.toTraceLocationEntity()
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/repo/TraceLocationRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/repo/TraceLocationRepository.kt
index 8baafc528..df566a3cc 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/repo/TraceLocationRepository.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/repo/TraceLocationRepository.kt
@@ -5,8 +5,21 @@ import kotlinx.coroutines.flow.Flow
 
 interface TraceLocationRepository {
 
+    /**
+     * Returns all stored trace locations
+     *
+     * Attention: this could also include trace locations that are older than
+     * the retention period. Therefore, you should probably use [traceLocationsWithinRetention]
+     */
     val allTraceLocations: Flow<List<TraceLocation>>
 
+    /**
+     * Returns trace locations that are within the retention period. Even though we have a worker that deletes all stale
+     * trace locations it's still possible to have stale trace-locations in the database because the worker only runs
+     * once a day.
+     */
+    val traceLocationsWithinRetention: Flow<List<TraceLocation>>
+
     suspend fun traceLocationForId(id: Long): TraceLocation
 
     suspend fun addTraceLocation(traceLocation: TraceLocation): TraceLocation
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/retention/CheckInCleaner.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/retention/CheckInCleaner.kt
index b40efe488..af5e3f80a 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/retention/CheckInCleaner.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/retention/CheckInCleaner.kt
@@ -2,11 +2,10 @@ package de.rki.coronawarnapp.eventregistration.storage.retention
 
 import dagger.Reusable
 import de.rki.coronawarnapp.eventregistration.checkins.CheckInRepository
-import de.rki.coronawarnapp.util.TimeAndDateExtensions.seconds
+import de.rki.coronawarnapp.eventregistration.checkins.isOutOfRetention
 import de.rki.coronawarnapp.util.TimeStamper
 import kotlinx.coroutines.flow.first
 import timber.log.Timber
-import java.util.concurrent.TimeUnit
 import javax.inject.Inject
 
 @Reusable
@@ -17,18 +16,15 @@ class CheckInCleaner @Inject constructor(
 
     suspend fun cleanUp() {
         Timber.d("Starting to clean up stale check-ins.")
-        val retentionThreshold = (timeStamper.nowUTC.seconds - RETENTION_SECONDS)
+
+        val now = timeStamper.nowUTC
         val checkInsToDelete = checkInRepository.allCheckIns.first()
-            .filter {
-                it.checkInEnd.seconds < retentionThreshold
-            }
+            .filter { checkIn -> checkIn.isOutOfRetention(now) }
+
         Timber.d("Cleaning up ${checkInsToDelete.size} stale check-ins.")
+
         checkInRepository.deleteCheckIns(checkInsToDelete)
-        Timber.d("Clean up of stale check-ins completed.")
-    }
 
-    companion object {
-        private const val RETENTION_DAYS = 15
-        private val RETENTION_SECONDS = TimeUnit.DAYS.toSeconds(RETENTION_DAYS.toLong())
+        Timber.d("Clean up of stale check-ins completed.")
     }
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/retention/TraceLocationCleaner.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/retention/TraceLocationCleaner.kt
index 6f73ddbf7..69fac1678 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/retention/TraceLocationCleaner.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/retention/TraceLocationCleaner.kt
@@ -2,11 +2,9 @@ package de.rki.coronawarnapp.eventregistration.storage.retention
 
 import dagger.Reusable
 import de.rki.coronawarnapp.eventregistration.storage.repo.TraceLocationRepository
-import de.rki.coronawarnapp.util.TimeAndDateExtensions.seconds
 import de.rki.coronawarnapp.util.TimeStamper
 import kotlinx.coroutines.flow.first
 import timber.log.Timber
-import java.util.concurrent.TimeUnit
 import javax.inject.Inject
 
 @Reusable
@@ -17,19 +15,16 @@ class TraceLocationCleaner @Inject constructor(
 
     suspend fun cleanUp() {
         Timber.d("Starting to clean up stale trace locations.")
-        val retentionThreshold = (timeStamper.nowUTC.seconds - RETENTION_SECONDS)
+
+        val now = timeStamper.nowUTC
         traceLocationRepository.allTraceLocations.first()
-            .filter {
-                it.endDate != null && it.endDate.seconds < retentionThreshold
+            .filter { traceLocation ->
+                traceLocation.isOutOfRetention(now)
             }.forEach {
                 Timber.d("Cleaning up stale trace location: %s", it)
                 traceLocationRepository.deleteTraceLocation(it)
             }
-        Timber.d("Clean up of stale trace locations completed.")
-    }
 
-    companion object {
-        private const val RETENTION_DAYS = 15
-        private val RETENTION_SECONDS = TimeUnit.DAYS.toSeconds(RETENTION_DAYS.toLong())
+        Timber.d("Clean up of stale trace locations completed.")
     }
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/retention/TraceLocationRetention.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/retention/TraceLocationRetention.kt
new file mode 100644
index 000000000..b1c854e7f
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/retention/TraceLocationRetention.kt
@@ -0,0 +1,27 @@
+package de.rki.coronawarnapp.eventregistration.storage.retention
+
+import de.rki.coronawarnapp.eventregistration.checkins.qrcode.TraceLocation
+import de.rki.coronawarnapp.util.TimeAndDateExtensions.seconds
+import org.joda.time.Instant
+import java.util.concurrent.TimeUnit
+
+private const val TRACE_LOCATION_RETENTION_DAYS = 15
+private val TRACE_LOCATION_RETENTION_SECONDS = TimeUnit.DAYS.toSeconds(TRACE_LOCATION_RETENTION_DAYS.toLong())
+
+/**
+ * returns true if a trace location either has no end date or has an end date that isn't older than
+ * [TRACE_LOCATION_RETENTION_DAYS], otherwise false
+ */
+fun TraceLocation.isWithinRetention(now: Instant): Boolean {
+    val retentionThreshold = (now.seconds - TRACE_LOCATION_RETENTION_SECONDS)
+    return if (endDate == null) {
+        true
+    } else {
+        endDate.seconds >= retentionThreshold
+    }
+}
+
+/**
+ * Returns true if a trace location is stale and therefore can be deleted, otherwise false
+ */
+fun TraceLocation.isOutOfRetention(now: Instant) = !isWithinRetention(now)
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/presencetracing/risk/execution/PresenceTracingWarningTask.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/presencetracing/risk/execution/PresenceTracingWarningTask.kt
index e0d9556af..09faec492 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/presencetracing/risk/execution/PresenceTracingWarningTask.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/presencetracing/risk/execution/PresenceTracingWarningTask.kt
@@ -67,7 +67,7 @@ class PresenceTracingWarningTask @Inject constructor(
 
         presenceTracingRiskRepository.deleteStaleData()
 
-        val checkIns = checkInsRepository.allCheckIns.firstOrNull() ?: emptyList()
+        val checkIns = checkInsRepository.checkInsWithinRetention.firstOrNull() ?: emptyList()
         Timber.tag(TAG).d("There are %d check-ins to match against.", checkIns.size)
 
         if (checkIns.isEmpty()) {
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/presencetracing/warning/download/TraceWarningPackageSyncTool.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/presencetracing/warning/download/TraceWarningPackageSyncTool.kt
index ea2d87f22..886b885ea 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/presencetracing/warning/download/TraceWarningPackageSyncTool.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/presencetracing/warning/download/TraceWarningPackageSyncTool.kt
@@ -41,7 +41,7 @@ class TraceWarningPackageSyncTool @Inject constructor(
     internal suspend fun syncPackagesForLocation(location: LocationCode): SyncResult {
         Timber.tag(TAG).d("syncTraceWarningPackages(location=%s)", location)
 
-        val oldestCheckIn = checkInRepository.allCheckIns.first().minByOrNull { it.checkInStart }.also {
+        val oldestCheckIn = checkInRepository.checkInsWithinRetention.first().minByOrNull { it.checkInStart }.also {
             Timber.tag(TAG).d("Our oldest check-in is %s", it)
         }
 
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/submission/task/SubmissionTask.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/submission/task/SubmissionTask.kt
index b8f72f9de..4613a92bc 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/submission/task/SubmissionTask.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/submission/task/SubmissionTask.kt
@@ -142,7 +142,7 @@ class SubmissionTask @Inject constructor(
         )
         Timber.tag(TAG).d("Transformed keys with symptoms %s from %s to %s", symptoms, keys, transformedKeys)
 
-        val checkIns = checkInsRepository.allCheckIns.first()
+        val checkIns = checkInsRepository.checkInsWithinRetention.first()
         val transformedCheckIns = checkInsTransformer.transform(checkIns, symptoms)
 
         Timber.tag(TAG).d("Transformed CheckIns from: %s to: %s", checkIns, transformedCheckIns)
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 91ebb6441..ccd616166 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
@@ -56,7 +56,7 @@ class CheckInsViewModel @AssistedInject constructor(
 
     val checkins: LiveData<List<CheckInsItem>> = combine(
         intervalFlow(1000),
-        checkInsRepository.allCheckIns,
+        checkInsRepository.checkInsWithinRetention,
         cameraPermissionProvider.deniedPermanently
     ) { _, checkIns, denied ->
         mutableListOf<CheckInsItem>().apply {
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/organizer/list/TraceLocationsViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/organizer/list/TraceLocationsViewModel.kt
index dbbb8ad2d..e00d80c9b 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/organizer/list/TraceLocationsViewModel.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/organizer/list/TraceLocationsViewModel.kt
@@ -9,7 +9,6 @@ import de.rki.coronawarnapp.eventregistration.checkins.qrcode.TraceLocation
 import de.rki.coronawarnapp.eventregistration.storage.repo.TraceLocationRepository
 import de.rki.coronawarnapp.ui.eventregistration.organizer.list.items.TraceLocationItem
 import de.rki.coronawarnapp.ui.eventregistration.organizer.list.items.TraceLocationVH
-import de.rki.coronawarnapp.util.TimeStamper
 import de.rki.coronawarnapp.util.coroutine.DispatcherProvider
 import de.rki.coronawarnapp.util.ui.SingleLiveEvent
 import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
@@ -21,16 +20,13 @@ class TraceLocationsViewModel @AssistedInject constructor(
     dispatcherProvider: DispatcherProvider,
     checkInsRepository: CheckInRepository,
     private val traceLocationRepository: TraceLocationRepository,
-    private val timeStamper: TimeStamper
 ) : CWAViewModel(dispatcherProvider = dispatcherProvider) {
 
     val events = SingleLiveEvent<TraceLocationEvent>()
 
-    val traceLocations: LiveData<List<TraceLocationItem>> = traceLocationRepository.allTraceLocations
+    val traceLocations: LiveData<List<TraceLocationItem>> = traceLocationRepository.traceLocationsWithinRetention
         .map { traceLocations ->
-            traceLocations
-                .filter { it.endDate == null || it.endDate.isAfter(timeStamper.nowUTC.toDateTime().minusDays(15)) }
-                .sortedBy { it.description }
+            traceLocations.sortedBy { it.description }
         }
         .combine(checkInsRepository.allCheckIns) { traceLocations, checkIns ->
             traceLocations.map { traceLocation ->
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivityViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivityViewModel.kt
index 4b534fb0e..7b8d11a2a 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivityViewModel.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivityViewModel.kt
@@ -42,7 +42,7 @@ class MainActivityViewModel @AssistedInject constructor(
     private val mutableIsTraceLocationOnboardingDone = MutableLiveData<Boolean>()
     val isTraceLocationOnboardingDone: LiveData<Boolean> = mutableIsTraceLocationOnboardingDone
 
-    val activeCheckIns = checkInRepository.allCheckIns
+    val activeCheckIns = checkInRepository.checkInsWithinRetention
         .map { checkins -> checkins.filter { !it.completed }.size }
         .asLiveData(context = dispatcherProvider.Default)
 
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewViewModelTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewViewModelTest.kt
index 7c0754dd1..aa7c8b2d9 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewViewModelTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/contactdiary/ui/overview/ContactDiaryOverviewViewModelTest.kt
@@ -69,7 +69,7 @@ open class ContactDiaryOverviewViewModelTest {
         every { contactDiaryRepository.personEncounters } returns flowOf(emptyList())
         every { riskLevelStorage.ewDayRiskStates } returns flowOf(emptyList())
         every { riskLevelStorage.traceLocationCheckInRiskStates } returns flowOf(emptyList())
-        every { checkInRepository.allCheckIns } returns flowOf(emptyList())
+        every { checkInRepository.checkInsWithinRetention } returns flowOf(emptyList())
 
         mockStringsForContactDiaryExporterTests(context)
         every { timeStamper.nowUTC } returns Instant.ofEpochMilli(dateMillis)
@@ -361,7 +361,7 @@ open class ContactDiaryOverviewViewModelTest {
         every { riskLevelStorage.ewDayRiskStates } returns flowOf(listOf(aggregatedRiskPerDateResultLowRisk))
         every { riskLevelStorage.traceLocationCheckInRiskStates } returns flowOf(listOf(traceLocationCheckInRiskHigh))
         every { contactDiaryRepository.locationVisits } returns flowOf(listOf(locationEventHighRiskVisit))
-        every { checkInRepository.allCheckIns } returns flowOf(listOf(checkInHigh))
+        every { checkInRepository.checkInsWithinRetention } returns flowOf(listOf(checkInHigh))
 
         var item = createInstance().listItems.getOrAwaitValue().first {
             it is DayOverviewItem && it.date == date
@@ -384,7 +384,7 @@ open class ContactDiaryOverviewViewModelTest {
         )
         every { riskLevelStorage.traceLocationCheckInRiskStates } returns flowOf(listOf(traceLocationCheckInRiskLow))
         every { contactDiaryRepository.locationVisits } returns flowOf(listOf(locationEventLowRiskVisit))
-        every { checkInRepository.allCheckIns } returns flowOf(listOf(checkInLow))
+        every { checkInRepository.checkInsWithinRetention } returns flowOf(listOf(checkInLow))
 
         item = createInstance().listItems.getOrAwaitValue().first {
             it is DayOverviewItem && it.date == date
@@ -414,7 +414,7 @@ open class ContactDiaryOverviewViewModelTest {
     fun `low risk event by attending event with low risk`() {
         every { contactDiaryRepository.locationVisits } returns flowOf(listOf(locationEventLowRiskVisit))
         every { riskLevelStorage.traceLocationCheckInRiskStates } returns flowOf(listOf(traceLocationCheckInRiskLow))
-        every { checkInRepository.allCheckIns } returns flowOf(listOf(checkInLow))
+        every { checkInRepository.checkInsWithinRetention } returns flowOf(listOf(checkInLow))
 
         val item = createInstance().listItems.getOrAwaitValue().first {
             it is DayOverviewItem && it.date == date
@@ -436,7 +436,7 @@ open class ContactDiaryOverviewViewModelTest {
     fun `high risk event by attending event with high risk`() {
         every { contactDiaryRepository.locationVisits } returns flowOf(listOf(locationEventHighRiskVisit))
         every { riskLevelStorage.traceLocationCheckInRiskStates } returns flowOf(listOf(traceLocationCheckInRiskHigh))
-        every { checkInRepository.allCheckIns } returns flowOf(listOf(checkInHigh))
+        every { checkInRepository.checkInsWithinRetention } returns flowOf(listOf(checkInHigh))
 
         val item = createInstance().listItems.getOrAwaitValue().first {
             it is DayOverviewItem && it.date == date
@@ -469,7 +469,7 @@ open class ContactDiaryOverviewViewModelTest {
             )
         )
 
-        every { checkInRepository.allCheckIns } returns flowOf(listOf(checkInHigh, checkInLow))
+        every { checkInRepository.checkInsWithinRetention } returns flowOf(listOf(checkInHigh, checkInLow))
 
         val item = createInstance().listItems.getOrAwaitValue().first {
             it is DayOverviewItem && it.date == date
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRepositoryTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRepositoryTest.kt
index 0298f03ae..162c73db7 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRepositoryTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRepositoryTest.kt
@@ -3,6 +3,7 @@ package de.rki.coronawarnapp.eventregistration.checkins
 import de.rki.coronawarnapp.eventregistration.storage.TraceLocationDatabase
 import de.rki.coronawarnapp.eventregistration.storage.dao.CheckInDao
 import de.rki.coronawarnapp.eventregistration.storage.entity.TraceLocationCheckInEntity
+import de.rki.coronawarnapp.util.TimeStamper
 import io.kotest.assertions.throwables.shouldThrow
 import io.kotest.matchers.shouldBe
 import io.mockk.MockKAnnotations
@@ -10,11 +11,13 @@ import io.mockk.coEvery
 import io.mockk.coVerify
 import io.mockk.every
 import io.mockk.impl.annotations.MockK
+import io.mockk.impl.annotations.RelaxedMockK
 import io.mockk.mockk
 import io.mockk.slot
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.test.runBlockingTest
 import okio.ByteString.Companion.encode
 import org.joda.time.Instant
@@ -27,6 +30,7 @@ class CheckInRepositoryTest : BaseTest() {
     @MockK lateinit var factory: TraceLocationDatabase.Factory
     @MockK lateinit var database: TraceLocationDatabase
     @MockK lateinit var checkInDao: CheckInDao
+    @RelaxedMockK lateinit var timeStamper: TimeStamper
     private val allEntriesFlow = MutableStateFlow(emptyList<TraceLocationCheckInEntity>())
 
     @BeforeEach
@@ -40,7 +44,7 @@ class CheckInRepositoryTest : BaseTest() {
         }
     }
 
-    private fun createInstance(scope: CoroutineScope) = CheckInRepository(factory)
+    private fun createInstance(scope: CoroutineScope) = CheckInRepository(factory, timeStamper)
 
     @Test
     fun `new entities should have ID 0`() = runBlockingTest {
@@ -177,4 +181,45 @@ class CheckInRepositoryTest : BaseTest() {
             )
         }
     }
+
+    @Test
+    fun `checkInsWithinRetention() should filter out stale check-ins`() = runBlockingTest {
+
+        // Now = Jan 16th 2020, 00:00
+        // CheckIns should be kept for 15 days, so every check-in with an end date before
+        // Jan 1st 2020, 00:00 should get deleted
+        every { timeStamper.nowUTC } returns Instant.parse("2020-01-16T00:00:00.000Z")
+
+        val checkInWithinRetention = createCheckIn(Instant.parse("2020-01-01T00:00:00.000Z"))
+
+        // should be filtered out
+        val staleCheckIn = createCheckIn(Instant.parse("2019-12-31T23:59:59.000Z"))
+
+        every { checkInDao.allEntries() } returns flowOf(
+            listOf(
+                staleCheckIn.toEntity(),
+                checkInWithinRetention.toEntity()
+            )
+        )
+
+        createInstance(scope = this).checkInsWithinRetention.first() shouldBe
+            listOf(checkInWithinRetention)
+    }
+
+    private fun createCheckIn(checkOutDate: Instant) = CheckIn(
+        traceLocationId = "traceLocationId1".encode(),
+        version = 1,
+        type = 1,
+        description = "",
+        address = "",
+        traceLocationStart = null,
+        traceLocationEnd = null,
+        defaultCheckInLengthInMinutes = 30,
+        cryptographicSeed = "cryptographicSeed".encode(),
+        cnPublicKey = "cnPublicKey",
+        checkInStart = Instant.parse("1970-01-01T00:00:00.000Z"),
+        checkInEnd = checkOutDate,
+        completed = true,
+        createJournalEntry = true
+    )
 }
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRetentionTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRetentionTest.kt
new file mode 100644
index 000000000..c95a3d181
--- /dev/null
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRetentionTest.kt
@@ -0,0 +1,44 @@
+package de.rki.coronawarnapp.eventregistration.checkins
+
+import io.kotest.matchers.shouldBe
+import okio.ByteString.Companion.encode
+import org.joda.time.Instant
+import org.junit.jupiter.api.Test
+
+internal class CheckInRetentionTest {
+
+    @Test
+    fun `isWithinRetention() and isOutOfRetention() should return correct result`() {
+
+        // Now = Jan 16th 2020, 00:00
+        // CheckIns should be kept for 15 days, so every check-in with an end date before
+        // Jan 1st 2020 is out of retention
+        val now = Instant.parse("2020-01-16T00:00:00.000Z")
+
+        val checkInWithinRetention = createCheckIn(Instant.parse("2020-01-01T00:00:00.000Z"))
+        val checkInOutOfRetention = createCheckIn(Instant.parse("2019-12-31T23:59:59.000Z"))
+
+        checkInWithinRetention.isWithinRetention(now) shouldBe true
+        checkInWithinRetention.isOutOfRetention(now) shouldBe false
+
+        checkInOutOfRetention.isWithinRetention(now) shouldBe false
+        checkInOutOfRetention.isOutOfRetention(now) shouldBe true
+    }
+
+    private fun createCheckIn(checkOutDate: Instant) = CheckIn(
+        traceLocationId = "traceLocationId1".encode(),
+        version = 1,
+        type = 1,
+        description = "",
+        address = "",
+        traceLocationStart = null,
+        traceLocationEnd = null,
+        defaultCheckInLengthInMinutes = 30,
+        cryptographicSeed = "cryptographicSeed".encode(),
+        cnPublicKey = "cnPublicKey",
+        checkInStart = Instant.parse("1970-01-01T00:00:00.000Z"),
+        checkInEnd = checkOutDate,
+        completed = true,
+        createJournalEntry = true
+    )
+}
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/repo/DefaultTraceLocationRepositoryTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/repo/DefaultTraceLocationRepositoryTest.kt
new file mode 100644
index 000000000..89c9e4da7
--- /dev/null
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/repo/DefaultTraceLocationRepositoryTest.kt
@@ -0,0 +1,74 @@
+package de.rki.coronawarnapp.eventregistration.storage.repo
+
+import de.rki.coronawarnapp.eventregistration.checkins.qrcode.TraceLocation
+import de.rki.coronawarnapp.eventregistration.storage.TraceLocationDatabase
+import de.rki.coronawarnapp.eventregistration.storage.dao.TraceLocationDao
+import de.rki.coronawarnapp.eventregistration.storage.entity.toTraceLocationEntity
+import de.rki.coronawarnapp.server.protocols.internal.pt.TraceLocationOuterClass
+import de.rki.coronawarnapp.util.TimeStamper
+import io.kotest.matchers.shouldBe
+import io.mockk.MockKAnnotations
+import io.mockk.every
+import io.mockk.impl.annotations.MockK
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.test.runBlockingTest
+import okio.ByteString.Companion.encode
+import org.joda.time.Instant
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.Test
+import testhelpers.BaseTest
+
+internal class DefaultTraceLocationRepositoryTest : BaseTest() {
+
+    @MockK lateinit var factory: TraceLocationDatabase.Factory
+    @MockK lateinit var database: TraceLocationDatabase
+    @MockK lateinit var appScope: CoroutineScope
+    @MockK lateinit var timeStamper: TimeStamper
+    @MockK lateinit var traceLocationDao: TraceLocationDao
+
+    @BeforeEach
+    fun setUp() {
+        MockKAnnotations.init(this)
+        every { factory.create() } returns database
+        every { database.traceLocationDao() } returns traceLocationDao
+    }
+
+    private fun createInstance() = DefaultTraceLocationRepository(factory, appScope, timeStamper)
+
+    @Test
+    fun `getTraceLocationsWithinRetention() should filter out stale trace locations`() = runBlockingTest {
+
+        // Now = Jan 16th 2020, 00:00
+        // TraceLocations should be kept for 15 days, so every TraceLocation with an end date before
+        // Jan 1st 2020, 00:00 should get deleted
+        every { timeStamper.nowUTC } returns Instant.parse("2020-01-16T00:00:00.000Z")
+
+        val traceLocationWithinRetention = createTraceLocationWithEndDate(Instant.parse("2020-01-01T00:00:00.000Z"))
+
+        // should be filtered out
+        val staleTraceLocation = createTraceLocationWithEndDate(Instant.parse("2019-12-31T23:59:59.000Z"))
+
+        every { traceLocationDao.allEntries() } returns flowOf(
+            listOf(
+                staleTraceLocation.toTraceLocationEntity(),
+                traceLocationWithinRetention.toTraceLocationEntity()
+            )
+        )
+
+        createInstance().traceLocationsWithinRetention.first() shouldBe listOf(traceLocationWithinRetention)
+    }
+
+    private fun createTraceLocationWithEndDate(endDate: Instant?) = TraceLocation(
+        id = 1,
+        type = TraceLocationOuterClass.TraceLocationType.UNRECOGNIZED,
+        description = "",
+        address = "",
+        startDate = null,
+        endDate = endDate,
+        defaultCheckInLengthInMinutes = 30,
+        cryptographicSeed = "seed byte array".encode(),
+        cnPublicKey = "cnPublicKey"
+    )
+}
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/retention/TraceLocationRetentionTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/retention/TraceLocationRetentionTest.kt
new file mode 100644
index 000000000..d0f58ebbc
--- /dev/null
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/retention/TraceLocationRetentionTest.kt
@@ -0,0 +1,46 @@
+package de.rki.coronawarnapp.eventregistration.storage.retention
+
+import de.rki.coronawarnapp.eventregistration.checkins.qrcode.TraceLocation
+import de.rki.coronawarnapp.server.protocols.internal.pt.TraceLocationOuterClass
+import io.kotest.matchers.shouldBe
+import okio.ByteString.Companion.encode
+import org.joda.time.Instant
+import org.junit.jupiter.api.Test
+
+internal class TraceLocationRetentionTest {
+
+    @Test
+    fun `isWithinRetention() and isOutOfRetention() should return correct result`() {
+
+        // Now = Jan 16th 2020, 00:00
+        // TraceLocations should be kept for 15 days, so every trace location with and end date before
+        // Jan 1st 2020, 00:00 should be out of retention
+        val now = Instant.parse("2020-01-16T00:00:00.000Z")
+
+        val traceLocationWithinRetention = createTraceLocation(Instant.parse("2020-01-01T00:00:00.000Z"))
+        val traceLocationOutOfRetention = createTraceLocation(Instant.parse("2019-12-31T23:59:59.000Z"))
+        val traceLocationNoEndDate = createTraceLocation(null)
+
+        traceLocationWithinRetention.isWithinRetention(now) shouldBe true
+        traceLocationWithinRetention.isOutOfRetention(now) shouldBe false
+
+        traceLocationOutOfRetention.isWithinRetention(now) shouldBe false
+        traceLocationOutOfRetention.isOutOfRetention(now) shouldBe true
+
+        // trace locations without end date are never out of retention
+        traceLocationNoEndDate.isWithinRetention(now) shouldBe true
+        traceLocationNoEndDate.isOutOfRetention(now) shouldBe false
+    }
+
+    private fun createTraceLocation(endDate: Instant?) = TraceLocation(
+        id = 1,
+        type = TraceLocationOuterClass.TraceLocationType.UNRECOGNIZED,
+        description = "",
+        address = "",
+        startDate = null,
+        endDate = endDate,
+        defaultCheckInLengthInMinutes = 30,
+        cryptographicSeed = "seed byte array".encode(),
+        cnPublicKey = "cnPublicKey"
+    )
+}
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/main/MainActivityViewModelTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/main/MainActivityViewModelTest.kt
index 349174209..e456fa43a 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/main/MainActivityViewModelTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/main/MainActivityViewModelTest.kt
@@ -44,7 +44,7 @@ class MainActivityViewModelTest : BaseTest() {
         every { environmentSetup.currentEnvironment } returns EnvironmentSetup.Type.WRU
         every { traceLocationSettings.onboardingStatus } returns TraceLocationSettings.OnboardingStatus.NOT_ONBOARDED
         every { onboardingSettings.isBackgroundCheckDone } returns true
-        every { checkInRepository.allCheckIns } returns MutableStateFlow(listOf())
+        every { checkInRepository.checkInsWithinRetention } returns MutableStateFlow(listOf())
     }
 
     private fun createInstance(): MainActivityViewModel = MainActivityViewModel(
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/presencetracing/risk/execution/PresenceTracingWarningTaskTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/presencetracing/risk/execution/PresenceTracingWarningTaskTest.kt
index e44656741..6b3aade7b 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/presencetracing/risk/execution/PresenceTracingWarningTaskTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/presencetracing/risk/execution/PresenceTracingWarningTaskTest.kt
@@ -64,7 +64,7 @@ class PresenceTracingWarningTaskTest : BaseTest() {
             coEvery { markPackagesProcessed(any()) } just Runs
         }
 
-        coEvery { checkInsRepository.allCheckIns } returns flowOf(listOf(CHECKIN_1, CHECKIN_2))
+        coEvery { checkInsRepository.checkInsWithinRetention } returns flowOf(listOf(CHECKIN_1, CHECKIN_2))
 
         presenceTracingRiskRepository.apply {
             coEvery { deleteAllMatches() } just Runs
@@ -89,7 +89,7 @@ class PresenceTracingWarningTaskTest : BaseTest() {
         coVerifySequence {
             syncTool.syncPackages()
             presenceTracingRiskRepository.deleteStaleData()
-            checkInsRepository.allCheckIns
+            checkInsRepository.checkInsWithinRetention
             traceWarningRepository.unprocessedWarningPackages
 
             checkInWarningMatcher.process(any(), any())
@@ -120,14 +120,14 @@ class PresenceTracingWarningTaskTest : BaseTest() {
 
     @Test
     fun `there are no check-ins to match against`() = runBlockingTest {
-        coEvery { checkInsRepository.allCheckIns } returns flowOf(emptyList())
+        coEvery { checkInsRepository.checkInsWithinRetention } returns flowOf(emptyList())
 
         createInstance().run(mockk()) shouldNotBe null
 
         coVerifySequence {
             syncTool.syncPackages()
             presenceTracingRiskRepository.deleteStaleData()
-            checkInsRepository.allCheckIns
+            checkInsRepository.checkInsWithinRetention
 
             presenceTracingRiskRepository.deleteAllMatches()
             presenceTracingRiskRepository.reportCalculation(successful = true)
@@ -143,7 +143,7 @@ class PresenceTracingWarningTaskTest : BaseTest() {
         coVerifySequence {
             syncTool.syncPackages()
             presenceTracingRiskRepository.deleteStaleData()
-            checkInsRepository.allCheckIns
+            checkInsRepository.checkInsWithinRetention
             traceWarningRepository.unprocessedWarningPackages
 
             presenceTracingRiskRepository.reportCalculation(successful = true)
@@ -160,7 +160,7 @@ class PresenceTracingWarningTaskTest : BaseTest() {
         coVerifySequence {
             syncTool.syncPackages()
             presenceTracingRiskRepository.deleteStaleData()
-            checkInsRepository.allCheckIns
+            checkInsRepository.checkInsWithinRetention
             traceWarningRepository.unprocessedWarningPackages
 
             checkInWarningMatcher.process(any(), any())
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/submission/task/SubmissionTaskTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/submission/task/SubmissionTaskTest.kt
index 224be1942..b18c793f7 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/submission/task/SubmissionTaskTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/submission/task/SubmissionTaskTest.kt
@@ -113,7 +113,7 @@ class SubmissionTaskTest : BaseTest() {
 
         every { timeStamper.nowUTC } returns Instant.EPOCH.plus(Duration.standardHours(1))
 
-        every { checkInRepository.allCheckIns } returns flowOf(emptyList())
+        every { checkInRepository.checkInsWithinRetention } returns flowOf(emptyList())
         coEvery { checkInsTransformer.transform(any(), any()) } returns emptyList()
     }
 
@@ -158,7 +158,7 @@ class SubmissionTaskTest : BaseTest() {
             settingSymptomsPreference.value
 
             tekHistoryCalculations.transformToKeyHistoryInExternalFormat(listOf(tek), userSymptoms)
-            checkInRepository.allCheckIns
+            checkInRepository.checkInsWithinRetention
             checkInsTransformer.transform(any(), any())
 
             appConfigProvider.getAppConfig()
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 bfbd07470..c1adf45da 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
@@ -46,7 +46,7 @@ class CheckInsViewModelTest : BaseTest() {
     fun setup() {
         MockKAnnotations.init(this)
         every { savedState.set(any(), any<String>()) } just Runs
-        every { checkInsRepository.allCheckIns } returns flowOf()
+        every { checkInsRepository.checkInsWithinRetention } returns flowOf()
         every { cameraPermissionProvider.deniedPermanently } returns flowOf(false)
     }
 
@@ -120,7 +120,7 @@ class CheckInsViewModelTest : BaseTest() {
         }
 
         val checkIns = listOf(checkIn1, checkIn2, checkIn3, checkIn4)
-        every { checkInsRepository.allCheckIns } returns flowOf(checkIns)
+        every { checkInsRepository.checkInsWithinRetention } returns flowOf(checkIns)
 
         createInstance(deepLink = null, scope = this).apply {
             checkins.getOrAwaitValue().apply {
@@ -155,7 +155,7 @@ class CheckInsViewModelTest : BaseTest() {
             every { completed } returns false
         }
 
-        every { checkInsRepository.allCheckIns } returns flowOf(listOf(checkIn))
+        every { checkInsRepository.checkInsWithinRetention } returns flowOf(listOf(checkIn))
         every { cameraPermissionProvider.deniedPermanently } returns flowOf(true)
 
         createInstance(deepLink = null, scope = this).apply {
-- 
GitLab