Skip to content
Snippets Groups Projects
Unverified Commit 3c44efc8 authored by Chilja Gossow's avatar Chilja Gossow Committed by GitHub
Browse files

Abort test result available notification scheduling when viewed (EXPOSUREAPP-4516) #2105

* do not schedule reminders when test result has been viewed

* clean up

* renaming to make clear which notification is meant

* refactor worker

* rename

* DI issues

* DI test code

* add else branch
test code

* test code

* refactoring

* comment
parent 5fd9d9e0
No related branches found
Tags v1.11.0-RC4
No related merge requests found
Showing
with 82 additions and 81 deletions
......@@ -10,7 +10,7 @@ import dagger.android.ContributesAndroidInjector
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.appconfig.AppConfigProvider
import de.rki.coronawarnapp.main.CWASettings
import de.rki.coronawarnapp.notification.TestResultNotificationService
import de.rki.coronawarnapp.notification.ShareTestResultNotificationService
import de.rki.coronawarnapp.storage.TracingRepository
import de.rki.coronawarnapp.submission.SubmissionRepository
import de.rki.coronawarnapp.submission.ui.homecards.SubmissionStateProvider
......@@ -58,7 +58,7 @@ class HomeFragmentTest : BaseUITest() {
@MockK lateinit var tracingStateProviderFactory: TracingStateProvider.Factory
@MockK lateinit var submissionStateProvider: SubmissionStateProvider
@MockK lateinit var tracingRepository: TracingRepository
@MockK lateinit var testResultNotificationService: TestResultNotificationService
@MockK lateinit var shareTestResultNotificationService: ShareTestResultNotificationService
@MockK lateinit var submissionRepository: SubmissionRepository
@MockK lateinit var cwaSettings: CWASettings
@MockK lateinit var appConfigProvider: AppConfigProvider
......@@ -249,7 +249,7 @@ class HomeFragmentTest : BaseUITest() {
errorResetTool = errorResetTool,
tracingRepository = tracingRepository,
tracingStateProviderFactory = tracingStateProviderFactory,
testResultNotificationService = testResultNotificationService,
shareTestResultNotificationService = shareTestResultNotificationService,
appConfigProvider = appConfigProvider,
tracingStatus = tracingStatus,
submissionRepository = submissionRepository,
......
......@@ -12,6 +12,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import dagger.Module
import dagger.android.ContributesAndroidInjector
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.notification.TestResultAvailableNotificationService
import de.rki.coronawarnapp.submission.SubmissionRepository
import de.rki.coronawarnapp.submission.auto.AutoSubmission
import de.rki.coronawarnapp.ui.submission.testresult.TestResultUIState
......@@ -43,6 +44,7 @@ class SubmissionTestResultConsentGivenFragmentTest : BaseUITest() {
@MockK lateinit var submissionRepository: SubmissionRepository
@MockK lateinit var autoSubmission: AutoSubmission
@MockK lateinit var testResultAvailableNotificationService: TestResultAvailableNotificationService
@Rule
@JvmField
......@@ -61,6 +63,7 @@ class SubmissionTestResultConsentGivenFragmentTest : BaseUITest() {
SubmissionTestResultConsentGivenViewModel(
submissionRepository,
autoSubmission,
testResultAvailableNotificationService,
TestDispatcherProvider
)
)
......
......@@ -10,7 +10,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import dagger.Module
import dagger.android.ContributesAndroidInjector
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.notification.TestResultNotificationService
import de.rki.coronawarnapp.notification.ShareTestResultNotificationService
import de.rki.coronawarnapp.submission.SubmissionRepository
import de.rki.coronawarnapp.ui.submission.testresult.TestResultUIState
import de.rki.coronawarnapp.ui.submission.testresult.pending.SubmissionTestResultPendingFragment
......@@ -42,7 +42,7 @@ class SubmissionTestResultFragmentTest : BaseUITest() {
lateinit var viewModel: SubmissionTestResultPendingViewModel
@MockK lateinit var submissionRepository: SubmissionRepository
@MockK lateinit var testResultNotificationService: TestResultNotificationService
@MockK lateinit var shareTestResultNotificationService: ShareTestResultNotificationService
@Rule
@JvmField
......@@ -61,7 +61,7 @@ class SubmissionTestResultFragmentTest : BaseUITest() {
viewModel = spyk(
SubmissionTestResultPendingViewModel(
TestDispatcherProvider,
testResultNotificationService,
shareTestResultNotificationService,
submissionRepository
)
)
......
......@@ -4,6 +4,7 @@ import androidx.lifecycle.MutableLiveData
import androidx.test.ext.junit.runners.AndroidJUnit4
import dagger.Module
import dagger.android.ContributesAndroidInjector
import de.rki.coronawarnapp.notification.TestResultAvailableNotificationService
import de.rki.coronawarnapp.submission.SubmissionRepository
import de.rki.coronawarnapp.ui.submission.testresult.TestResultUIState
import de.rki.coronawarnapp.ui.submission.testresult.negative.SubmissionTestResultNegativeFragment
......@@ -33,6 +34,7 @@ class SubmissionTestResultNegativeFragmentTest : BaseUITest() {
lateinit var viewModel: SubmissionTestResultNegativeViewModel
@MockK lateinit var submissionRepository: SubmissionRepository
@MockK lateinit var testResultAvailableNotificationService: TestResultAvailableNotificationService
@Rule
@JvmField
......@@ -51,7 +53,8 @@ class SubmissionTestResultNegativeFragmentTest : BaseUITest() {
viewModel = spyk(
SubmissionTestResultNegativeViewModel(
TestDispatcherProvider,
submissionRepository
submissionRepository,
testResultAvailableNotificationService
)
)
......
......@@ -4,6 +4,7 @@ import androidx.lifecycle.MutableLiveData
import androidx.test.ext.junit.runners.AndroidJUnit4
import dagger.Module
import dagger.android.ContributesAndroidInjector
import de.rki.coronawarnapp.notification.TestResultAvailableNotificationService
import de.rki.coronawarnapp.submission.SubmissionRepository
import de.rki.coronawarnapp.ui.submission.testresult.TestResultUIState
import de.rki.coronawarnapp.ui.submission.testresult.positive.SubmissionTestResultNoConsentFragment
......@@ -30,6 +31,7 @@ import java.util.Date
class SubmissionTestResultNoConsentGivenFragmentTest : BaseUITest() {
@MockK lateinit var submissionRepository: SubmissionRepository
@MockK lateinit var testResultAvailableNotificationService: TestResultAvailableNotificationService
@Rule
@JvmField
......@@ -44,7 +46,7 @@ class SubmissionTestResultNoConsentGivenFragmentTest : BaseUITest() {
fun setup() {
MockKAnnotations.init(this, relaxed = true)
viewModel =
spyk(SubmissionTestResultNoConsentViewModel(submissionRepository))
spyk(SubmissionTestResultNoConsentViewModel(submissionRepository, testResultAvailableNotificationService))
setupMockViewModel(object : SubmissionTestResultNoConsentViewModel.Factory {
override fun create(): SubmissionTestResultNoConsentViewModel = viewModel
})
......
......@@ -45,7 +45,7 @@ class DiagnosisTestResultRetrievalPeriodicWorkerTest {
@Before
fun setUp() {
LocalData.registrationToken("test token")
LocalData.isTestResultNotificationSent(false)
LocalData.isTestResultAvailableNotificationSent(false)
mockkObject(LocalData)
mockkObject(BackgroundWorkScheduler)
......@@ -179,12 +179,12 @@ class DiagnosisTestResultRetrievalPeriodicWorkerTest {
val workInfo = workManager.getWorkInfoById(request.id).get()
if (isCancelTest) {
assertThat(workInfo.state, `is`((WorkInfo.State.CANCELLED)))
assertThat(LocalData.isTestResultNotificationSent(), `is`(false))
assertThat(LocalData.isTestResultAvailableNotificationSent(), `is`(false))
} else {
when (result) {
TestResult.POSITIVE, TestResult.NEGATIVE, TestResult.INVALID -> {
assertThat(workInfo.state, `is`((WorkInfo.State.CANCELLED)))
assertThat(LocalData.isTestResultNotificationSent(), `is`(true))
assertThat(LocalData.isTestResultAvailableNotificationSent(), `is`(true))
}
TestResult.PENDING -> {
assertThat(workInfo.runAttemptCount, `is`(0))
......
......@@ -6,6 +6,6 @@ import de.rki.coronawarnapp.exception.reporting.ReportedException
class CwaSecurityException(cause: Throwable) : ReportedException(
ErrorCodes.CWA_SECURITY_PROBLEM.code,
"Something went wrong during a critical part of the application ensuring security, please refer" +
" to the details for more information",
" to the details for more information",
cause
)
......@@ -18,7 +18,6 @@ object NotificationConstants {
const val DEADMAN_NOTIFICATION_ID: NotificationId = 3
const val NEW_MESSAGE_RISK_LEVEL_SCORE_NOTIFICATION_ID: NotificationId = 110
const val NEW_MESSAGE_TEST_RESULT_NOTIFICATION_ID: NotificationId = 120
const val TEST_RESULT_AVAILABLE_NOTIFICATION_ID: NotificationId = 130
const val INCORRECT_DEVICE_TIME_NOTIFICATION_ID: NotificationId = 140
}
......@@ -13,14 +13,14 @@ typealias NotificationId = Int
class NotificationReceiver : BroadcastReceiver() {
@Inject lateinit var testResultNotificationService: TestResultNotificationService
@Inject lateinit var shareTestResultNotificationService: ShareTestResultNotificationService
override fun onReceive(context: Context, intent: Intent) {
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")
testResultNotificationService.showPositiveTestResultNotification(notificationId)
shareTestResultNotificationService.showSharePositiveTestResultNotification(notificationId)
}
else ->
Timber.tag(TAG).d("NotificationReceiver received an undefined notificationId: %s", notificationId)
......
......@@ -14,16 +14,16 @@ import de.rki.coronawarnapp.util.di.AppContext
import timber.log.Timber
import javax.inject.Inject
class TestResultNotificationService @Inject constructor(
class ShareTestResultNotificationService @Inject constructor(
@AppContext private val context: Context,
private val timeStamper: TimeStamper,
private val notificationHelper: NotificationHelper
) {
fun schedulePositiveTestResultReminder() {
if (LocalData.numberOfRemainingPositiveTestResultReminders < 0) {
fun scheduleSharePositiveTestResultReminder() {
if (LocalData.numberOfRemainingSharePositiveTestResultReminders < 0) {
Timber.v("Schedule positive test result notification")
LocalData.numberOfRemainingPositiveTestResultReminders = POSITIVE_RESULT_NOTIFICATION_TOTAL_COUNT
LocalData.numberOfRemainingSharePositiveTestResultReminders = POSITIVE_RESULT_NOTIFICATION_TOTAL_COUNT
notificationHelper.scheduleRepeatingNotification(
timeStamper.nowUTC.plus(POSITIVE_RESULT_NOTIFICATION_INITIAL_OFFSET),
POSITIVE_RESULT_NOTIFICATION_INTERVAL,
......@@ -34,9 +34,9 @@ class TestResultNotificationService @Inject constructor(
}
}
fun showPositiveTestResultNotification(notificationId: Int) {
if (LocalData.numberOfRemainingPositiveTestResultReminders > 0) {
LocalData.numberOfRemainingPositiveTestResultReminders -= 1
fun showSharePositiveTestResultNotification(notificationId: Int) {
if (LocalData.numberOfRemainingSharePositiveTestResultReminders > 0) {
LocalData.numberOfRemainingSharePositiveTestResultReminders -= 1
val pendingIntent = NavDeepLinkBuilder(context)
.setGraph(R.navigation.nav_graph)
.setComponentName(MainActivity::class.java)
......@@ -54,14 +54,14 @@ class TestResultNotificationService @Inject constructor(
}
}
fun cancelPositiveTestResultNotification() {
fun cancelSharePositiveTestResultNotification() {
notificationHelper.cancelFutureNotifications(POSITIVE_RESULT_NOTIFICATION_ID)
Timber.v("Future positive test result notifications have been canceled")
}
fun resetPositiveTestResultNotification() {
cancelPositiveTestResultNotification()
LocalData.numberOfRemainingPositiveTestResultReminders = Int.MIN_VALUE
fun resetSharePositiveTestResultNotification() {
cancelSharePositiveTestResultNotification()
LocalData.numberOfRemainingSharePositiveTestResultReminders = Int.MIN_VALUE
Timber.v("Positive test result notification counter has been reset")
}
}
......@@ -11,14 +11,14 @@ import kotlinx.coroutines.flow.first
import javax.inject.Inject
import javax.inject.Provider
class TestResultAvailableNotification @Inject constructor(
class TestResultAvailableNotificationService @Inject constructor(
@AppContext private val context: Context,
private val foregroundState: ForegroundState,
private val navDeepLinkBuilderProvider: Provider<NavDeepLinkBuilder>,
private val notificationHelper: NotificationHelper
) {
suspend fun showTestResultNotification(testResult: TestResult) {
suspend fun showTestResultAvailableNotification(testResult: TestResult) {
if (foregroundState.isInForeground.first()) return
val pendingIntent = navDeepLinkBuilderProvider.get().apply {
......@@ -35,7 +35,7 @@ class TestResultAvailableNotification @Inject constructor(
)
}
fun cancelTestResultNotification() {
fun cancelTestResultAvailableNotification() {
notificationHelper.cancelCurrentNotification(NotificationConstants.TEST_RESULT_AVAILABLE_NOTIFICATION_ID)
}
......
......@@ -17,8 +17,6 @@ import timber.log.Timber
*/
object LocalData {
private val TAG: String? = LocalData::class.simpleName
private const val PREFERENCE_INTEROPERABILITY_IS_USED_AT_LEAST_ONCE =
"preference_interoperability_is_used_at_least_once"
......@@ -235,7 +233,7 @@ object LocalData {
*
* @return boolean
*/
fun isTestResultNotificationSent(): Boolean {
fun isTestResultAvailableNotificationSent(): Boolean {
return getSharedPreferenceInstance().getBoolean(
CoronaWarnApplication.getAppContext()
.getString(R.string.preference_test_result_notification),
......@@ -249,7 +247,7 @@ object LocalData {
*
* @param value boolean
*/
fun isTestResultNotificationSent(value: Boolean) =
fun isTestResultAvailableNotificationSent(value: Boolean) =
getSharedPreferenceInstance().edit(true) {
putBoolean(
CoronaWarnApplication.getAppContext()
......@@ -338,7 +336,7 @@ object LocalData {
}
private const val PKEY_POSITIVE_TEST_RESULT_REMINDER_COUNT = "preference_positive_test_result_reminder_count"
var numberOfRemainingPositiveTestResultReminders: Int
var numberOfRemainingSharePositiveTestResultReminders: Int
get() = getSharedPreferenceInstance().getInt(PKEY_POSITIVE_TEST_RESULT_REMINDER_COUNT, Int.MIN_VALUE)
set(value) = getSharedPreferenceInstance().edit(true) {
putInt(PKEY_POSITIVE_TEST_RESULT_REMINDER_COUNT, value)
......@@ -354,18 +352,6 @@ object LocalData {
false
)
/**
* Toggles the decision if background jobs are enabled
*
*/
fun toggleBackgroundJobEnabled() = getSharedPreferenceInstance().edit(true) {
putBoolean(
CoronaWarnApplication.getAppContext()
.getString(R.string.preference_background_job_allowed),
!isBackgroundJobEnabled()
)
}
/**
* Gets the boolean if the user has mobile data enabled
*
......@@ -376,18 +362,6 @@ object LocalData {
false
)
/**
* Toggles the boolean if the user has mobile data enabled
*
*/
fun toggleMobileDataEnabled() = getSharedPreferenceInstance().edit(true) {
putBoolean(
CoronaWarnApplication.getAppContext()
.getString(R.string.preference_mobile_data_allowed),
!isMobileDataEnabled()
)
}
/****************************************************
* SUBMISSION DATA
****************************************************/
......@@ -516,6 +490,7 @@ object LocalData {
}
fun clear() {
// If you make use of a FlowPreference, you need to manually clear it here
Timber.w("LocalData.clear()")
}
}
......@@ -164,6 +164,9 @@ class SubmissionRepository @Inject constructor(
}
}
suspend fun asyncRequestTestResult(registrationToken: String): TestResult =
submissionService.asyncRequestTestResult(registrationToken)
private suspend fun fetchTestResult(registrationToken: String): DeviceUIState = try {
val testResult = submissionService.asyncRequestTestResult(registrationToken)
updateTestResult(testResult)
......@@ -181,7 +184,7 @@ class SubmissionRepository @Inject constructor(
LocalData.initialPollingForTestResultTimeStamp(0L)
LocalData.initialTestResultReceivedTimestamp(0L)
LocalData.isAllowedToSubmitDiagnosisKeys(false)
LocalData.isTestResultNotificationSent(false)
LocalData.isTestResultAvailableNotificationSent(false)
}
private fun deriveUiState(testResult: TestResult?): DeviceUIState = when (testResult) {
......
......@@ -3,8 +3,8 @@ package de.rki.coronawarnapp.submission.task
import com.google.android.gms.nearby.exposurenotification.TemporaryExposureKey
import de.rki.coronawarnapp.appconfig.AppConfigProvider
import de.rki.coronawarnapp.exception.NoRegistrationTokenSetException
import de.rki.coronawarnapp.notification.TestResultAvailableNotification
import de.rki.coronawarnapp.notification.TestResultNotificationService
import de.rki.coronawarnapp.notification.ShareTestResultNotificationService
import de.rki.coronawarnapp.notification.TestResultAvailableNotificationService
import de.rki.coronawarnapp.playbook.Playbook
import de.rki.coronawarnapp.storage.LocalData
import de.rki.coronawarnapp.submission.SubmissionSettings
......@@ -34,8 +34,8 @@ class SubmissionTask @Inject constructor(
private val submissionSettings: SubmissionSettings,
private val autoSubmission: AutoSubmission,
private val timeStamper: TimeStamper,
private val testResultNotificationService: TestResultNotificationService,
private val testResultAvailableNotification: TestResultAvailableNotification
private val shareTestResultNotificationService: ShareTestResultNotificationService,
private val testResultAvailableNotificationService: TestResultAvailableNotificationService
) : Task<DefaultProgress, SubmissionTask.Result> {
private val internalProgress = ConflatedBroadcastChannel<DefaultProgress>()
......@@ -155,8 +155,8 @@ class SubmissionTask @Inject constructor(
BackgroundWorkScheduler.stopWorkScheduler()
LocalData.numberOfSuccessfulSubmissions(1)
testResultNotificationService.cancelPositiveTestResultNotification()
testResultAvailableNotification.cancelTestResultNotification()
shareTestResultNotificationService.cancelSharePositiveTestResultNotification()
testResultAvailableNotificationService.cancelTestResultAvailableNotification()
}
data class Arguments(
......
......@@ -6,7 +6,7 @@ import androidx.navigation.NavDirections
import com.squareup.inject.assisted.AssistedInject
import de.rki.coronawarnapp.appconfig.AppConfigProvider
import de.rki.coronawarnapp.main.CWASettings
import de.rki.coronawarnapp.notification.TestResultNotificationService
import de.rki.coronawarnapp.notification.ShareTestResultNotificationService
import de.rki.coronawarnapp.risk.TimeVariables
import de.rki.coronawarnapp.storage.LocalData
import de.rki.coronawarnapp.storage.TracingRepository
......@@ -71,7 +71,7 @@ class HomeFragmentViewModel @AssistedInject constructor(
tracingStateProviderFactory: TracingStateProvider.Factory,
submissionStateProvider: SubmissionStateProvider,
private val tracingRepository: TracingRepository,
private val testResultNotificationService: TestResultNotificationService,
private val shareTestResultNotificationService: ShareTestResultNotificationService,
private val submissionRepository: SubmissionRepository,
private val cwaSettings: CWASettings,
appConfigProvider: AppConfigProvider
......@@ -241,7 +241,7 @@ class HomeFragmentViewModel @AssistedInject constructor(
}
}
}
.also { testResultNotificationService.schedulePositiveTestResultReminder() }
.also { shareTestResultNotificationService.scheduleSharePositiveTestResultReminder() }
}
// TODO only lazy to keep tests going which would break because of LocalData access
......
......@@ -5,7 +5,7 @@ import com.squareup.inject.assisted.AssistedInject
import de.rki.coronawarnapp.exception.ExceptionCategory
import de.rki.coronawarnapp.exception.reporting.report
import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient
import de.rki.coronawarnapp.notification.TestResultNotificationService
import de.rki.coronawarnapp.notification.ShareTestResultNotificationService
import de.rki.coronawarnapp.submission.SubmissionRepository
import de.rki.coronawarnapp.ui.SingleLiveEvent
import de.rki.coronawarnapp.util.DataReset
......@@ -17,7 +17,7 @@ import de.rki.coronawarnapp.worker.BackgroundWorkScheduler
class SettingsResetViewModel @AssistedInject constructor(
dispatcherProvider: DispatcherProvider,
private val dataReset: DataReset,
private val testResultNotificationService: TestResultNotificationService,
private val shareTestResultNotificationService: ShareTestResultNotificationService,
private val submissionRepository: SubmissionRepository
) : CWAViewModel(dispatcherProvider = dispatcherProvider) {
......@@ -45,7 +45,7 @@ class SettingsResetViewModel @AssistedInject constructor(
ExceptionCategory.EXPOSURENOTIFICATION, TAG, null
)
}
testResultNotificationService.resetPositiveTestResultNotification()
shareTestResultNotificationService.resetSharePositiveTestResultNotification()
dataReset.clearAllLocalData()
clickEvent.postValue(SettingsEvents.GoToOnboarding)
......
......@@ -21,7 +21,7 @@ import javax.inject.Inject
class SubmissionTestResultInvalidFragment : Fragment(R.layout.fragment_submission_test_result_invalid), AutoInject {
@Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory
private val vm: SubmissionTestResultInvalidViewModel by cwaViewModels { viewModelFactory }
private val viewModel: SubmissionTestResultInvalidViewModel by cwaViewModels { viewModelFactory }
private val binding: FragmentSubmissionTestResultInvalidBinding by viewBindingLazy()
......@@ -33,11 +33,11 @@ class SubmissionTestResultInvalidFragment : Fragment(R.layout.fragment_submissio
submissionTestResultHeader.headerButtonBack.buttonIcon.setOnClickListener { popBackStack() }
}
vm.testResult.observe2(this) {
viewModel.testResult.observe2(this) {
binding.submissionTestResultSection.setTestResultSection(it.deviceUiState, it.testResultReceivedDate)
}
vm.routeToScreen.observe2(this) { navDirections ->
viewModel.routeToScreen.observe2(this) { navDirections ->
navDirections?.let { doNavigate(it) } ?: popBackStack()
}
}
......@@ -45,6 +45,7 @@ class SubmissionTestResultInvalidFragment : Fragment(R.layout.fragment_submissio
override fun onResume() {
super.onResume()
binding.submissionTestResultContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT)
viewModel.onTestOpened()
}
private fun removeTestAfterConfirmation() {
......@@ -55,7 +56,7 @@ class SubmissionTestResultInvalidFragment : Fragment(R.layout.fragment_submissio
R.string.submission_test_result_dialog_remove_test_button_positive,
R.string.submission_test_result_dialog_remove_test_button_negative,
positiveButtonFunction = {
vm.deregisterTestFromDevice()
viewModel.deregisterTestFromDevice()
}
)
DialogHelper.showDialog(removeTestDialog).apply {
......
......@@ -4,6 +4,7 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.asLiveData
import androidx.navigation.NavDirections
import com.squareup.inject.assisted.AssistedInject
import de.rki.coronawarnapp.notification.TestResultAvailableNotificationService
import de.rki.coronawarnapp.submission.SubmissionRepository
import de.rki.coronawarnapp.ui.submission.testresult.TestResultUIState
import de.rki.coronawarnapp.util.coroutine.DispatcherProvider
......@@ -15,7 +16,8 @@ import timber.log.Timber
class SubmissionTestResultInvalidViewModel @AssistedInject constructor(
dispatcherProvider: DispatcherProvider,
private val submissionRepository: SubmissionRepository
private val submissionRepository: SubmissionRepository,
private val testResultAvailableNotificationService: TestResultAvailableNotificationService
) : CWAViewModel(dispatcherProvider = dispatcherProvider) {
val routeToScreen = SingleLiveEvent<NavDirections?>()
......@@ -39,6 +41,11 @@ class SubmissionTestResultInvalidViewModel @AssistedInject constructor(
}
}
fun onTestOpened() {
submissionRepository.setViewedTestResult()
testResultAvailableNotificationService.cancelTestResultAvailableNotification()
}
@AssistedInject.Factory
interface Factory : SimpleCWAViewModelFactory<SubmissionTestResultInvalidViewModel>
}
......@@ -21,7 +21,7 @@ import javax.inject.Inject
class SubmissionTestResultNegativeFragment : Fragment(R.layout.fragment_submission_test_result_negative), AutoInject {
@Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory
private val vm: SubmissionTestResultNegativeViewModel by cwaViewModels { viewModelFactory }
private val viewModel: SubmissionTestResultNegativeViewModel by cwaViewModels { viewModelFactory }
private val binding: FragmentSubmissionTestResultNegativeBinding by viewBindingLazy()
......@@ -33,11 +33,11 @@ class SubmissionTestResultNegativeFragment : Fragment(R.layout.fragment_submissi
submissionTestResultHeader.headerButtonBack.buttonIcon.setOnClickListener { popBackStack() }
}
vm.testResult.observe2(this) {
viewModel.testResult.observe2(this) {
binding.submissionTestResultSection.setTestResultSection(it.deviceUiState, it.testResultReceivedDate)
}
vm.routeToScreen.observe2(this) { navDirections ->
viewModel.routeToScreen.observe2(this) { navDirections ->
navDirections?.let { doNavigate(it) } ?: popBackStack()
}
}
......@@ -45,6 +45,7 @@ class SubmissionTestResultNegativeFragment : Fragment(R.layout.fragment_submissi
override fun onResume() {
super.onResume()
binding.submissionTestResultContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT)
viewModel.onTestOpened()
}
private fun removeTestAfterConfirmation() {
......@@ -55,7 +56,7 @@ class SubmissionTestResultNegativeFragment : Fragment(R.layout.fragment_submissi
R.string.submission_test_result_dialog_remove_test_button_positive,
R.string.submission_test_result_dialog_remove_test_button_negative,
positiveButtonFunction = {
vm.deregisterTestFromDevice()
viewModel.deregisterTestFromDevice()
}
)
DialogHelper.showDialog(removeTestDialog).apply {
......
......@@ -4,6 +4,7 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.asLiveData
import androidx.navigation.NavDirections
import com.squareup.inject.assisted.AssistedInject
import de.rki.coronawarnapp.notification.TestResultAvailableNotificationService
import de.rki.coronawarnapp.submission.SubmissionRepository
import de.rki.coronawarnapp.ui.submission.testresult.TestResultUIState
import de.rki.coronawarnapp.util.coroutine.DispatcherProvider
......@@ -15,7 +16,8 @@ import timber.log.Timber
class SubmissionTestResultNegativeViewModel @AssistedInject constructor(
dispatcherProvider: DispatcherProvider,
private val submissionRepository: SubmissionRepository
private val submissionRepository: SubmissionRepository,
private val testResultAvailableNotificationService: TestResultAvailableNotificationService
) : CWAViewModel(dispatcherProvider = dispatcherProvider) {
val routeToScreen = SingleLiveEvent<NavDirections?>()
......@@ -38,6 +40,11 @@ class SubmissionTestResultNegativeViewModel @AssistedInject constructor(
}
}
fun onTestOpened() {
submissionRepository.setViewedTestResult()
testResultAvailableNotificationService.cancelTestResultAvailableNotification()
}
@AssistedInject.Factory
interface Factory : SimpleCWAViewModelFactory<SubmissionTestResultNegativeViewModel>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment