diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentTest.kt index a16a8dbe7470081881f075d046ef1267fa597e7d..6e3fd5cbb19531773ee4cfba240a3715161453df 100644 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentTest.kt +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentTest.kt @@ -86,6 +86,7 @@ class HomeFragmentTest : BaseUITest() { every { showLoweredRiskLevelDialog } returns MutableLiveData() every { homeItems } returns MutableLiveData(emptyList()) every { popupEvents } returns SingleLiveEvent() + every { showPopUpsOrNavigate() } just Runs } setupMockViewModel( diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragment.kt index f5236041c850c55a5bd3cae3d520a28d8a67a36f..296ebc8ee56512f41f0242bc7514e700ea6281b1 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragment.kt @@ -115,6 +115,8 @@ class HomeFragment : Fragment(R.layout.home_fragment_layout), AutoInject { } } + vm.showPopUpsOrNavigate() + vm.showLoweredRiskLevelDialog.observe2(this) { if (it) showRiskLevelLoweredDialog() } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentViewModel.kt index 559d1ef7e6099d14e91db50b44e1dce1be67d024..f2502663c5fe48039b84a2ed7666763a50474208 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentViewModel.kt @@ -91,14 +91,20 @@ class HomeFragmentViewModel @AssistedInject constructor( .map { it.toHeaderState() } .asLiveData(dispatcherProvider.Default) - val popupEvents: SingleLiveEvent<HomeFragmentEvents> by lazy { - SingleLiveEvent<HomeFragmentEvents>().apply { - if (!LocalData.isInteroperabilityShownAtLeastOnce) { - postValue(ShowInteropDeltaOnboarding) - } else { + val popupEvents = SingleLiveEvent<HomeFragmentEvents>() + + fun showPopUpsOrNavigate() { + when { + !LocalData.isInteroperabilityShownAtLeastOnce -> { + popupEvents.postValue(ShowInteropDeltaOnboarding) + } + cwaSettings.lastChangelogVersion.value < BuildConfigWrap.VERSION_CODE -> { + popupEvents.postValue(HomeFragmentEvents.ShowNewReleaseFragment) + } + else -> { launch { if (!LocalData.tracingExplanationDialogWasShown()) { - postValue( + popupEvents.postValue( ShowTracingExplanation( TimeVariables.getActiveTracingDaysInRetentionPeriod() ) @@ -107,13 +113,10 @@ class HomeFragmentViewModel @AssistedInject constructor( } launch { if (errorResetTool.isResetNoticeToBeShown) { - postValue(ShowErrorResetDialog) + popupEvents.postValue(ShowErrorResetDialog) } } } - if (cwaSettings.lastChangelogVersion.value < BuildConfigWrap.VERSION_CODE) { - postValue(HomeFragmentEvents.ShowNewReleaseFragment) - } } } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/main/home/HomeFragmentViewModelTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/main/home/HomeFragmentViewModelTest.kt index f0361f63d6ede3955ee581c3358ac21d04908e3c..2c06be47afc1095049636f2238b486ea8355b5f1 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/main/home/HomeFragmentViewModelTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/main/home/HomeFragmentViewModelTest.kt @@ -2,9 +2,12 @@ package de.rki.coronawarnapp.main.home import android.content.Context import de.rki.coronawarnapp.appconfig.AppConfigProvider +import de.rki.coronawarnapp.environment.BuildConfigWrap import de.rki.coronawarnapp.main.CWASettings import de.rki.coronawarnapp.notification.ShareTestResultNotificationService +import de.rki.coronawarnapp.risk.TimeVariables import de.rki.coronawarnapp.statistics.source.StatisticsProvider +import de.rki.coronawarnapp.storage.LocalData import de.rki.coronawarnapp.storage.TracingRepository import de.rki.coronawarnapp.submission.SubmissionRepository import de.rki.coronawarnapp.submission.ui.homecards.SubmissionDone @@ -14,6 +17,7 @@ import de.rki.coronawarnapp.tracing.GeneralTracingStatus.Status import de.rki.coronawarnapp.tracing.states.LowRisk import de.rki.coronawarnapp.tracing.states.TracingStateProvider import de.rki.coronawarnapp.tracing.ui.statusbar.TracingHeaderState +import de.rki.coronawarnapp.ui.main.home.HomeFragmentEvents import de.rki.coronawarnapp.ui.main.home.HomeFragmentViewModel import de.rki.coronawarnapp.util.DeviceUIState.PAIRED_POSITIVE import de.rki.coronawarnapp.util.DeviceUIState.PAIRED_POSITIVE_TELETAN @@ -27,6 +31,7 @@ import io.mockk.coVerify import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.mockk +import io.mockk.mockkObject import io.mockk.verify import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.flow @@ -40,6 +45,7 @@ import testhelpers.BaseTest import testhelpers.TestDispatcherProvider import testhelpers.extensions.CoroutinesTestExtension import testhelpers.extensions.InstantExecutorExtension +import testhelpers.extensions.getOrAwaitValue import testhelpers.extensions.observeForTesting @ExtendWith(InstantExecutorExtension::class, CoroutinesTestExtension::class) @@ -169,4 +175,35 @@ class HomeFragmentViewModelTest : BaseTest() { } } } + + @Test + fun `test correct order of displaying delta onboarding, release notes and popups`() { + + mockkObject(LocalData) + every { LocalData.isInteroperabilityShownAtLeastOnce } returns false andThen true + + mockkObject(BuildConfigWrap) + every { BuildConfigWrap.VERSION_CODE } returns 1120004 + every { cwaSettings.lastChangelogVersion.value } returns 1L andThen 1120004 + + every { LocalData.tracingExplanationDialogWasShown() } returns false andThen true + mockkObject(TimeVariables) + coEvery { TimeVariables.getActiveTracingDaysInRetentionPeriod() } coAnswers { 1 } + + every { errorResetTool.isResetNoticeToBeShown } returns false andThen true + + with(createInstance()) { + showPopUpsOrNavigate() + popupEvents.getOrAwaitValue() shouldBe HomeFragmentEvents.ShowInteropDeltaOnboarding + + showPopUpsOrNavigate() + popupEvents.getOrAwaitValue() shouldBe HomeFragmentEvents.ShowNewReleaseFragment + + showPopUpsOrNavigate() + popupEvents.getOrAwaitValue() shouldBe HomeFragmentEvents.ShowTracingExplanation(1) + + showPopUpsOrNavigate() + popupEvents.getOrAwaitValue() shouldBe HomeFragmentEvents.ShowErrorResetDialog + } + } }