diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/vaccination/VaccinationConsentFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/vaccination/VaccinationConsentFragmentTest.kt index d3538b7baa72a237e1db4c78e08b85b38cb54e32..280bb1d9cb34dc1f474d92b548a24b4acdaee37c 100644 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/vaccination/VaccinationConsentFragmentTest.kt +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/vaccination/VaccinationConsentFragmentTest.kt @@ -4,6 +4,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import dagger.Module import dagger.android.ContributesAndroidInjector import de.rki.coronawarnapp.vaccination.ui.consent.VaccinationConsentFragment +import de.rki.coronawarnapp.vaccination.ui.consent.VaccinationConsentFragmentArgs import de.rki.coronawarnapp.vaccination.ui.consent.VaccinationConsentViewModel import io.mockk.MockKAnnotations import io.mockk.impl.annotations.MockK @@ -22,6 +23,10 @@ class VaccinationConsentFragmentTest : BaseUITest() { @MockK lateinit var viewModel: VaccinationConsentViewModel + private val fragmentArgs = VaccinationConsentFragmentArgs( + showBottomNav = false + ).toBundle() + @Before fun setup() { MockKAnnotations.init(this, relaxed = true) @@ -40,13 +45,13 @@ class VaccinationConsentFragmentTest : BaseUITest() { @Test fun launch_fragment() { - launchFragment2<VaccinationConsentFragment>() + launchFragment2<VaccinationConsentFragment>(fragmentArgs) } @Screenshot @Test fun capture_screenshot() { - launchFragmentInContainer2<VaccinationConsentFragment>() + launchFragmentInContainer2<VaccinationConsentFragment>(fragmentArgs) takeScreenshot<VaccinationConsentFragment>() } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivity.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivity.kt index a904424325d1aab4f56e3beb6a5bfe6e6451cd04..698550e696ba035b1021e37c0eb0cb3eec7329c2 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivity.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivity.kt @@ -11,7 +11,6 @@ import androidx.core.net.toUri import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.navigation.NavController -import androidx.navigation.NavGraph import com.google.android.material.bottomnavigation.BottomNavigationView import dagger.android.AndroidInjector import dagger.android.DispatchingAndroidInjector @@ -33,6 +32,7 @@ import de.rki.coronawarnapp.util.device.PowerManagement import de.rki.coronawarnapp.util.di.AppInjector import de.rki.coronawarnapp.util.shortcuts.AppShortcutsHelper.Companion.getShortcutExtra import de.rki.coronawarnapp.util.ui.findNavController +import de.rki.coronawarnapp.util.ui.findNestedGraph import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider import de.rki.coronawarnapp.util.viewmodel.cwaViewModels import org.joda.time.LocalDate @@ -98,6 +98,9 @@ class MainActivity : AppCompatActivity(), HasAndroidInjector { vm.isTraceLocationOnboardingDone.observe(this) { isOnboardingDone -> startTraceLocationNestedGraphDestination(navController, isOnboardingDone) } + vm.isVaccinationConsentGiven.observe(this) { isConsentGiven -> + startCertificatesNestedGraphDestination(navController, isConsentGiven) + } vm.activeCheckIns.observe(this) { count -> val targetId = R.id.trace_location_attendee_nav_graph @@ -134,7 +137,7 @@ class MainActivity : AppCompatActivity(), HasAndroidInjector { private fun goToContactJournal() { findViewById<BottomNavigationView>(R.id.main_bottom_navigation).selectedItemId = R.id.contact_diary_nav_graph - val nestedGraph = navController.graph.findNode(R.id.contact_diary_nav_graph) as NavGraph + val nestedGraph = navController.findNestedGraph(R.id.contact_diary_nav_graph) if (vm.isContactDiaryOnboardingDone.value == true) { nestedGraph.startDestination = R.id.contactDiaryOverviewFragment @@ -150,8 +153,7 @@ class MainActivity : AppCompatActivity(), HasAndroidInjector { } private fun startContactDiaryNestedGraphDestination(navController: NavController, isOnboardingDone: Boolean) { - val nestedGraph = navController.graph.findNode(R.id.contact_diary_nav_graph) as NavGraph - nestedGraph.startDestination = if (isOnboardingDone) { + navController.findNestedGraph(R.id.contact_diary_nav_graph).startDestination = if (isOnboardingDone) { R.id.contactDiaryOverviewFragment } else { R.id.contactDiaryOnboardingFragment @@ -159,14 +161,21 @@ class MainActivity : AppCompatActivity(), HasAndroidInjector { } private fun startTraceLocationNestedGraphDestination(navController: NavController, isOnboardingDone: Boolean) { - val nestedGraph = navController.graph.findNode(R.id.trace_location_attendee_nav_graph) as NavGraph - nestedGraph.startDestination = if (isOnboardingDone) { + navController.findNestedGraph(R.id.trace_location_attendee_nav_graph).startDestination = if (isOnboardingDone) { R.id.checkInsFragment } else { R.id.checkInOnboardingFragment } } + private fun startCertificatesNestedGraphDestination(navController: NavController, isConsentGiven: Boolean) { + navController.findNestedGraph(R.id.green_certificate_graph).startDestination = if (isConsentGiven) { + R.id.certificatesFragment + } else { + R.id.vaccinationConsentFragment + } + } + private fun navigateByIntentUri(intent: Intent?) { val uriString = intent?.data?.toString() ?: return Timber.i("Uri:$uriString") 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 56be20d23c843e80e7d4eec1e9eaa3f7cd2ce16c..7952b2e729d07b2ad1c0ea5151f75772c7cd3b7d 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 @@ -17,6 +17,7 @@ import de.rki.coronawarnapp.util.device.BackgroundModeStatus import de.rki.coronawarnapp.util.ui.SingleLiveEvent import de.rki.coronawarnapp.util.viewmodel.CWAViewModel import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory +import de.rki.coronawarnapp.vaccination.core.VaccinationSettings import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map @@ -29,6 +30,7 @@ class MainActivityViewModel @AssistedInject constructor( private val backgroundNoise: BackgroundNoise, private val onboardingSettings: OnboardingSettings, private val traceLocationSettings: TraceLocationSettings, + private val vaccinationSettings: VaccinationSettings, checkInRepository: CheckInRepository ) : CWAViewModel( dispatcherProvider = dispatcherProvider @@ -42,6 +44,8 @@ class MainActivityViewModel @AssistedInject constructor( val isContactDiaryOnboardingDone: LiveData<Boolean> = mutableIsContactDiaryOnboardingDone private val mutableIsTraceLocationOnboardingDone = MutableLiveData<Boolean>() val isTraceLocationOnboardingDone: LiveData<Boolean> = mutableIsTraceLocationOnboardingDone + private val mutableIsVaccinationConsentGiven = MutableLiveData<Boolean>() + val isVaccinationConsentGiven: LiveData<Boolean> = mutableIsVaccinationConsentGiven val activeCheckIns = checkInRepository.checkInsWithinRetention .map { checkins -> checkins.filter { !it.completed }.size } @@ -84,6 +88,7 @@ class MainActivityViewModel @AssistedInject constructor( fun onBottomNavSelected() { mutableIsContactDiaryOnboardingDone.value = contactDiarySettings.isOnboardingDone mutableIsTraceLocationOnboardingDone.value = traceLocationSettings.isOnboardingDone + mutableIsVaccinationConsentGiven.value = vaccinationSettings.registrationAcknowledged } private suspend fun checkForEnergyOptimizedEnabled() { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ui/FragmentExtensions.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ui/FragmentExtensions.kt index 95b2fa47fdf7eca2f5b64ca3a4c471423d22f511..201d6c9a9b78f09b1900bfe516a94d53a08b610f 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ui/FragmentExtensions.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ui/FragmentExtensions.kt @@ -43,7 +43,4 @@ fun FragmentManager.findNavController(@IdRes id: Int): NavController { * @param nestedGraphId * @throws IllegalArgumentException if graph not found */ -fun Fragment.findNestedGraph(@IdRes nestedGraphId: Int): NavGraph { - return findNavController().graph.findNode(nestedGraphId) as? NavGraph - ?: throw IllegalArgumentException("Nested graph with id=$nestedGraphId not found") -} +fun Fragment.findNestedGraph(@IdRes nestedGraphId: Int) = findNavController().findNestedGraph(nestedGraphId) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ui/NavigationControllerExtensions.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ui/NavigationControllerExtensions.kt new file mode 100644 index 0000000000000000000000000000000000000000..f8c15359974e23e305b3f5fabebacb5c075b5225 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/ui/NavigationControllerExtensions.kt @@ -0,0 +1,15 @@ +package de.rki.coronawarnapp.util.ui + +import androidx.annotation.IdRes +import androidx.navigation.NavController +import androidx.navigation.NavGraph + +/** + * Finds nested graph [NavGraph] by Id. + * @param nestedGraphId + * @throws IllegalArgumentException if graph not found + */ +fun NavController.findNestedGraph(@IdRes nestedGraphId: Int): NavGraph { + return graph.findNode(nestedGraphId) as? NavGraph + ?: throw IllegalArgumentException("Nested graph with id=$nestedGraphId not found") +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/consent/VaccinationConsentFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/consent/VaccinationConsentFragment.kt index 8d748c1ea091392fb40c6c762290a38c86e3c5bd..b19db038c8926c515f017f2cdff8a8e6436bbd55 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/consent/VaccinationConsentFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/consent/VaccinationConsentFragment.kt @@ -3,8 +3,10 @@ package de.rki.coronawarnapp.vaccination.ui.consent import android.os.Bundle import android.view.View import androidx.fragment.app.Fragment +import androidx.navigation.fragment.navArgs import de.rki.coronawarnapp.R import de.rki.coronawarnapp.databinding.VaccinationConsentFragmentBinding +import de.rki.coronawarnapp.util.ContextExtensions.getDrawableCompat import de.rki.coronawarnapp.util.di.AutoInject import de.rki.coronawarnapp.util.ui.doNavigate import de.rki.coronawarnapp.util.ui.observe2 @@ -18,11 +20,17 @@ class VaccinationConsentFragment : Fragment(R.layout.vaccination_consent_fragmen @Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory private val viewModel: VaccinationConsentViewModel by cwaViewModels { viewModelFactory } - private val binding: VaccinationConsentFragmentBinding by viewBinding() + private val args by navArgs<VaccinationConsentFragmentArgs>() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { with(binding) { + if (!args.showBottomNav) { + toolbar.apply { + navigationIcon = context.getDrawableCompat(R.drawable.ic_close) + navigationContentDescription = getString(R.string.accessibility_close) + } + } toolbar.setNavigationOnClickListener { popBackStack() } vaccinationConsentPrivacyInformation.setOnClickListener { viewModel.onDataPrivacyClick() @@ -35,10 +43,16 @@ class VaccinationConsentFragment : Fragment(R.layout.vaccination_consent_fragmen viewModel.routeToScreen.observe2(this) { when (it) { VaccinationConsentNavigationEvent.NavigateToDataPrivacy -> { - doNavigate(VaccinationConsentFragmentDirections.vaccinationConsentFragmentToPrivacyFragment()) + doNavigate( + VaccinationConsentFragmentDirections + .actionVaccinationConsentFragmentToPrivacyFragment() + ) } - VaccinationConsentNavigationEvent.NavigateToQrCodeScan -> { - doNavigate(VaccinationConsentFragmentDirections.vaccinationConsentFragmentToQrCodeFragment()) + VaccinationConsentNavigationEvent.NavigateToCertificates -> { + doNavigate( + VaccinationConsentFragmentDirections + .actionVaccinationConsentFragmentToCertificatesFragment() + ) } } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/consent/VaccinationConsentNavigationEvent.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/consent/VaccinationConsentNavigationEvent.kt index 857961da745313016d72958aafe98b43dc90c016..865937c0df0906298bf6d610cf6c658645ca0094 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/consent/VaccinationConsentNavigationEvent.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/consent/VaccinationConsentNavigationEvent.kt @@ -2,5 +2,5 @@ package de.rki.coronawarnapp.vaccination.ui.consent sealed class VaccinationConsentNavigationEvent { object NavigateToDataPrivacy : VaccinationConsentNavigationEvent() - object NavigateToQrCodeScan : VaccinationConsentNavigationEvent() + object NavigateToCertificates : VaccinationConsentNavigationEvent() } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/consent/VaccinationConsentViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/consent/VaccinationConsentViewModel.kt index 2db0683a5df93b44f05ae108a4895c3af6945bf9..28327dfb7eacbd5c5aa09b3d2c419802570051b6 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/consent/VaccinationConsentViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/consent/VaccinationConsentViewModel.kt @@ -17,7 +17,7 @@ class VaccinationConsentViewModel @AssistedInject constructor( fun onConsentClick() { vaccinationSettings.registrationAcknowledged = true - routeToScreen.postValue(VaccinationConsentNavigationEvent.NavigateToQrCodeScan) + routeToScreen.postValue(VaccinationConsentNavigationEvent.NavigateToCertificates) } fun onDataPrivacyClick() { diff --git a/Corona-Warn-App/src/main/res/layout/vaccination_consent_fragment.xml b/Corona-Warn-App/src/main/res/layout/vaccination_consent_fragment.xml index d5be7b0a3b24368bfe07a8d32907e6181e4a0402..340a37d67711f201d31569b43ee49985906fc420 100644 --- a/Corona-Warn-App/src/main/res/layout/vaccination_consent_fragment.xml +++ b/Corona-Warn-App/src/main/res/layout/vaccination_consent_fragment.xml @@ -9,7 +9,6 @@ <com.google.android.material.appbar.MaterialToolbar android:id="@+id/toolbar" - style="@style/CWAToolbar.Close.Transparent" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintEnd_toEndOf="parent" @@ -36,6 +35,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="32dp" + android:layout_marginEnd="@dimen/spacing_normal" android:importantForAccessibility="no" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/Corona-Warn-App/src/main/res/layout/vaccination_consent_privacy_card.xml b/Corona-Warn-App/src/main/res/layout/vaccination_consent_privacy_card.xml index ef10beac86e3e580bf76f193ca18a9e36e13bc6d..d2506ee021dec6e618e2bd52f6972fbf37c75a64 100644 --- a/Corona-Warn-App/src/main/res/layout/vaccination_consent_privacy_card.xml +++ b/Corona-Warn-App/src/main/res/layout/vaccination_consent_privacy_card.xml @@ -8,7 +8,7 @@ <TextView android:id="@+id/vaccination_consent_legal_text_card_title" - style="@style/subtitleBoldSixteen" + style="@style/headline5" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_small" diff --git a/Corona-Warn-App/src/main/res/navigation/green_certificate_graph.xml b/Corona-Warn-App/src/main/res/navigation/green_certificate_graph.xml index fda8b2254b66cc1d62d8fde2415abb5dc97b4943..ade2e9c6300f39e188f9f5397e1f9646261c3227 100644 --- a/Corona-Warn-App/src/main/res/navigation/green_certificate_graph.xml +++ b/Corona-Warn-App/src/main/res/navigation/green_certificate_graph.xml @@ -10,4 +10,30 @@ android:name="de.rki.coronawarnapp.greencertificate.ui.certificates.CertificatesFragment" android:label="fragment_certificates" tools:layout="@layout/fragment_certificates" /> + + <fragment + android:id="@+id/vaccinationConsentFragment" + android:name="de.rki.coronawarnapp.vaccination.ui.consent.VaccinationConsentFragment" + android:label="vaccination_consent_fragment" + tools:layout="@layout/vaccination_consent_fragment" > + <argument + android:name="showBottomNav" + android:defaultValue="true" + app:argType="boolean" /> + <action + android:id="@+id/action_vaccinationConsentFragment_to_certificatesFragment" + app:destination="@id/certificatesFragment" + app:popUpTo="@id/vaccinationConsentFragment" + app:popUpToInclusive="true" /> + <action + android:id="@+id/action_vaccinationConsentFragment_to_privacyFragment" + app:destination="@id/privacyFragment" /> + </fragment> + + <fragment + android:id="@+id/privacyFragment" + android:name="de.rki.coronawarnapp.ui.information.InformationPrivacyFragment" + android:label="privacyFragment" + tools:layout="@layout/fragment_information_privacy" /> + </navigation> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/navigation/vaccination_nav_graph.xml b/Corona-Warn-App/src/main/res/navigation/vaccination_nav_graph.xml index d46c28fca152cfb33db836e9ceb002a131a4be42..74ba33a60f5af566e4f12927b5e33765ad4e985d 100644 --- a/Corona-Warn-App/src/main/res/navigation/vaccination_nav_graph.xml +++ b/Corona-Warn-App/src/main/res/navigation/vaccination_nav_graph.xml @@ -3,22 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/vaccination_nav_graph" - app:startDestination="@id/vaccinationConsentFragment"> - - <fragment - android:id="@+id/vaccinationConsentFragment" - android:name="de.rki.coronawarnapp.vaccination.ui.consent.VaccinationConsentFragment" - android:label="VaccinationConsentFragment" - tools:layout="@layout/vaccination_consent_fragment"> - <action - android:id="@+id/vaccinationConsentFragment_to_privacyFragment" - app:destination="@id/privacyFragment" /> - <action - android:id="@+id/vaccinationConsentFragment_to_QrCodeFragment" - app:destination="@id/vaccinationQrCodeScanFragment" - app:popUpTo="@id/vaccinationConsentFragment" - app:popUpToInclusive="true" /> - </fragment> + app:startDestination="@id/vaccinationListFragment"> <fragment android:id="@+id/vaccinationQrCodeScanFragment" @@ -60,9 +45,4 @@ app:argType="string" /> </fragment> - <fragment - android:id="@+id/privacyFragment" - android:name="de.rki.coronawarnapp.ui.information.InformationPrivacyFragment" - android:label="privacyFragment" - tools:layout="@layout/fragment_information_privacy" /> </navigation> diff --git a/Corona-Warn-App/src/main/res/values-de/legal_strings.xml b/Corona-Warn-App/src/main/res/values-de/legal_strings.xml index 8b6fe987ca2a6c133e6f23b36ff42e1cc50010bd..611ae6308936b572d4fe798543bdcaa7fc3c668c 100644 --- a/Corona-Warn-App/src/main/res/values-de/legal_strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/legal_strings.xml @@ -173,13 +173,13 @@ <!-- XHED: Title for privacy card --> <string name="vaccination_privacy_card_title_text" translatable="false">"Datenschutz und Datensicherheit"</string> <!-- XTXT: First bulletpoint title for privacy card --> - <string name="vaccination_privacy_card_first_bulletpoint_title_text" translatable="false">"Die Verwendung des digitalen Impfnachweises ist freiwillig. Der Nachweis des vollständigen Impfschutzes kann auch auf andere Weise erbracht werden (z.B. mit dem gelben Impfausweis)."</string> + <string name="vaccination_privacy_card_first_bulletpoint_title_text" translatable="false">"Die Verwendung der digitalen COVID-Zertifikate ist freiwillig. Die Nachweise des vollständigen Impfschutzes oder eines negativen Testergebnisses können auch auf andere Weise erbracht werden."</string> <!-- XTXT: First bulletpoint title for privacy card --> - <string name="vaccination_privacy_card_second_bulletpoint_title_text" translatable="false">"Das Impfzertifikat enthält die Daten über Ihre Corona-Impfung. Zum Nachweis Ihres Impfschutzes in den gesetzlich vorgesehenen Fällen genügt das Vorzeigen des QR-Codes in der App. Stellen Sie die Impfzertifikate und QR-Codes niemandem zur Verfügung, wenn Sie nicht wollen, dass die Daten ausgelesen werden."</string> + <string name="vaccination_privacy_card_second_bulletpoint_title_text" translatable="false">"Die COVID-Zertifikate enthalten Ihre personenbezogenen Daten (zu Impfungen oder Ihrem Testergebnis). Zum Nachweis in den gesetzlich vorgesehenen Fällen genügt das Vorzeigen des QR-Codes des Zertifikats in der App. Stellen Sie Ihre Zertifikate und die QR-Codes niemandem zur Verfügung, wenn Sie nicht wollen, dass die Daten ausgelesen werden."</string> <!-- XTXT: First bulletpoint title for privacy card --> - <string name="vaccination_privacy_card_third_bulletpoint_title_text" translatable="false">"Wenn Sie den QR-Code in der App vorzeigen und dieser mit der Prüf-App gescannt wird, können andere Personen nachvollziehen, ob Ihr Impfschutz vollständig ist. Bei der Prüfung werden in der offiziellen Prüf-App auch Ihr Name und Ihr Geburtsdatum angezeigt."</string> + <string name="vaccination_privacy_card_third_bulletpoint_title_text" translatable="false">"Wenn Sie den QR-Code eines Zertifikats in der App zur Prüfung vorzeigen, können andere Personen Ihr Testergebnis nachvollziehen oder ob Ihr Impfschutz vollständig ist. Bei der Prüfung werden in der offiziellen Prüf-App auch Ihr Name und Ihr Geburtsdatum angezeigt."</string> <!-- XTXT: First bulletpoint title for privacy card --> - <string name="vaccination_privacy_card_fourth_bulletpoint_title_text" translatable="false">"Sie haben jederzeit die Möglichkeit, Impfzertifikate in der App wieder zu entfernen. Bis dahin bleiben die Impfzertifikate auf Ihrem Smartphone gespeichert."</string> + <string name="vaccination_privacy_card_fourth_bulletpoint_title_text" translatable="false">"Sie haben jederzeit die Möglichkeit, COVID-Zertifikate in der App wieder zu entfernen. Bis dahin bleiben die Zertifikate auf Ihrem Smartphone gespeichert."</string> <!-- Green Certificate --> <!-- XTXT: Request GC title for privacy card --> diff --git a/Corona-Warn-App/src/main/res/values-de/vaccination_strings.xml b/Corona-Warn-App/src/main/res/values-de/vaccination_strings.xml index 3804c76ba2657eb674b35954640afad5cdd77209..13d04341d4460b728e4cae7389d47f1b897f8bb5 100644 --- a/Corona-Warn-App/src/main/res/values-de/vaccination_strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/vaccination_strings.xml @@ -98,17 +98,17 @@ <!-- XTXT: Vaccination Consent title--> <string name="vaccination_consent_title">Ihr Einverständnis</string> <!-- XTXT: Vaccination Consent subtitle--> - <string name="vaccination_consent_headline">Impfzertifikat hinzufügen</string> + <string name="vaccination_consent_headline">"Nachweise hinzufügen"</string> <!-- XTXT: Vaccination Consent subtitle of qr info --> - <string name="vaccination_consent_info_subtitle_text">"Fügen Sie Ihren digitalen Impfnachweis in der App hinzu. Sobald Ihr Impfschutz vollständig ist, können Sie den QR-Code in der App vorzeigen, um Ihren Impfschutz nachzuweisen."</string> + <string name="vaccination_consent_info_subtitle_text">"Fügen Sie ihre digitalen COVID-Zertifikate in der App hinzu, um mit der App Ihren Impfschutz oder ein negatives Testergebnis nachweisen zu können."</string> <!-- XTXT: Vaccination Consent text of qr info --> - <string name="vaccination_consent_qr_info_text">"Um ein Impfzertifikat in die App hinzuzufügen, scannen Sie den QR-Code, den Sie bei der Impfung erhalten haben."</string> + <string name="vaccination_consent_qr_info_text">"Sie können digitale COVID-19-Impfzertifikate oder COVID-19-Testzertifikate in der App hinzufügen."</string> <!-- XTXT: Vaccination Consent qr code text --> - <string name="vaccination_consent_qr_info_qr_code_text">"Die App liest die Informationen aus dem QR-Code aus und speichert diese in einem sicheren Bereich Ihres Smartphones."</string> + <string name="vaccination_consent_qr_info_qr_code_text">"Die Zertifikate gelten innerhalb der EU als gültiger Nachweis (z.B. für Reisen)."</string> <!-- XTXT: Vaccination Consent time text --> - <string name="vaccination_consent_qr_info_time_text">"Die Daten bleiben auf Ihrem Smartphone. Eine Übertragung an andere Personen findet nur statt, wenn Sie diesen Ihr Impfzertifikat zur Überprüfung vorzeigen."</string> + <string name="vaccination_consent_qr_info_time_text">"Nach dem Hinzufügen bleiben die Zertifikate auf Ihrem Smartphone. Andere Personen können Ihre Daten nur einsehen, wenn Sie diesen ein Zertifikat zur Überprüfung vorzeigen."</string> <!-- XTXT: Text for vaccination consent legal information button --> - <string name="vaccination_consent_onboarding_legal_information">"Weitere Hinweise finden Sie in der Datenschutzerklärung."</string> + <string name="vaccination_consent_onboarding_legal_information">"Ausführliche Informationen zur Datenverarbeitung finden Sie in der Datenschutzerklärung."</string> <!-- XBUT: Text for vaccination consent accept button --> <string name="vaccination_consent_accept_button">"Weiter"</string> diff --git a/Corona-Warn-App/src/main/res/values/legal_strings.xml b/Corona-Warn-App/src/main/res/values/legal_strings.xml index 81e90222d0ba73000577a969241d55287ff456f8..036daa10a6d5ccf34b6ca500ea83fd81c9763d50 100644 --- a/Corona-Warn-App/src/main/res/values/legal_strings.xml +++ b/Corona-Warn-App/src/main/res/values/legal_strings.xml @@ -171,13 +171,13 @@ <!-- XHED: Title for privacy card --> <string name="vaccination_privacy_card_title_text" translatable="false">"Data protection and data security"</string> <!-- XTXT: First bulletpoint title for privacy card --> - <string name="vaccination_privacy_card_first_bulletpoint_title_text" translatable="false">"Using the digital vaccination certificate feature is voluntary. There are other ways to prove that you are fully vaccinated (e.g. using a yellow vaccination booklet)."</string> + <string name="vaccination_privacy_card_first_bulletpoint_title_text" translatable="false">"Die Verwendung der digitalen COVID-Zertifikate ist freiwillig. Die Nachweise des vollständigen Impfschutzes oder eines negativen Testergebnisses können auch auf andere Weise erbracht werden."</string> <!-- XTXT: First bulletpoint title for privacy card --> - <string name="vaccination_privacy_card_second_bulletpoint_title_text" translatable="false">"The vaccination certificate contains your COVID-19 vaccination details. In cases where you are required by law to prove that you have been vaccinated, it is sufficient to show the QR code in the app. Do not provide vaccination certificates or QR codes to anyone if you do not want the data to be read."</string> + <string name="vaccination_privacy_card_second_bulletpoint_title_text" translatable="false">"Die COVID-Zertifikate enthalten Ihre personenbezogenen Daten (zu Impfungen oder Ihrem Testergebnis). Zum Nachweis in den gesetzlich vorgesehenen Fällen genügt das Vorzeigen des QR-Codes des Zertifikats in der App. Stellen Sie Ihre Zertifikate und die QR-Codes niemandem zur Verfügung, wenn Sie nicht wollen, dass die Daten ausgelesen werden."</string> <!-- XTXT: First bulletpoint title for privacy card --> - <string name="vaccination_privacy_card_third_bulletpoint_title_text" translatable="false">"If you present the QR code in the app and it is scanned using the verification app, others will be able to tell whether you are fully vaccinated. During verification, the official verification app will also display your name and date of birth."</string> + <string name="vaccination_privacy_card_third_bulletpoint_title_text" translatable="false">"Wenn Sie den QR-Code eines Zertifikats in der App zur Prüfung vorzeigen, können andere Personen Ihr Testergebnis nachvollziehen oder ob Ihr Impfschutz vollständig ist. Bei der Prüfung werden in der offiziellen Prüf-App auch Ihr Name und Ihr Geburtsdatum angezeigt."</string> <!-- XTXT: First bulletpoint title for privacy card --> - <string name="vaccination_privacy_card_fourth_bulletpoint_title_text" translatable="false">"You have the possibility to delete vaccination certificates in the app at any time. Until then, the vaccination certificates will be stored on your smartphone."</string> + <string name="vaccination_privacy_card_fourth_bulletpoint_title_text" translatable="false">"Sie haben jederzeit die Möglichkeit, COVID-Zertifikate in der App wieder zu entfernen. Bis dahin bleiben die Zertifikate auf Ihrem Smartphone gespeichert."</string> <!-- Green Certificate --> <!-- XTXT: Request GC title for privacy card --> diff --git a/Corona-Warn-App/src/main/res/values/vaccination_strings.xml b/Corona-Warn-App/src/main/res/values/vaccination_strings.xml index 36b9bdc95d905ee11194fcb6efe68bbf5b10ec6e..e309cb745e6a30337968fa1afa7ddba4e5574335 100644 --- a/Corona-Warn-App/src/main/res/values/vaccination_strings.xml +++ b/Corona-Warn-App/src/main/res/values/vaccination_strings.xml @@ -98,17 +98,17 @@ <!-- XTXT: Vaccination Consent title--> <string name="vaccination_consent_title">"Your Consent"</string> <!-- XTXT: Vaccination Consent subtitle--> - <string name="vaccination_consent_headline">"Add Vaccination Certificate"</string> + <string name="vaccination_consent_headline">"Nachweise hinzufügen"</string> <!-- XTXT: Vaccination Consent subtitle of qr info --> - <string name="vaccination_consent_info_subtitle_text">"Add your digital vaccination certificate in the app. As soon as your vaccination protection is complete, you can present the QR code in your app as proof of your vaccination."</string> + <string name="vaccination_consent_info_subtitle_text">"Fügen Sie ihre digitalen COVID-Zertifikate in der App hinzu, um mit der App Ihren Impfschutz oder ein negatives Testergebnis nachweisen zu können."</string> <!-- XTXT: Vaccination Consent text of qr info --> - <string name="vaccination_consent_qr_info_text">"To add a vaccination certificate in the app, scan the QR code that you received during your vaccination."</string> + <string name="vaccination_consent_qr_info_text">"Sie können digitale COVID-19-Impfzertifikate oder COVID-19-Testzertifikate in der App hinzufügen."</string> <!-- XTXT: Vaccination Consent qr code text --> - <string name="vaccination_consent_qr_info_qr_code_text">"The app reads the information from the QR code and saves it in a secure area on your smartphone."</string> + <string name="vaccination_consent_qr_info_qr_code_text">"Die Zertifikate gelten innerhalb der EU als gültiger Nachweis (z.B. für Reisen)."</string> <!-- XTXT: Vaccination Consent time text --> - <string name="vaccination_consent_qr_info_time_text">"The data will remain on the smartphone. It will only be transmitted to others if you present your vaccination certificate for verification."</string> + <string name="vaccination_consent_qr_info_time_text">"Nach dem Hinzufügen bleiben die Zertifikate auf Ihrem Smartphone. Andere Personen können Ihre Daten nur einsehen, wenn Sie diesen ein Zertifikat zur Überprüfung vorzeigen."</string> <!-- XTXT: Text for vaccination consent legal information button --> - <string name="vaccination_consent_onboarding_legal_information">"For more information, please refer to the privacy notice."</string> + <string name="vaccination_consent_onboarding_legal_information">"Ausführliche Informationen zur Datenverarbeitung finden Sie in der Datenschutzerklärung."</string> <!-- XBUT: Text for vaccination consent accept button --> <string name="vaccination_consent_accept_button">"Continue"</string> 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 5313065d3f9dbb6d55a8e3ce6267a6b0e0420a14..0a3643766fb3685c31d66345b3c777a2d1b90ee9 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 @@ -9,6 +9,7 @@ import de.rki.coronawarnapp.storage.OnboardingSettings import de.rki.coronawarnapp.ui.main.MainActivityViewModel import de.rki.coronawarnapp.util.CWADebug import de.rki.coronawarnapp.util.device.BackgroundModeStatus +import de.rki.coronawarnapp.vaccination.core.VaccinationSettings import io.kotest.matchers.shouldBe import io.mockk.MockKAnnotations import io.mockk.every @@ -34,6 +35,7 @@ class MainActivityViewModelTest : BaseTest() { @MockK lateinit var onboardingSettings: OnboardingSettings @MockK lateinit var traceLocationSettings: TraceLocationSettings @MockK lateinit var checkInRepository: CheckInRepository + @MockK lateinit var vaccinationSettings: VaccinationSettings @BeforeEach fun setup() { @@ -59,6 +61,7 @@ class MainActivityViewModelTest : BaseTest() { onboardingSettings = onboardingSettings, checkInRepository = checkInRepository, traceLocationSettings = traceLocationSettings, + vaccinationSettings = vaccinationSettings, ) @Test @@ -91,6 +94,7 @@ class MainActivityViewModelTest : BaseTest() { @Test fun `User is not onboarded when settings returns NOT_ONBOARDED `() { every { diarySettings.onboardingStatus } returns ContactDiarySettings.OnboardingStatus.NOT_ONBOARDED + every { vaccinationSettings.registrationAcknowledged } returns true val vm = createInstance() vm.onBottomNavSelected() vm.isContactDiaryOnboardingDone.value shouldBe false @@ -99,8 +103,27 @@ class MainActivityViewModelTest : BaseTest() { @Test fun `User is onboarded when settings returns RISK_STATUS_1_12 `() { every { diarySettings.onboardingStatus } returns ContactDiarySettings.OnboardingStatus.RISK_STATUS_1_12 + every { vaccinationSettings.registrationAcknowledged } returns true val vm = createInstance() vm.onBottomNavSelected() vm.isContactDiaryOnboardingDone.value shouldBe true } + + @Test + fun `Vaccination is not acknowledged when settings returns false `() { + every { diarySettings.onboardingStatus } returns ContactDiarySettings.OnboardingStatus.RISK_STATUS_1_12 + every { vaccinationSettings.registrationAcknowledged } returns false + val vm = createInstance() + vm.onBottomNavSelected() + vm.isVaccinationConsentGiven.value shouldBe false + } + + @Test + fun `Vaccination is acknowledged when settings returns true `() { + every { diarySettings.onboardingStatus } returns ContactDiarySettings.OnboardingStatus.RISK_STATUS_1_12 + every { vaccinationSettings.registrationAcknowledged } returns true + val vm = createInstance() + vm.onBottomNavSelected() + vm.isVaccinationConsentGiven.value shouldBe true + } }