From e169db9f9b246baeb0f0d5337e0d1be7ad7102c6 Mon Sep 17 00:00:00 2001 From: Lukas Lechner <lukas.lechner@sap.com> Date: Wed, 28 Apr 2021 14:51:09 +0200 Subject: [PATCH] Implement share test result reminder for RAT tests (#2977) Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com> --- .../ShareTestResultNotification.kt | 15 ++- .../ShareTestResultNotificationService.kt | 110 +++++++++++++----- .../de/rki/coronawarnapp/main/CWASettings.kt | 15 ++- .../notification/GeneralNotifications.kt | 11 +- .../notification/NotificationConstants.kt | 1 + .../notification/NotificationReceiver.kt | 14 ++- .../submission/task/SubmissionTask.kt | 2 - .../EncryptedPreferencesMigration.kt | 2 +- .../ShareTestResultNotificationServiceTest.kt | 92 ++++++++------- .../submission/task/SubmissionTaskTest.kt | 5 +- .../EncryptedPreferencesMigrationTest.kt | 2 +- 11 files changed, 181 insertions(+), 88 deletions(-) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/notification/ShareTestResultNotification.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/notification/ShareTestResultNotification.kt index 3cebace1c..8c2a92737 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/notification/ShareTestResultNotification.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/notification/ShareTestResultNotification.kt @@ -1,9 +1,11 @@ package de.rki.coronawarnapp.coronatest.notification import android.content.Context +import android.os.Bundle import androidx.navigation.NavDeepLinkBuilder import dagger.Reusable import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.coronatest.type.CoronaTest import de.rki.coronawarnapp.notification.GeneralNotifications import de.rki.coronawarnapp.notification.NotificationConstants.POSITIVE_RESULT_NOTIFICATION_ID import de.rki.coronawarnapp.notification.NotificationConstants.POSITIVE_RESULT_NOTIFICATION_INITIAL_OFFSET @@ -22,20 +24,25 @@ class ShareTestResultNotification @Inject constructor( private val notificationHelper: GeneralNotifications, ) { - fun scheduleSharePositiveTestResultReminder() { + fun scheduleSharePositiveTestResultReminder(testType: CoronaTest.Type) { notificationHelper.scheduleRepeatingNotification( + testType, timeStamper.nowUTC.plus(POSITIVE_RESULT_NOTIFICATION_INITIAL_OFFSET), POSITIVE_RESULT_NOTIFICATION_INTERVAL, POSITIVE_RESULT_NOTIFICATION_ID ) } - fun showSharePositiveTestResultNotification(notificationId: Int) { + fun showSharePositiveTestResultNotification(notificationId: Int, testType: CoronaTest.Type) { Timber.d("showSharePositiveTestResultNotification(notificationId=$notificationId)") + + val args = Bundle().apply { putSerializable("testType", testType) } + val pendingIntent = NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setComponentName(MainActivity::class.java) .setDestination(R.id.submissionTestResultAvailableFragment) + .setArguments(args) .createPendingIntent() val notification = notificationHelper.newBaseBuilder().apply { @@ -50,8 +57,8 @@ class ShareTestResultNotification @Inject constructor( ) } - fun cancelSharePositiveTestResultNotification() { - notificationHelper.cancelFutureNotifications(POSITIVE_RESULT_NOTIFICATION_ID) + fun cancelSharePositiveTestResultNotification(testType: CoronaTest.Type) { + notificationHelper.cancelFutureNotifications(POSITIVE_RESULT_NOTIFICATION_ID, testType) Timber.v("Future positive test result notifications have been canceled") } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/notification/ShareTestResultNotificationService.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/notification/ShareTestResultNotificationService.kt index dddb09c4b..155b74a70 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/notification/ShareTestResultNotificationService.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/notification/ShareTestResultNotificationService.kt @@ -1,6 +1,11 @@ package de.rki.coronawarnapp.coronatest.notification import de.rki.coronawarnapp.coronatest.CoronaTestRepository +import de.rki.coronawarnapp.coronatest.latestPCRT +import de.rki.coronawarnapp.coronatest.latestRAT +import de.rki.coronawarnapp.coronatest.type.CoronaTest +import de.rki.coronawarnapp.coronatest.type.CoronaTest.Type.PCR +import de.rki.coronawarnapp.coronatest.type.CoronaTest.Type.RAPID_ANTIGEN import de.rki.coronawarnapp.main.CWASettings import de.rki.coronawarnapp.notification.NotificationConstants.POSITIVE_RESULT_NOTIFICATION_TOTAL_COUNT import de.rki.coronawarnapp.util.coroutine.AppScope @@ -22,47 +27,98 @@ class ShareTestResultNotificationService @Inject constructor( fun setup() { Timber.d("setup()") + coronaTestRepository.coronaTests .onEach { tests -> - when { - tests.any { it.isSubmissionAllowed } -> { - maybeScheduleSharePositiveTestResultReminder() - } - tests.isNotEmpty() -> { - notification.cancelSharePositiveTestResultNotification() - } - tests.isEmpty() -> { - resetSharePositiveTestResultNotification() - } + + // schedule reminder if test wasn't submitted + tests.filter { test -> + test.isSubmissionAllowed && !test.isSubmitted + }.forEach { test -> + maybeScheduleSharePositiveTestResultReminder(test.type) } + + // cancel the reminder when test is submitted + tests + .filter { it.isSubmitted } + .forEach { notification.cancelSharePositiveTestResultNotification(it.type) } } .catch { Timber.e(it, "Failed to schedule positive test result reminder.") } .launchIn(appScope) + + // if no PCR test is stored or if it was deleted, we reset the reminder + coronaTestRepository.latestPCRT + .onEach { + if (it == null) { + resetSharePositiveTestResultNotification(PCR) + } + } + .catch { Timber.e(it, "Failed to reset positive test result reminder for PCR test.") } + .launchIn(appScope) + + // if no RAT test is stored or if it was deleted, we reset the reminder + coronaTestRepository.latestRAT + .onEach { + if (it == null) { + resetSharePositiveTestResultNotification(RAPID_ANTIGEN) + } + } + .catch { Timber.e(it, "Failed to reset positive test result reminder for RAT test.") } + .launchIn(appScope) } - fun maybeShowSharePositiveTestResultNotification(notificationId: Int) { + fun maybeShowSharePositiveTestResultNotification(notificationId: Int, testType: CoronaTest.Type) { Timber.d("maybeShowSharePositiveTestResultNotification(notificationId=$notificationId)") - if (cwaSettings.numberOfRemainingSharePositiveTestResultReminders > 0) { - cwaSettings.numberOfRemainingSharePositiveTestResultReminders -= 1 - notification.showSharePositiveTestResultNotification(notificationId) - } else { - notification.cancelSharePositiveTestResultNotification() + if (testType == PCR) { + if (cwaSettings.numberOfRemainingSharePositiveTestResultRemindersPcr > 0) { + cwaSettings.numberOfRemainingSharePositiveTestResultRemindersPcr -= 1 + notification.showSharePositiveTestResultNotification(notificationId, testType) + } else { + notification.cancelSharePositiveTestResultNotification(testType) + } + } else if (testType == RAPID_ANTIGEN) { + if (cwaSettings.numberOfRemainingSharePositiveTestResultRemindersRat > 0) { + cwaSettings.numberOfRemainingSharePositiveTestResultRemindersRat -= 1 + notification.showSharePositiveTestResultNotification(notificationId, testType) + } else { + notification.cancelSharePositiveTestResultNotification(testType) + } } } - private fun maybeScheduleSharePositiveTestResultReminder() { - if (cwaSettings.numberOfRemainingSharePositiveTestResultReminders < 0) { - Timber.v("Schedule positive test result notification") - cwaSettings.numberOfRemainingSharePositiveTestResultReminders = POSITIVE_RESULT_NOTIFICATION_TOTAL_COUNT - notification.scheduleSharePositiveTestResultReminder() - } else { - Timber.v("Positive test result notification has already been scheduled") + private fun maybeScheduleSharePositiveTestResultReminder(testType: CoronaTest.Type) { + when (testType) { + PCR -> { + if (cwaSettings.numberOfRemainingSharePositiveTestResultRemindersPcr < 0) { + Timber.v("Schedule positive test result notification for PCR test") + cwaSettings.numberOfRemainingSharePositiveTestResultRemindersPcr = + POSITIVE_RESULT_NOTIFICATION_TOTAL_COUNT + notification.scheduleSharePositiveTestResultReminder(testType) + } else { + Timber.v("Positive test result notification for PCR test has already been scheduled") + } + } + RAPID_ANTIGEN -> { + if (cwaSettings.numberOfRemainingSharePositiveTestResultRemindersRat < 0) { + Timber.v("Schedule positive test result notification for RAT test") + cwaSettings.numberOfRemainingSharePositiveTestResultRemindersRat = + POSITIVE_RESULT_NOTIFICATION_TOTAL_COUNT + notification.scheduleSharePositiveTestResultReminder(testType) + } else { + Timber.v("Positive test result notification for RAT test has already been scheduled") + } + } } } - private fun resetSharePositiveTestResultNotification() { - notification.cancelSharePositiveTestResultNotification() - cwaSettings.numberOfRemainingSharePositiveTestResultReminders = Int.MIN_VALUE - Timber.v("Positive test result notification counter has been reset") + private fun resetSharePositiveTestResultNotification(testType: CoronaTest.Type) { + notification.cancelSharePositiveTestResultNotification(testType) + + when (testType) { + PCR -> cwaSettings.numberOfRemainingSharePositiveTestResultRemindersPcr = Int.MIN_VALUE + RAPID_ANTIGEN -> cwaSettings.numberOfRemainingSharePositiveTestResultRemindersRat = Int.MIN_VALUE + } + + Timber.v("Share positive test result notification counter has been reset for all test types") } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/main/CWASettings.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/main/CWASettings.kt index 86a3b4266..c433ce80d 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/main/CWASettings.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/main/CWASettings.kt @@ -48,9 +48,13 @@ class CWASettings @Inject constructor( ).let { raw -> ConfigData.DeviceTimeState.values().single { it.key == raw } } set(value) = prefs.edit { putString(PKEY_DEVICE_TIME_LAST_STATE_CHANGE_STATE, value.key) } - var numberOfRemainingSharePositiveTestResultReminders: Int - get() = prefs.getInt(PKEY_POSITIVE_TEST_RESULT_REMINDER_COUNT, Int.MIN_VALUE) - set(value) = prefs.edit { putInt(PKEY_POSITIVE_TEST_RESULT_REMINDER_COUNT, value) } + var numberOfRemainingSharePositiveTestResultRemindersPcr: Int + get() = prefs.getInt(PKEY_POSITIVE_TEST_RESULT_REMINDER_COUNT_PCR, Int.MIN_VALUE) + set(value) = prefs.edit { putInt(PKEY_POSITIVE_TEST_RESULT_REMINDER_COUNT_PCR, value) } + + var numberOfRemainingSharePositiveTestResultRemindersRat: Int + get() = prefs.getInt(PKEY_POSITIVE_TEST_RESULT_REMINDER_COUNT_RAT, Int.MIN_VALUE) + set(value) = prefs.edit { putInt(PKEY_POSITIVE_TEST_RESULT_REMINDER_COUNT_RAT, value) } val isNotificationsRiskEnabled = prefs.createFlowPreference( key = PKEY_NOTIFICATIONS_RISK_ENABLED, @@ -80,7 +84,10 @@ class CWASettings @Inject constructor( private const val PKEY_DEVICE_TIME_LAST_STATE_CHANGE_STATE = "devicetime.laststatechange.state" private const val PKEY_NOTIFICATIONS_RISK_ENABLED = "notifications.risk.enabled" private const val PKEY_NOTIFICATIONS_TEST_ENABLED = "notifications.test.enabled" - private const val PKEY_POSITIVE_TEST_RESULT_REMINDER_COUNT = "testresults.count" + + private const val PKEY_POSITIVE_TEST_RESULT_REMINDER_COUNT_PCR = "testresults.count" + private const val PKEY_POSITIVE_TEST_RESULT_REMINDER_COUNT_RAT = "testresults.count.rat" + private const val LAST_CHANGELOG_VERSION = "update.changelog.lastversion" private const val DEFAULT_APP_VERSION = 1L } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/notification/GeneralNotifications.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/notification/GeneralNotifications.kt index cf0e71b82..9bffd29f9 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/notification/GeneralNotifications.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/notification/GeneralNotifications.kt @@ -17,7 +17,9 @@ import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import dagger.Reusable import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.coronatest.type.CoronaTest import de.rki.coronawarnapp.notification.NotificationConstants.NOTIFICATION_ID +import de.rki.coronawarnapp.notification.NotificationConstants.POSITIVE_RESULT_NOTIFICATION_TEST_TYPE import de.rki.coronawarnapp.ui.main.MainActivity import de.rki.coronawarnapp.util.di.AppContext import de.rki.coronawarnapp.util.notifications.setContentTextExpandable @@ -63,8 +65,8 @@ class GeneralNotifications @Inject constructor( notificationManager.createNotificationChannel(channel) } - fun cancelFutureNotifications(notificationId: Int) { - val pendingIntent = createPendingIntentToScheduleNotification(notificationId) + fun cancelFutureNotifications(notificationId: Int, testType: CoronaTest.Type) { + val pendingIntent = createPendingIntentToScheduleNotification(notificationId, testType) val manager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager manager.cancel(pendingIntent) @@ -77,11 +79,12 @@ class GeneralNotifications @Inject constructor( } fun scheduleRepeatingNotification( + testType: CoronaTest.Type, initialTime: Instant, interval: Duration, notificationId: NotificationId ) { - val pendingIntent = createPendingIntentToScheduleNotification(notificationId) + val pendingIntent = createPendingIntentToScheduleNotification(notificationId, testType) val manager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager manager.setInexactRepeating(AlarmManager.RTC, initialTime.millis, interval.millis, pendingIntent) @@ -89,6 +92,7 @@ class GeneralNotifications @Inject constructor( private fun createPendingIntentToScheduleNotification( notificationId: NotificationId, + testType: CoronaTest.Type, flag: Int = FLAG_CANCEL_CURRENT ) = PendingIntent.getBroadcast( @@ -96,6 +100,7 @@ class GeneralNotifications @Inject constructor( notificationId, Intent(context, NotificationReceiver::class.java).apply { putExtra(NOTIFICATION_ID, notificationId) + putExtra(POSITIVE_RESULT_NOTIFICATION_TEST_TYPE, testType.raw) }, flag ) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/notification/NotificationConstants.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/notification/NotificationConstants.kt index 5e89ce916..ca7cfe8dd 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/notification/NotificationConstants.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/notification/NotificationConstants.kt @@ -11,6 +11,7 @@ object NotificationConstants { const val NOTIFICATION_ID = "NOTIFICATION_ID" + const val POSITIVE_RESULT_NOTIFICATION_TEST_TYPE = "NOTIFICATION_TEST_TYPE" const val POSITIVE_RESULT_NOTIFICATION_ID = 100 const val POSITIVE_RESULT_NOTIFICATION_TOTAL_COUNT = 2 val POSITIVE_RESULT_NOTIFICATION_INITIAL_OFFSET: Duration = Duration.standardHours(2) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/notification/NotificationReceiver.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/notification/NotificationReceiver.kt index b11c004a6..33834f300 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/notification/NotificationReceiver.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/notification/NotificationReceiver.kt @@ -5,8 +5,10 @@ import android.content.Context import android.content.Intent import dagger.android.AndroidInjection import de.rki.coronawarnapp.coronatest.notification.ShareTestResultNotificationService +import de.rki.coronawarnapp.coronatest.type.CoronaTest import de.rki.coronawarnapp.notification.NotificationConstants.NOTIFICATION_ID import de.rki.coronawarnapp.notification.NotificationConstants.POSITIVE_RESULT_NOTIFICATION_ID +import de.rki.coronawarnapp.notification.NotificationConstants.POSITIVE_RESULT_NOTIFICATION_TEST_TYPE import timber.log.Timber import javax.inject.Inject @@ -20,8 +22,16 @@ class NotificationReceiver : BroadcastReceiver() { AndroidInjection.inject(this, context) when (val notificationId = intent.getIntExtra(NOTIFICATION_ID, Int.MIN_VALUE)) { POSITIVE_RESULT_NOTIFICATION_ID -> { - Timber.tag(TAG).v("NotificationReceiver received intent to show a positive test result notification") - shareTestResultNotificationService.maybeShowSharePositiveTestResultNotification(notificationId) + val testTypeRaw = intent.getStringExtra(POSITIVE_RESULT_NOTIFICATION_TEST_TYPE) + val testType = CoronaTest.Type.values().first { it.raw == testTypeRaw } + Timber.tag(TAG).v( + "NotificationReceiver received intent to show a positive test result notification for test type %s", + testType + ) + shareTestResultNotificationService.maybeShowSharePositiveTestResultNotification( + notificationId, + testType + ) } else -> Timber.tag(TAG).d("NotificationReceiver received an undefined notificationId: %s", notificationId) 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 8e0551005..bf8c50d1d 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 @@ -4,7 +4,6 @@ import com.google.android.gms.nearby.exposurenotification.TemporaryExposureKey import de.rki.coronawarnapp.appconfig.AppConfigProvider import de.rki.coronawarnapp.bugreporting.reportProblem import de.rki.coronawarnapp.coronatest.CoronaTestRepository -import de.rki.coronawarnapp.coronatest.notification.ShareTestResultNotificationService import de.rki.coronawarnapp.coronatest.type.CoronaTest import de.rki.coronawarnapp.coronatest.type.CoronaTest.Type.PCR import de.rki.coronawarnapp.coronatest.type.pcr.notification.PCRTestResultAvailableNotificationService @@ -41,7 +40,6 @@ class SubmissionTask @Inject constructor( private val submissionSettings: SubmissionSettings, private val autoSubmission: AutoSubmission, private val timeStamper: TimeStamper, - private val shareTestResultNotificationService: ShareTestResultNotificationService, private val testResultAvailableNotificationService: PCRTestResultAvailableNotificationService, private val checkInsRepository: CheckInRepository, private val checkInsTransformer: CheckInsTransformer, diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/encryptionmigration/EncryptedPreferencesMigration.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/encryptionmigration/EncryptedPreferencesMigration.kt index 9479266cd..6cd22bcbd 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/encryptionmigration/EncryptedPreferencesMigration.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/encryptionmigration/EncryptedPreferencesMigration.kt @@ -54,7 +54,7 @@ class EncryptedPreferencesMigration @Inject constructor( cwaSettings.wasTracingExplanationDialogShown = wasTracingExplanationDialogShown() cwaSettings.isNotificationsRiskEnabled.update { isNotificationsRiskEnabled() } cwaSettings.isNotificationsTestEnabled.update { isNotificationsTestEnabled() } - cwaSettings.numberOfRemainingSharePositiveTestResultReminders = + cwaSettings.numberOfRemainingSharePositiveTestResultRemindersPcr = numberOfRemainingSharePositiveTestResultReminders() } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/coronatest/notification/ShareTestResultNotificationServiceTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/coronatest/notification/ShareTestResultNotificationServiceTest.kt index 7e4f8ecd1..9bcf463ac 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/coronatest/notification/ShareTestResultNotificationServiceTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/coronatest/notification/ShareTestResultNotificationServiceTest.kt @@ -2,6 +2,8 @@ package de.rki.coronawarnapp.coronatest.notification import de.rki.coronawarnapp.coronatest.CoronaTestRepository import de.rki.coronawarnapp.coronatest.type.CoronaTest +import de.rki.coronawarnapp.coronatest.type.CoronaTest.Type.PCR +import de.rki.coronawarnapp.coronatest.type.CoronaTest.Type.RAPID_ANTIGEN import de.rki.coronawarnapp.main.CWASettings import io.kotest.matchers.shouldBe import io.mockk.MockKAnnotations @@ -26,22 +28,29 @@ class ShareTestResultNotificationServiceTest : BaseTest() { private val coronaTestFlow = MutableStateFlow( emptySet<CoronaTest>() ) - private var numberOfRemainingSharePositiveTestResultReminders: Int = Int.MIN_VALUE + private var numberOfRemainingSharePositiveTestResultRemindersPcr: Int = Int.MIN_VALUE + private var numberOfRemainingSharePositiveTestResultRemindersRat: Int = Int.MIN_VALUE @BeforeEach fun setup() { MockKAnnotations.init(this) every { coronaTestRepository.coronaTests } returns coronaTestFlow - every { cwaSettings.numberOfRemainingSharePositiveTestResultReminders = any() } answers { - numberOfRemainingSharePositiveTestResultReminders = arg(0) + every { cwaSettings.numberOfRemainingSharePositiveTestResultRemindersPcr = any() } answers { + numberOfRemainingSharePositiveTestResultRemindersPcr = arg(0) } - every { cwaSettings.numberOfRemainingSharePositiveTestResultReminders } answers { - numberOfRemainingSharePositiveTestResultReminders + every { cwaSettings.numberOfRemainingSharePositiveTestResultRemindersPcr } answers { + numberOfRemainingSharePositiveTestResultRemindersPcr + } + every { cwaSettings.numberOfRemainingSharePositiveTestResultRemindersRat = any() } answers { + numberOfRemainingSharePositiveTestResultRemindersRat = arg(0) + } + every { cwaSettings.numberOfRemainingSharePositiveTestResultRemindersRat } answers { + numberOfRemainingSharePositiveTestResultRemindersRat } - every { shareTestResultNotification.showSharePositiveTestResultNotification(any()) } just Runs - every { shareTestResultNotification.cancelSharePositiveTestResultNotification() } just Runs - every { shareTestResultNotification.scheduleSharePositiveTestResultReminder() } just Runs + every { shareTestResultNotification.showSharePositiveTestResultNotification(any(), any()) } just Runs + every { shareTestResultNotification.cancelSharePositiveTestResultNotification(any()) } just Runs + every { shareTestResultNotification.scheduleSharePositiveTestResultReminder(any()) } just Runs } private fun createInstance(scope: CoroutineScope) = ShareTestResultNotificationService( @@ -57,6 +66,12 @@ class ShareTestResultNotificationServiceTest : BaseTest() { coronaTestFlow.value = setOf( mockk<CoronaTest>().apply { + every { type } returns PCR + every { isSubmissionAllowed } returns true + every { isSubmitted } returns false + }, + mockk<CoronaTest>().apply { + every { type } returns RAPID_ANTIGEN every { isSubmissionAllowed } returns true every { isSubmitted } returns false } @@ -64,54 +79,49 @@ class ShareTestResultNotificationServiceTest : BaseTest() { instance.setup() - verify { shareTestResultNotification.scheduleSharePositiveTestResultReminder() } - verify { cwaSettings.numberOfRemainingSharePositiveTestResultReminders = 2 } + verify(exactly = 1) { shareTestResultNotification.scheduleSharePositiveTestResultReminder(PCR) } + verify(exactly = 1) { shareTestResultNotification.scheduleSharePositiveTestResultReminder(RAPID_ANTIGEN) } + + verify { cwaSettings.numberOfRemainingSharePositiveTestResultRemindersPcr = 2 } + verify { cwaSettings.numberOfRemainingSharePositiveTestResultRemindersRat = 2 } } @Test fun `showing a notification consumes a token`() = runBlockingTest2(ignoreActive = true) { val instance = createInstance(this) - numberOfRemainingSharePositiveTestResultReminders = 2 + numberOfRemainingSharePositiveTestResultRemindersPcr = 2 + numberOfRemainingSharePositiveTestResultRemindersRat = 2 - instance.maybeShowSharePositiveTestResultNotification(1) + instance.maybeShowSharePositiveTestResultNotification(1, PCR) + instance.maybeShowSharePositiveTestResultNotification(1, RAPID_ANTIGEN) - numberOfRemainingSharePositiveTestResultReminders shouldBe 1 + numberOfRemainingSharePositiveTestResultRemindersPcr shouldBe 1 + numberOfRemainingSharePositiveTestResultRemindersRat shouldBe 1 - verify { shareTestResultNotification.showSharePositiveTestResultNotification(1) } + verify { shareTestResultNotification.showSharePositiveTestResultNotification(1, PCR) } + verify { shareTestResultNotification.showSharePositiveTestResultNotification(1, RAPID_ANTIGEN) } } @Test fun `if there are no tokens left to show a notification, cancel the current one`() = runBlockingTest2(ignoreActive = true) { val instance = createInstance(this) - numberOfRemainingSharePositiveTestResultReminders = 0 - instance.maybeShowSharePositiveTestResultNotification(1) - - numberOfRemainingSharePositiveTestResultReminders shouldBe 0 - - verify { shareTestResultNotification.cancelSharePositiveTestResultNotification() } + // PCR + numberOfRemainingSharePositiveTestResultRemindersPcr = 0 + instance.maybeShowSharePositiveTestResultNotification(1, PCR) + numberOfRemainingSharePositiveTestResultRemindersPcr shouldBe 0 + verify { shareTestResultNotification.cancelSharePositiveTestResultNotification(PCR) } + + // RAT + numberOfRemainingSharePositiveTestResultRemindersRat = 0 + instance.maybeShowSharePositiveTestResultNotification(1, RAPID_ANTIGEN) + numberOfRemainingSharePositiveTestResultRemindersRat shouldBe 0 + verify { shareTestResultNotification.cancelSharePositiveTestResultNotification(PCR) } } @Test - fun `any test which allowes submission triggers scheduling`() = runBlockingTest2(ignoreActive = true) { - val instance = createInstance(this) - - coronaTestFlow.value = setOf( - mockk<CoronaTest>().apply { - every { isSubmissionAllowed } returns true - every { isSubmitted } returns false - } - ) - - instance.setup() - - verify { shareTestResultNotification.scheduleSharePositiveTestResultReminder() } - verify { cwaSettings.numberOfRemainingSharePositiveTestResultReminders = 2 } - } - - @Test - fun `if there are no tests, we reset scheduling`() = runBlockingTest2(ignoreActive = true) { + fun `reset notification if no test is stored or test was deleted`() = runBlockingTest2(ignoreActive = true) { val instance = createInstance(this) coronaTestFlow.value = emptySet() @@ -120,7 +130,9 @@ class ShareTestResultNotificationServiceTest : BaseTest() { advanceUntilIdle() - verify { shareTestResultNotification.cancelSharePositiveTestResultNotification() } - verify { cwaSettings.numberOfRemainingSharePositiveTestResultReminders = Int.MIN_VALUE } + verify { shareTestResultNotification.cancelSharePositiveTestResultNotification(PCR) } + verify { shareTestResultNotification.cancelSharePositiveTestResultNotification(RAPID_ANTIGEN) } + verify { cwaSettings.numberOfRemainingSharePositiveTestResultRemindersPcr = Int.MIN_VALUE } + verify { cwaSettings.numberOfRemainingSharePositiveTestResultRemindersRat = Int.MIN_VALUE } } } 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 de0bc5cb2..0e899746e 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 @@ -4,7 +4,6 @@ import com.google.android.gms.nearby.exposurenotification.TemporaryExposureKey import de.rki.coronawarnapp.appconfig.AppConfigProvider import de.rki.coronawarnapp.appconfig.ConfigData import de.rki.coronawarnapp.coronatest.CoronaTestRepository -import de.rki.coronawarnapp.coronatest.notification.ShareTestResultNotificationService import de.rki.coronawarnapp.coronatest.type.CoronaTest import de.rki.coronawarnapp.coronatest.type.CoronaTest.Type.PCR import de.rki.coronawarnapp.coronatest.type.CoronaTest.Type.RAPID_ANTIGEN @@ -54,7 +53,6 @@ class SubmissionTaskTest : BaseTest() { @MockK lateinit var tekHistoryCalculations: ExposureKeyHistoryCalculations @MockK lateinit var tekHistoryStorage: TEKHistoryStorage @MockK lateinit var submissionSettings: SubmissionSettings - @MockK lateinit var shareTestResultNotificationService: ShareTestResultNotificationService @MockK lateinit var testResultAvailableNotificationService: PCRTestResultAvailableNotificationService @MockK lateinit var autoSubmission: AutoSubmission @@ -84,7 +82,7 @@ class SubmissionTaskTest : BaseTest() { every { isSubmitted } returns false every { registrationToken } returns "regtoken" every { identifier } returns "coronatest-identifier" - every { type } returns CoronaTest.Type.PCR + every { type } returns PCR } ) ) @@ -171,7 +169,6 @@ class SubmissionTaskTest : BaseTest() { tekHistoryCalculations = tekHistoryCalculations, tekHistoryStorage = tekHistoryStorage, submissionSettings = submissionSettings, - shareTestResultNotificationService = shareTestResultNotificationService, timeStamper = timeStamper, autoSubmission = autoSubmission, testResultAvailableNotificationService = testResultAvailableNotificationService, diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/encryptionmigration/EncryptedPreferencesMigrationTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/encryptionmigration/EncryptedPreferencesMigrationTest.kt index f10be3cd8..5ecc2cc19 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/encryptionmigration/EncryptedPreferencesMigrationTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/encryptionmigration/EncryptedPreferencesMigrationTest.kt @@ -106,7 +106,7 @@ class EncryptedPreferencesMigrationTest : BaseIOTest() { every { cwaSettings.isNotificationsRiskEnabled } returns mockRiskPreference val mockTestPreference = mockFlowPreference(true) every { cwaSettings.isNotificationsTestEnabled } returns mockTestPreference - every { cwaSettings.numberOfRemainingSharePositiveTestResultReminders = Int.MAX_VALUE } just Runs + every { cwaSettings.numberOfRemainingSharePositiveTestResultRemindersPcr = Int.MAX_VALUE } just Runs // OnboardingLocalData val mockOnboardingCompletedTimestamp = mockFlowPreference(Instant.ofEpochMilli(10101010L)) -- GitLab