From cdde46d2a5c3bf3aebb34f568f5b81040a33da32 Mon Sep 17 00:00:00 2001 From: Matthias Urhahn <matthias.urhahn@sap.com> Date: Mon, 10 May 2021 18:45:24 +0200 Subject: [PATCH] Add home cards for vaccination status (EXPOSUREAPP-6730, EXPOSUREAPP-6731) (#3089) * Add home cards for vaccination status. * Fix instrumentation test. * Fix instrumentation test, season 1, episode 2. * fix icons * Address PR comments * Card label is not dynamic based on vaccine ID, it's a hardcoded name. * Replace card graphics with new design. Co-authored-by: Juraj Kusnier <jurajkusnier@gmail.com> Co-authored-by: Juraj Kusnier <jurajkusnier@users.noreply.github.com> Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com> --- .../ui/main/home/HomeFragmentTest.kt | 5 +- .../coronawarnapp/ui/main/home/HomeAdapter.kt | 8 ++ .../ui/main/home/HomeFragmentViewModel.kt | 30 +++++- .../vaccination/core/VaccinatedPerson.kt | 17 ++-- .../core/repository/VaccinationRepository.kt | 4 +- ...{PersonData.kt => VaccinatedPersonData.kt} | 2 +- .../repository/storage/VaccinationStorage.kt | 21 ++++- .../homecards/CompleteVaccinationHomeCard.kt | 38 ++++++++ .../ui/homecards/CreateVaccinationHomeCard.kt | 8 +- .../IncompleteVaccinationHomeCard.kt | 38 ++++++++ .../ui/homecards/VaccinationStatusItem.kt | 11 +++ .../vaccination_card_icon_registration.xml | 17 ++++ .../ic_card_impfzertifikat_registrieren.xml | 30 ------ .../vaccination_card_icon_complete.xml | 17 ++++ .../vaccination_card_icon_incomplete.xml | 20 ++++ .../vaccination_card_icon_registration.xml | 17 ++++ .../layout/vaccination_home_complete_card.xml | 74 +++++++++++++++ .../vaccination_home_incomplete_card.xml | 93 +++++++++++++++++++ ...=> vaccination_home_registration_card.xml} | 4 +- .../src/main/res/values-de/strings.xml | 7 -- .../res/values-de/vaccination_strings.xml | 17 ++++ .../src/main/res/values/strings.xml | 7 -- .../main/res/values/vaccination_strings.xml | 17 ++++ .../main/home/HomeFragmentViewModelTest.kt | 7 +- .../vaccination/core/VaccinationTestData.kt | 6 +- .../repository/VaccinationRepositoryTest.kt | 4 +- 26 files changed, 448 insertions(+), 71 deletions(-) rename Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/repository/storage/{PersonData.kt => VaccinatedPersonData.kt} (95%) create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/homecards/CompleteVaccinationHomeCard.kt create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/homecards/IncompleteVaccinationHomeCard.kt create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/homecards/VaccinationStatusItem.kt create mode 100644 Corona-Warn-App/src/main/res/drawable-night/vaccination_card_icon_registration.xml delete mode 100644 Corona-Warn-App/src/main/res/drawable/ic_card_impfzertifikat_registrieren.xml create mode 100644 Corona-Warn-App/src/main/res/drawable/vaccination_card_icon_complete.xml create mode 100644 Corona-Warn-App/src/main/res/drawable/vaccination_card_icon_incomplete.xml create mode 100644 Corona-Warn-App/src/main/res/drawable/vaccination_card_icon_registration.xml create mode 100644 Corona-Warn-App/src/main/res/layout/vaccination_home_complete_card.xml create mode 100644 Corona-Warn-App/src/main/res/layout/vaccination_home_incomplete_card.xml rename Corona-Warn-App/src/main/res/layout/{home_vaccination_registration_card.xml => vaccination_home_registration_card.xml} (96%) 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 43c90b8ca..915dd7d5c 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 @@ -32,6 +32,7 @@ import de.rki.coronawarnapp.util.bluetooth.BluetoothSupport import de.rki.coronawarnapp.util.encryptionmigration.EncryptionErrorResetTool import de.rki.coronawarnapp.util.shortcuts.AppShortcutsHelper import de.rki.coronawarnapp.util.ui.SingleLiveEvent +import de.rki.coronawarnapp.vaccination.core.repository.VaccinationRepository import io.mockk.MockKAnnotations import io.mockk.Runs import io.mockk.every @@ -71,6 +72,7 @@ class HomeFragmentTest : BaseUITest() { @MockK lateinit var traceLocationOrganizerSettings: TraceLocationOrganizerSettings @MockK lateinit var timeStamper: TimeStamper @MockK lateinit var bluetoothSupport: BluetoothSupport + @MockK lateinit var vaccinationRepository: VaccinationRepository private lateinit var homeFragmentViewModel: HomeFragmentViewModel @@ -300,7 +302,8 @@ class HomeFragmentTest : BaseUITest() { tracingSettings = tracingSettings, traceLocationOrganizerSettings = traceLocationOrganizerSettings, timeStamper = timeStamper, - bluetoothSupport = bluetoothSupport + bluetoothSupport = bluetoothSupport, + vaccinationRepository = vaccinationRepository, ) ) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeAdapter.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeAdapter.kt index 6424e86df..8ba4b3d16 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeAdapter.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeAdapter.kt @@ -38,7 +38,9 @@ import de.rki.coronawarnapp.util.lists.modular.mods.DataBinderMod import de.rki.coronawarnapp.util.lists.modular.mods.SavedStateMod import de.rki.coronawarnapp.util.lists.modular.mods.StableIdMod import de.rki.coronawarnapp.util.lists.modular.mods.TypedVHCreatorMod +import de.rki.coronawarnapp.vaccination.ui.homecards.CompleteVaccinationHomeCard import de.rki.coronawarnapp.vaccination.ui.homecards.CreateVaccinationHomeCard +import de.rki.coronawarnapp.vaccination.ui.homecards.IncompleteVaccinationHomeCard class HomeAdapter : ModularAdapter<HomeAdapter.HomeItemVH<HomeItem, ViewBinding>>(), @@ -78,6 +80,12 @@ class HomeAdapter : TypedVHCreatorMod({ data[it] is TestUnregisteredCard.Item }) { TestUnregisteredCard(it) }, TypedVHCreatorMod({ data[it] is StatisticsHomeCard.Item }) { StatisticsHomeCard(it) }, TypedVHCreatorMod({ data[it] is CreateVaccinationHomeCard.Item }) { CreateVaccinationHomeCard(it) }, + TypedVHCreatorMod({ data[it] is CompleteVaccinationHomeCard.Item }) { + CompleteVaccinationHomeCard(it) + }, + TypedVHCreatorMod({ data[it] is IncompleteVaccinationHomeCard.Item }) { + IncompleteVaccinationHomeCard(it) + }, SavedStateMod<HomeItemVH<HomeItem, ViewBinding>>() // For statistics card scroll position ) ) 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 90c3eb66d..16723f794 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 @@ -67,12 +67,16 @@ import de.rki.coronawarnapp.util.TimeStamper import de.rki.coronawarnapp.util.bluetooth.BluetoothSupport import de.rki.coronawarnapp.util.coroutine.DispatcherProvider import de.rki.coronawarnapp.util.encryptionmigration.EncryptionErrorResetTool +import de.rki.coronawarnapp.util.flow.combine import de.rki.coronawarnapp.util.shortcuts.AppShortcutsHelper 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.VaccinatedPerson +import de.rki.coronawarnapp.vaccination.core.repository.VaccinationRepository +import de.rki.coronawarnapp.vaccination.ui.homecards.CompleteVaccinationHomeCard import de.rki.coronawarnapp.vaccination.ui.homecards.CreateVaccinationHomeCard -import kotlinx.coroutines.flow.combine +import de.rki.coronawarnapp.vaccination.ui.homecards.IncompleteVaccinationHomeCard import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach @@ -95,6 +99,7 @@ class HomeFragmentViewModel @AssistedInject constructor( private val traceLocationOrganizerSettings: TraceLocationOrganizerSettings, private val timeStamper: TimeStamper, private val bluetoothSupport: BluetoothSupport, + private val vaccinationRepository: VaccinationRepository, ) : CWAViewModel(dispatcherProvider = dispatcherProvider) { private val tracingStateProvider by lazy { tracingStateProviderFactory.create(isDetailsMode = false) } @@ -286,8 +291,9 @@ class HomeFragmentViewModel @AssistedInject constructor( coronaTestRepository.latestPCRT, coronaTestRepository.latestRAT, statisticsProvider.current.distinctUntilChanged(), - appConfigProvider.currentConfig.map { it.coronaTestParameters }.distinctUntilChanged() - ) { tracingItem, testPCR, testRAT, statsData, coronaTestParameters -> + appConfigProvider.currentConfig.map { it.coronaTestParameters }.distinctUntilChanged(), + vaccinationRepository.vaccinationInfos + ) { tracingItem, testPCR, testRAT, statsData, coronaTestParameters, vaccinatedPersons -> val statePCR = testPCR.toSubmissionState() val stateRAT = testRAT.toSubmissionState(timeStamper.nowUTC, coronaTestParameters) mutableListOf<HomeItem>().apply { @@ -301,6 +307,24 @@ class HomeFragmentViewModel @AssistedInject constructor( else -> add(tracingItem) } + vaccinatedPersons.forEach { + val card = when (it.vaccinationStatus) { + VaccinatedPerson.Status.COMPLETE -> CompleteVaccinationHomeCard.Item( + vaccinatedPerson = it, + onClickAction = { + // TODO + } + ) + VaccinatedPerson.Status.INCOMPLETE -> IncompleteVaccinationHomeCard.Item( + vaccinatedPerson = it, + onClickAction = { + // TODO + } + ) + } + add(card) + } + if (bluetoothSupport.isAdvertisingSupported == false) { add( IncompatibleCard.Item( diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/VaccinatedPerson.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/VaccinatedPerson.kt index 5be20e9fa..cd2e82d4e 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/VaccinatedPerson.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/VaccinatedPerson.kt @@ -1,12 +1,11 @@ package de.rki.coronawarnapp.vaccination.core -import de.rki.coronawarnapp.vaccination.core.repository.storage.PersonData +import de.rki.coronawarnapp.vaccination.core.repository.storage.VaccinatedPersonData import de.rki.coronawarnapp.vaccination.core.server.valueset.VaccinationValueSet - import org.joda.time.LocalDate data class VaccinatedPerson( - internal val data: PersonData, + internal val data: VaccinatedPersonData, private val valueSet: VaccinationValueSet?, val isUpdatingData: Boolean = false, val lastError: Throwable? = null, @@ -14,9 +13,6 @@ data class VaccinatedPerson( val identifier: VaccinatedPersonIdentifier get() = data.identifier - val vaccinationStatus: Status - get() = if (proofCertificates.isNotEmpty()) Status.COMPLETE else Status.INCOMPLETE - val vaccinationCertificates: Set<VaccinationCertificate> get() = data.vaccinations.map { it.toVaccinationCertificate(valueSet) @@ -27,12 +23,21 @@ data class VaccinatedPerson( it.toProofCertificate(valueSet) }.toSet() + val vaccinationStatus: Status + get() = if (proofCertificates.isNotEmpty()) Status.COMPLETE else Status.INCOMPLETE + + val vaccineName: String + get() = vaccinationCertificates.first().vaccineName + val firstName: String? get() = vaccinationCertificates.first().firstName val lastName: String get() = vaccinationCertificates.first().lastName + val fullName: String + get() = "$firstName $lastName" + val dateOfBirth: LocalDate get() = vaccinationCertificates.first().dateOfBirth diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/repository/VaccinationRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/repository/VaccinationRepository.kt index 1a3cb68ad..cb0b66367 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/repository/VaccinationRepository.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/repository/VaccinationRepository.kt @@ -13,7 +13,7 @@ import de.rki.coronawarnapp.vaccination.core.personIdentifier import de.rki.coronawarnapp.vaccination.core.qrcode.VaccinationCertificateQRCode import de.rki.coronawarnapp.vaccination.core.repository.errors.VaccinatedPersonNotFoundException import de.rki.coronawarnapp.vaccination.core.repository.errors.VaccinationCertificateNotFoundException -import de.rki.coronawarnapp.vaccination.core.repository.storage.PersonData +import de.rki.coronawarnapp.vaccination.core.repository.storage.VaccinatedPersonData import de.rki.coronawarnapp.vaccination.core.repository.storage.VaccinationStorage import de.rki.coronawarnapp.vaccination.core.repository.storage.toProofContainer import de.rki.coronawarnapp.vaccination.core.repository.storage.toVaccinationContainer @@ -96,7 +96,7 @@ class VaccinationRepository @Inject constructor( } } else { VaccinatedPerson( - data = PersonData( + data = VaccinatedPersonData( vaccinations = emptySet(), proofs = emptySet() ), diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/repository/storage/PersonData.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/repository/storage/VaccinatedPersonData.kt similarity index 95% rename from Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/repository/storage/PersonData.kt rename to Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/repository/storage/VaccinatedPersonData.kt index 527f570ce..d7216981a 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/repository/storage/PersonData.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/repository/storage/VaccinatedPersonData.kt @@ -4,7 +4,7 @@ import com.google.gson.annotations.SerializedName import de.rki.coronawarnapp.vaccination.core.VaccinatedPersonIdentifier import org.joda.time.Instant -data class PersonData( +data class VaccinatedPersonData( @SerializedName("vaccinationData") val vaccinations: Set<VaccinationContainer>, @SerializedName("proofData") val proofs: Set<ProofContainer>, @SerializedName("lastSuccessfulProofCertificateRun") val lastSuccessfulPCRunAt: Instant = Instant.EPOCH, diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/repository/storage/VaccinationStorage.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/repository/storage/VaccinationStorage.kt index 15753b86b..eaf695fc9 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/repository/storage/VaccinationStorage.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/repository/storage/VaccinationStorage.kt @@ -3,6 +3,7 @@ package de.rki.coronawarnapp.vaccination.core.repository.storage import android.content.Context import androidx.core.content.edit import com.google.gson.Gson +import de.rki.coronawarnapp.util.CWADebug import de.rki.coronawarnapp.util.di.AppContext import de.rki.coronawarnapp.util.serialization.BaseGson import de.rki.coronawarnapp.util.serialization.fromJson @@ -25,7 +26,7 @@ class VaccinationStorage @Inject constructor( baseGson } - var personContainers: Set<PersonData> + var personContainers: Set<VaccinatedPersonData> get() { Timber.tag(TAG).d("vaccinatedPersons - load()") val persons = prefs.all.mapNotNull { (key, value) -> @@ -33,7 +34,7 @@ class VaccinationStorage @Inject constructor( return@mapNotNull null } value as String - gson.fromJson<PersonData>(value).also { + gson.fromJson<VaccinatedPersonData>(value).also { Timber.tag(TAG).v("Person loaded: %s", it) requireNotNull(it.identifier) } @@ -57,6 +58,22 @@ class VaccinationStorage @Inject constructor( } } + init { + // TODO REMOVE when all is done + if (CWADebug.isDebugBuildOrMode && !CWADebug.isAUnitTest) { + personContainers = setOf( + VaccinatedPersonData( + vaccinations = setOf( + VaccinationContainer() + ), + proofs = setOf( + ProofContainer() // Remove me to get an incomplete state + ) + ) + ) + } + } + companion object { private const val TAG = "VaccinationStorage" private const val PKEY_PERSON_PREFIX = "vaccination.person." diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/homecards/CompleteVaccinationHomeCard.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/homecards/CompleteVaccinationHomeCard.kt new file mode 100644 index 000000000..17965fc0f --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/homecards/CompleteVaccinationHomeCard.kt @@ -0,0 +1,38 @@ +package de.rki.coronawarnapp.vaccination.ui.homecards + +import android.view.ViewGroup +import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.databinding.VaccinationHomeCompleteCardBinding +import de.rki.coronawarnapp.ui.main.home.HomeAdapter +import de.rki.coronawarnapp.util.lists.diffutil.HasPayloadDiffer +import de.rki.coronawarnapp.vaccination.core.VaccinatedPerson + +class CompleteVaccinationHomeCard(parent: ViewGroup) : + HomeAdapter.HomeItemVH<CompleteVaccinationHomeCard.Item, VaccinationHomeCompleteCardBinding>( + R.layout.home_card_container_layout, + parent + ) { + + override val viewBinding = lazy { + VaccinationHomeCompleteCardBinding.inflate(layoutInflater, itemView.findViewById(R.id.card_container), true) + } + + override val onBindData: VaccinationHomeCompleteCardBinding.( + item: Item, + payloads: List<Any> + ) -> Unit = { item, payloads -> + val curItem = payloads.filterIsInstance<Item>().singleOrNull() ?: item + + personName.text = curItem.vaccinatedPerson.fullName + + itemView.setOnClickListener { curItem.onClickAction(item) } + } + + data class Item( + override val vaccinatedPerson: VaccinatedPerson, + val onClickAction: (Item) -> Unit, + ) : VaccinationStatusItem, HasPayloadDiffer { + + override fun diffPayload(old: Any, new: Any): Any? = if (old::class == new::class) new else null + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/homecards/CreateVaccinationHomeCard.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/homecards/CreateVaccinationHomeCard.kt index 6c180b859..d0a98e8a1 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/homecards/CreateVaccinationHomeCard.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/homecards/CreateVaccinationHomeCard.kt @@ -2,22 +2,22 @@ package de.rki.coronawarnapp.vaccination.ui.homecards import android.view.ViewGroup import de.rki.coronawarnapp.R -import de.rki.coronawarnapp.databinding.HomeVaccinationRegistrationCardBinding +import de.rki.coronawarnapp.databinding.VaccinationHomeRegistrationCardBinding import de.rki.coronawarnapp.ui.main.home.HomeAdapter import de.rki.coronawarnapp.ui.main.home.items.HomeItem import de.rki.coronawarnapp.util.lists.diffutil.HasPayloadDiffer class CreateVaccinationHomeCard(parent: ViewGroup) : - HomeAdapter.HomeItemVH<CreateVaccinationHomeCard.Item, HomeVaccinationRegistrationCardBinding>( + HomeAdapter.HomeItemVH<CreateVaccinationHomeCard.Item, VaccinationHomeRegistrationCardBinding>( R.layout.home_card_container_layout, parent ) { override val viewBinding = lazy { - HomeVaccinationRegistrationCardBinding.inflate(layoutInflater, itemView.findViewById(R.id.card_container), true) + VaccinationHomeRegistrationCardBinding.inflate(layoutInflater, itemView.findViewById(R.id.card_container), true) } - override val onBindData: HomeVaccinationRegistrationCardBinding.( + override val onBindData: VaccinationHomeRegistrationCardBinding.( item: Item, payloads: List<Any> ) -> Unit = { item, payloads -> diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/homecards/IncompleteVaccinationHomeCard.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/homecards/IncompleteVaccinationHomeCard.kt new file mode 100644 index 000000000..37472a274 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/homecards/IncompleteVaccinationHomeCard.kt @@ -0,0 +1,38 @@ +package de.rki.coronawarnapp.vaccination.ui.homecards + +import android.view.ViewGroup +import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.databinding.VaccinationHomeIncompleteCardBinding +import de.rki.coronawarnapp.ui.main.home.HomeAdapter +import de.rki.coronawarnapp.util.lists.diffutil.HasPayloadDiffer +import de.rki.coronawarnapp.vaccination.core.VaccinatedPerson + +class IncompleteVaccinationHomeCard(parent: ViewGroup) : + HomeAdapter.HomeItemVH<IncompleteVaccinationHomeCard.Item, VaccinationHomeIncompleteCardBinding>( + R.layout.home_card_container_layout, + parent + ) { + + override val viewBinding = lazy { + VaccinationHomeIncompleteCardBinding.inflate(layoutInflater, itemView.findViewById(R.id.card_container), true) + } + + override val onBindData: VaccinationHomeIncompleteCardBinding.( + item: Item, + payloads: List<Any> + ) -> Unit = { item, payloads -> + val curItem = payloads.filterIsInstance<Item>().singleOrNull() ?: item + + personName.text = curItem.vaccinatedPerson.fullName + + itemView.setOnClickListener { curItem.onClickAction(item) } + } + + data class Item( + override val vaccinatedPerson: VaccinatedPerson, + val onClickAction: (Item) -> Unit, + ) : VaccinationStatusItem, HasPayloadDiffer { + + override fun diffPayload(old: Any, new: Any): Any? = if (old::class == new::class) new else null + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/homecards/VaccinationStatusItem.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/homecards/VaccinationStatusItem.kt new file mode 100644 index 000000000..5968607a6 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/homecards/VaccinationStatusItem.kt @@ -0,0 +1,11 @@ +package de.rki.coronawarnapp.vaccination.ui.homecards + +import de.rki.coronawarnapp.ui.main.home.items.HomeItem +import de.rki.coronawarnapp.vaccination.core.VaccinatedPerson + +interface VaccinationStatusItem : HomeItem { + val vaccinatedPerson: VaccinatedPerson + + override val stableId: Long + get() = vaccinatedPerson.identifier.hashCode().toLong() +} diff --git a/Corona-Warn-App/src/main/res/drawable-night/vaccination_card_icon_registration.xml b/Corona-Warn-App/src/main/res/drawable-night/vaccination_card_icon_registration.xml new file mode 100644 index 000000000..50b94148b --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable-night/vaccination_card_icon_registration.xml @@ -0,0 +1,17 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="78dp" + android:height="72dp" + android:viewportWidth="78" + android:viewportHeight="72"> + <path + android:pathData="M44.2502,0V4.3846H46.4425V6.7139C42.0321,7.1507 38.05,8.8463 34.7958,11.5096L33.1516,9.8654L34.6588,8.3582L31.5759,5.2752L25.41,11.4411L28.4929,14.524L30.0001,13.0168L31.6444,14.6611C28.9811,17.9153 27.2855,21.8974 26.8487,26.3077H24.5194V24.1154H20.1348V32.8846H24.5194V30.6923H26.8487C27.2855,35.1369 29.0153,39.1447 31.7129,42.4075L30.0001,43.9832L28.4929,42.476L25.41,45.5589L31.5759,51.7248L34.6588,48.6418L33.1516,47.1346L34.7958,45.4219C38.0586,48.1023 42.0236,49.8493 46.4425,50.2861V52.6154H44.2502V57H53.0194V52.6154H50.8271V50.2861C55.2459,49.8493 59.2109,48.1023 62.4737,45.4219H62.5422L64.1179,47.1346L62.6107,48.6418L65.6937,51.7248L71.8595,45.5589L68.7766,42.476L67.2694,43.9832L65.5566,42.4075C65.5609,42.3989 65.5588,42.386 65.5566,42.3732C65.5545,42.3604 65.5524,42.3475 65.5566,42.3389C68.2371,39.0762 69.9841,35.1112 70.4208,30.6923H72.7501V32.8846H77.1348V24.1154H72.7501V26.3077H70.4208C69.9841,21.8974 68.2885,17.9153 65.6251,14.6611L67.2694,13.0168L68.7766,14.524L71.8595,11.4411L65.6937,5.2752L62.6107,8.3582L64.1179,9.8654L62.4737,11.5096C59.2195,8.8463 55.2374,7.1507 50.8271,6.7139V4.3846H53.0194V0H44.2502ZM48.6352,10.9604C58.3465,10.9604 66.1737,18.7876 66.1737,28.4989C66.1737,38.2101 58.3465,46.0373 48.6352,46.0373C38.924,46.0373 31.0968,38.2101 31.0968,28.4989C31.0968,18.7876 38.924,10.9604 48.6352,10.9604ZM39.8653,18.9777C39.8653,17.1622 41.3382,15.6893 43.1537,15.6893C44.9692,15.6893 46.4422,17.1622 46.4422,18.9777C46.4422,20.7933 44.9692,22.2662 43.1537,22.2662C41.3382,22.2662 39.8653,20.7933 39.8653,18.9777ZM54.1157,15.6893C52.3002,15.6893 50.8273,17.1622 50.8273,18.9777C50.8273,20.7933 52.3002,22.2662 54.1157,22.2662C55.9312,22.2662 57.4042,20.7933 57.4042,18.9777C57.4042,17.1622 55.9312,15.6893 54.1157,15.6893ZM34.3848,28.499C34.3848,26.6834 35.8578,25.2105 37.6733,25.2105C39.4888,25.2105 40.9618,26.6834 40.9618,28.499C40.9618,30.3145 39.4888,31.7874 37.6733,31.7874C35.8578,31.7874 34.3848,30.3145 34.3848,28.499ZM48.6353,25.2105C46.8198,25.2105 45.3468,26.6834 45.3468,28.499C45.3468,30.3145 46.8198,31.7874 48.6353,31.7874C50.4508,31.7874 51.9237,30.3145 51.9237,28.499C51.9237,26.6834 50.4508,25.2105 48.6353,25.2105ZM56.3075,28.499C56.3075,26.6834 57.7804,25.2105 59.5959,25.2105C61.4114,25.2105 62.8844,26.6834 62.8844,28.499C62.8844,30.3145 61.4114,31.7874 59.5959,31.7874C57.7804,31.7874 56.3075,30.3145 56.3075,28.499ZM43.1537,34.7339C41.3382,34.7339 39.8653,36.2069 39.8653,38.0224C39.8653,39.8379 41.3382,41.3108 43.1537,41.3108C44.9692,41.3108 46.4422,39.8379 46.4422,38.0224C46.4422,36.2069 44.9692,34.7339 43.1537,34.7339ZM50.8273,38.0224C50.8273,36.2069 52.3002,34.7339 54.1157,34.7339C55.9312,34.7339 57.4042,36.2069 57.4042,38.0224C57.4042,39.8379 55.9312,41.3108 54.1157,41.3108C52.3002,41.3108 50.8273,39.8379 50.8273,38.0224Z" + android:fillColor="#ffffff" + android:fillAlpha="0.2" + android:fillType="evenOdd" /> + <path + android:pathData="M22,18L0,27.8182V42.5455C0,56.1682 9.3867,68.9073 22,72C34.6133,68.9073 44,56.1682 44,42.5455V27.8182L22,18Z" + android:fillColor="#007FAD" /> + <path + android:pathData="M11.29,43.7909L8,47.2335L17.3333,57L36,37.4671L32.71,34L17.3333,50.0902L11.29,43.7909Z" + android:fillColor="#ffffff" /> +</vector> diff --git a/Corona-Warn-App/src/main/res/drawable/ic_card_impfzertifikat_registrieren.xml b/Corona-Warn-App/src/main/res/drawable/ic_card_impfzertifikat_registrieren.xml deleted file mode 100644 index c09ec8966..000000000 --- a/Corona-Warn-App/src/main/res/drawable/ic_card_impfzertifikat_registrieren.xml +++ /dev/null @@ -1,30 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="96dp" - android:height="80dp" - android:viewportWidth="96" - android:viewportHeight="80"> - <group> - <clip-path - android:pathData="M14,15C14,12.7909 15.7909,11 18,11H346C348.209,11 350,12.7909 350,15V322C350,324.209 348.209,326 346,326H18C15.7909,326 14,324.209 14,322V15Z" - android:fillType="evenOdd"/> - </group> - <path - android:pathData="m55.3966,16.0397c0,-0.873 -1.013,-1.582 -2.26,-1.582 -1.247,0 -2.26,0.709 -2.26,1.582 0,0.874 1.013,1.583 2.26,1.583 1.247,0 2.26,-0.709 2.26,-1.583zM40.2356,19.2917c0.506,-0.068 0.985,0.045 1.315,0.355 0.663,0.618 0.482,1.786 -0.401,2.609 -0.884,0.825 -2.134,0.993 -2.794,0.375 -0.662,-0.616 -0.482,-1.784 0.401,-2.609 0.442,-0.412 0.973,-0.662 1.479,-0.73zM55.3966,22.8997c0,-1.165 -1.013,-2.111 -2.26,-2.111 -1.247,0 -2.26,0.946 -2.26,2.111 0,1.165 1.013,2.11 2.26,2.11 1.247,0 2.26,-0.945 2.26,-2.11zM67.5176,20.0217c-0.441,-0.413 -0.973,-0.662 -1.479,-0.73 -0.506,-0.067 -0.984,0.045 -1.315,0.355 -0.662,0.618 -0.482,1.786 0.402,2.609 0.881,0.825 2.131,0.993 2.794,0.375 0.662,-0.616 0.481,-1.784 -0.402,-2.609zM46.7466,24.4977c-0.441,-0.413 -1.019,-0.618 -1.598,-0.618 -0.578,0 -1.157,0.207 -1.598,0.618 -0.883,0.823 -0.881,2.159 0,2.984 0.882,0.825 2.312,0.825 3.196,0 0.881,-0.825 0.881,-2.159 0,-2.984zM61.1256,23.8797c0.578,0 1.156,0.206 1.598,0.618 0.884,0.825 0.884,2.161 0,2.984 -0.884,0.825 -2.314,0.825 -3.196,0 -0.881,-0.823 -0.883,-2.161 0,-2.984 0.441,-0.412 1.02,-0.618 1.598,-0.618zM36.1876,33.4497c0,-1.165 -0.759,-2.11 -1.695,-2.11 -0.935,0 -1.694,0.945 -1.694,2.11 0,1.165 0.759,2.111 1.694,2.111 0.936,0 1.695,-0.946 1.695,-2.111zM41.8376,31.3417c1.248,0 2.26,0.945 2.26,2.11 0,1.165 -1.012,2.111 -2.26,2.111 -1.247,0 -2.26,-0.946 -2.26,-2.111 0,-1.165 1.013,-2.11 2.26,-2.11zM55.3966,33.4517c0,-1.165 -1.012,-2.11 -2.26,-2.11 -1.247,0 -2.259,0.945 -2.259,2.11 0,1.165 1.012,2.111 2.259,2.111 1.248,0 2.26,-0.946 2.26,-2.111zM64.4356,31.3417c1.248,0 2.26,0.945 2.26,2.11 0,1.165 -1.012,2.111 -2.26,2.111 -1.247,0 -2.26,-0.946 -2.26,-2.111 0,-1.165 1.013,-2.11 2.26,-2.11zM73.4756,33.4517c0,-1.165 -0.759,-2.11 -1.695,-2.11 -0.935,0 -1.694,0.945 -1.694,2.11 0,1.165 0.759,2.111 1.694,2.111 0.936,0 1.695,-0.946 1.695,-2.111zM45.1476,38.7997c0.579,0 1.156,0.207 1.598,0.618 0.884,0.825 0.884,2.161 0,2.985 -0.883,0.825 -2.314,0.825 -3.195,0 -0.882,-0.824 -0.884,-2.162 0,-2.985 0.44,-0.411 1.019,-0.618 1.597,-0.618zM62.7246,39.4177c-0.441,-0.412 -1.02,-0.618 -1.598,-0.618 -0.579,0 -1.157,0.207 -1.598,0.618 -0.884,0.823 -0.884,2.159 0,2.985 0.881,0.825 2.312,0.825 3.196,0 0.881,-0.826 0.881,-2.162 0,-2.985zM53.1366,41.8917c1.248,0 2.26,0.945 2.26,2.11 0,1.165 -1.012,2.111 -2.26,2.111 -1.247,0 -2.259,-0.946 -2.259,-2.111 0,-1.165 1.012,-2.11 2.259,-2.11zM41.1486,44.6467c-0.44,-0.413 -0.972,-0.662 -1.478,-0.73 -0.506,-0.067 -0.984,0.045 -1.315,0.355 -0.663,0.616 -0.48,1.784 0.401,2.609 0.882,0.825 2.132,0.993 2.794,0.375 0.662,-0.616 0.482,-1.784 -0.402,-2.609zM66.6026,43.9167c0.506,-0.067 0.985,0.045 1.316,0.355 0.662,0.618 0.482,1.786 -0.402,2.609 -0.883,0.825 -2.134,0.993 -2.794,0.375 -0.662,-0.619 -0.482,-1.786 0.402,-2.609 0.441,-0.413 0.973,-0.662 1.478,-0.73zM55.3966,50.8617c0,-0.874 -1.012,-1.583 -2.26,-1.583 -1.247,0 -2.259,0.709 -2.259,1.583 0,0.873 1.012,1.583 2.259,1.583 1.248,0 2.26,-0.71 2.26,-1.583z" - android:fillColor="#83d2f2" - android:fillAlpha="0.5" - android:fillType="evenOdd"/> - <path - android:pathData="M50.4455,4.9911A1.9904,2.0095 49.0092,0 0,50.1592 4.9959C49.2723,5.0764 48.3874,5.1935 47.5084,5.3492A1.9904,2.0095 49.0092,0 0,45.8659 7.6669A1.9904,2.0095 49.0092,0 0,48.1713 9.2854C48.9369,9.1498 49.7087,9.0469 50.484,8.9765A1.9904,2.0095 49.0092,0 0,52.3153 6.8042A1.9904,2.0095 49.0092,0 0,50.4455 4.9911zM65.0893,7.2665A1.9904,2.0095 49.0092,0 0,63.1476 8.4804A1.9904,2.0095 49.0092,0 0,64.1812 11.102C64.8912,11.4043 65.5902,11.7396 66.2743,12.1038A1.9904,2.0095 49.0092,0 0,68.9882 11.275A1.9904,2.0095 49.0092,0 0,68.1838 8.5724C67.4021,8.1562 66.5995,7.7718 65.7806,7.4232A1.9904,2.0095 49.0092,0 0,65.0893 7.2665zM34.4084,11.5162A1.9904,2.0095 49.0092,0 0,33.0344 11.9745C32.3395,12.5458 31.6721,13.1474 31.0328,13.7795A1.9904,2.0095 49.0092,0 0,31.0051 16.6078A1.9904,2.0095 49.0092,0 0,33.8351 16.6086C34.3865,16.0634 34.9632,15.542 35.5617,15.0499A1.9904,2.0095 49.0092,0 0,35.8507 12.2367A1.9904,2.0095 49.0092,0 0,34.4084 11.5162zM78.1376,18.4506A1.9904,2.0095 49.0092,0 0,76.9489 18.737A1.9904,2.0095 49.0092,0 0,76.2574 21.4848C76.6535,22.1434 77.0176,22.8183 77.3457,23.5072A1.9904,2.0095 49.0092,0 0,80.0105 24.4327A1.9904,2.0095 49.0092,0 0,80.9644 21.7628C80.5789,20.9532 80.1527,20.1667 79.6938,19.4036A1.9904,2.0095 49.0092,0 0,78.1376 18.4506zM25.416,26.1755A1.9904,2.0095 49.0092,0 0,23.2719 27.7637C23.081,28.6457 22.9341,29.5351 22.8333,30.4302A1.9904,2.0095 49.0092,0 0,24.5982 32.6239A1.9904,2.0095 49.0092,0 0,26.8117 30.8407C26.8974,30.0791 27.0211,29.322 27.1832,28.573A1.9904,2.0095 49.0092,0 0,25.6503 26.2104A1.9904,2.0095 49.0092,0 0,25.416 26.1755zM81.692,33.3108A1.9904,2.0095 49.0092,0 0,79.545 35.1747C79.4872,35.9424 79.3938,36.704 79.2606,37.4559A1.9904,2.0095 49.0092,0 0,80.8822 39.7577A1.9904,2.0095 49.0092,0 0,83.2025 38.1165C83.3603,37.2258 83.469,36.3316 83.5363,35.4373A1.9904,2.0095 49.0092,0 0,81.692 33.3108zM27.7088,43.1317A1.9904,2.0095 49.0092,0 0,26.6262 43.3605A1.9904,2.0095 49.0092,0 0,25.7737 46.0625C26.1887,46.8559 26.6415,47.6264 27.1284,48.3724A1.9904,2.0095 49.0092,0 0,29.8964 48.9387A1.9904,2.0095 49.0092,0 0,30.4877 46.1687C30.0678,45.5255 29.6781,44.8635 29.3239,44.1864A1.9904,2.0095 49.0092,0 0,27.7088 43.1317zM74.6091,49.0167A1.9904,2.0095 49.0092,0 0,73.0652 49.6517C72.5332,50.2161 71.9757,50.7552 71.3951,51.267A1.9904,2.0095 49.0092,0 0,71.2054 54.0886A1.9904,2.0095 49.0092,0 0,74.029 54.2534C74.7046,53.6579 75.3508,53.0317 75.9673,52.3778A1.9904,2.0095 49.0092,0 0,75.8949 49.5527A1.9904,2.0095 49.0092,0 0,74.6091 49.0167zM39.9986,55.0042A1.9904,2.0095 49.0092,0 0,38.1111 56.1218A1.9904,2.0095 49.0092,0 0,39.0036 58.7968C39.8005,59.1884 40.6129,59.5446 41.4403,59.866A1.9904,2.0095 49.0092,0 0,44.0405 58.7245A1.9904,2.0095 49.0092,0 0,42.9219 56.1384C42.2,55.8579 41.492,55.548 40.7981,55.2071A1.9904,2.0095 49.0092,0 0,39.9986 55.0042zM59.5115,57.4057A1.9904,2.0095 49.0092,0 0,58.9875 57.4459C58.2263,57.6058 57.4591,57.7319 56.6851,57.8279A1.9904,2.0095 49.0092,0 0,54.9238 60.0595A1.9904,2.0095 49.0092,0 0,57.1401 61.7955C58.0229,61.686 58.9039,61.5407 59.7777,61.3571A1.9904,2.0095 49.0092,0 0,61.3455 58.9895A1.9904,2.0095 49.0092,0 0,59.5115 57.4057z" - android:strokeLineJoin="round" - android:fillColor="#83d2f2" - android:strokeColor="#00000000" - android:fillType="nonZero" - android:fillAlpha="0.5" - android:strokeLineCap="round"/> - <path - android:pathData="m27.1986,23.9497 l-22,9.818v14.727c0,13.623 9.387,26.362 22,29.455 12.613,-3.093 22,-15.832 22,-29.455v-14.727z" - android:fillColor="#007fad"/> - <path - android:pathData="m16.4886,49.7407 l-3.29,3.443 9.333,9.766 18.667,-19.533 -3.29,-3.467 -15.377,16.09z" - android:fillColor="#ffffff"/> -</vector> diff --git a/Corona-Warn-App/src/main/res/drawable/vaccination_card_icon_complete.xml b/Corona-Warn-App/src/main/res/drawable/vaccination_card_icon_complete.xml new file mode 100644 index 000000000..47227abb7 --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable/vaccination_card_icon_complete.xml @@ -0,0 +1,17 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="78dp" + android:height="72dp" + android:viewportWidth="78" + android:viewportHeight="72"> + <path + android:pathData="M44.2502,0V4.3846H46.4425V6.7139C42.0321,7.1507 38.05,8.8463 34.7958,11.5096L33.1516,9.8654L34.6588,8.3582L31.5759,5.2752L25.41,11.4411L28.4929,14.524L30.0001,13.0168L31.6444,14.6611C28.9811,17.9153 27.2855,21.8974 26.8487,26.3077H24.5194V24.1154H20.1348V32.8846H24.5194V30.6923H26.8487C27.2855,35.1369 29.0153,39.1447 31.7129,42.4075L30.0001,43.9832L28.4929,42.476L25.41,45.5589L31.5759,51.7248L34.6588,48.6418L33.1516,47.1346L34.7958,45.4219C38.0586,48.1023 42.0236,49.8493 46.4425,50.2861V52.6154H44.2502V57H53.0194V52.6154H50.8271V50.2861C55.2459,49.8493 59.2109,48.1023 62.4737,45.4219H62.5422L64.1179,47.1346L62.6107,48.6418L65.6937,51.7248L71.8595,45.5589L68.7766,42.476L67.2694,43.9832L65.5566,42.4075C65.5609,42.3989 65.5588,42.386 65.5566,42.3732C65.5545,42.3604 65.5524,42.3475 65.5566,42.3389C68.2371,39.0762 69.9841,35.1112 70.4208,30.6923H72.7501V32.8846H77.1348V24.1154H72.7501V26.3077H70.4208C69.9841,21.8974 68.2885,17.9153 65.6251,14.6611L67.2694,13.0168L68.7766,14.524L71.8595,11.4411L65.6937,5.2752L62.6107,8.3582L64.1179,9.8654L62.4737,11.5096C59.2195,8.8463 55.2374,7.1507 50.8271,6.7139V4.3846H53.0194V0H44.2502ZM48.6352,10.9604C58.3465,10.9604 66.1737,18.7876 66.1737,28.4989C66.1737,38.2101 58.3465,46.0373 48.6352,46.0373C38.924,46.0373 31.0968,38.2101 31.0968,28.4989C31.0968,18.7876 38.924,10.9604 48.6352,10.9604ZM39.8653,18.9777C39.8653,17.1622 41.3382,15.6893 43.1537,15.6893C44.9692,15.6893 46.4422,17.1622 46.4422,18.9777C46.4422,20.7933 44.9692,22.2662 43.1537,22.2662C41.3382,22.2662 39.8653,20.7933 39.8653,18.9777ZM54.1157,15.6893C52.3002,15.6893 50.8273,17.1622 50.8273,18.9777C50.8273,20.7933 52.3002,22.2662 54.1157,22.2662C55.9312,22.2662 57.4042,20.7933 57.4042,18.9777C57.4042,17.1622 55.9312,15.6893 54.1157,15.6893ZM34.3848,28.499C34.3848,26.6834 35.8578,25.2105 37.6733,25.2105C39.4888,25.2105 40.9618,26.6834 40.9618,28.499C40.9618,30.3145 39.4888,31.7874 37.6733,31.7874C35.8578,31.7874 34.3848,30.3145 34.3848,28.499ZM48.6353,25.2105C46.8198,25.2105 45.3468,26.6834 45.3468,28.499C45.3468,30.3145 46.8198,31.7874 48.6353,31.7874C50.4508,31.7874 51.9237,30.3145 51.9237,28.499C51.9237,26.6834 50.4508,25.2105 48.6353,25.2105ZM56.3075,28.499C56.3075,26.6834 57.7804,25.2105 59.5959,25.2105C61.4114,25.2105 62.8844,26.6834 62.8844,28.499C62.8844,30.3145 61.4114,31.7874 59.5959,31.7874C57.7804,31.7874 56.3075,30.3145 56.3075,28.499ZM43.1537,34.7339C41.3382,34.7339 39.8653,36.2069 39.8653,38.0224C39.8653,39.8379 41.3382,41.3108 43.1537,41.3108C44.9692,41.3108 46.4422,39.8379 46.4422,38.0224C46.4422,36.2069 44.9692,34.7339 43.1537,34.7339ZM50.8273,38.0224C50.8273,36.2069 52.3002,34.7339 54.1157,34.7339C55.9312,34.7339 57.4042,36.2069 57.4042,38.0224C57.4042,39.8379 55.9312,41.3108 54.1157,41.3108C52.3002,41.3108 50.8273,39.8379 50.8273,38.0224Z" + android:fillColor="#ffffff" + android:fillAlpha="0.2" + android:fillType="evenOdd" /> + <path + android:pathData="M22,18L0,27.8182V42.5455C0,56.1682 9.3867,68.9073 22,72C34.6133,68.9073 44,56.1682 44,42.5455V27.8182L22,18Z" + android:fillColor="#ffffff" /> + <path + android:pathData="M11.29,43.7909L8,47.2335L17.3333,57L36,37.4671L32.71,34L17.3333,50.0902L11.29,43.7909Z" + android:fillColor="#007FAD" /> +</vector> diff --git a/Corona-Warn-App/src/main/res/drawable/vaccination_card_icon_incomplete.xml b/Corona-Warn-App/src/main/res/drawable/vaccination_card_icon_incomplete.xml new file mode 100644 index 000000000..f51cc4182 --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable/vaccination_card_icon_incomplete.xml @@ -0,0 +1,20 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="78dp" + android:height="73dp" + android:viewportWidth="78" + android:viewportHeight="73"> + <path + android:pathData="M44.4167,0V4.3846H46.609V6.7139C42.1987,7.1507 38.2165,8.8463 34.9623,11.5096L33.3181,9.8654L34.8253,8.3582L31.7424,5.2752L25.5765,11.4411L28.6594,14.524L30.1667,13.0168L31.8109,14.6611C29.1476,17.9153 27.452,21.8974 27.0152,26.3077H24.6859V24.1154H20.3013V32.8846H24.6859V30.6923H27.0152C27.452,35.1369 29.1818,39.1447 31.8794,42.4075L30.1667,43.9832L28.6594,42.476L25.5765,45.5589L31.7424,51.7248L34.8253,48.6418L33.3181,47.1346L34.9623,45.4219C38.2251,48.1023 42.1901,49.8493 46.609,50.2861V52.6154H44.4167V57H53.1859V52.6154H50.9936V50.2861C55.4124,49.8493 59.3774,48.1023 62.6402,45.4219H62.7087L64.2844,47.1346L62.7772,48.6418L65.8602,51.7248L72.026,45.5589L68.9431,42.476L67.4359,43.9832L65.7231,42.4075C65.7274,42.3989 65.7253,42.386 65.7231,42.3732C65.721,42.3604 65.7189,42.3475 65.7231,42.3389C68.4036,39.0762 70.1506,35.1112 70.5873,30.6923H72.9166V32.8846H77.3013V24.1154H72.9166V26.3077H70.5873C70.1506,21.8974 68.455,17.9153 65.7916,14.6611L67.4359,13.0168L68.9431,14.524L72.026,11.4411L65.8602,5.2752L62.7772,8.3582L64.2844,9.8654L62.6402,11.5096C59.386,8.8463 55.4039,7.1507 50.9936,6.7139V4.3846H53.1859V0H44.4167ZM48.8017,10.9604C58.513,10.9604 66.3402,18.7876 66.3402,28.4989C66.3402,38.2101 58.513,46.0373 48.8017,46.0373C39.0905,46.0373 31.2633,38.2101 31.2633,28.4989C31.2633,18.7876 39.0905,10.9604 48.8017,10.9604ZM40.0318,18.9777C40.0318,17.1622 41.5047,15.6893 43.3202,15.6893C45.1357,15.6893 46.6087,17.1622 46.6087,18.9777C46.6087,20.7933 45.1357,22.2662 43.3202,22.2662C41.5047,22.2662 40.0318,20.7933 40.0318,18.9777ZM54.2822,15.6893C52.4667,15.6893 50.9938,17.1622 50.9938,18.9777C50.9938,20.7933 52.4667,22.2662 54.2822,22.2662C56.0977,22.2662 57.5707,20.7933 57.5707,18.9777C57.5707,17.1622 56.0977,15.6893 54.2822,15.6893ZM34.5513,28.499C34.5513,26.6834 36.0243,25.2105 37.8398,25.2105C39.6553,25.2105 41.1283,26.6834 41.1283,28.499C41.1283,30.3145 39.6553,31.7874 37.8398,31.7874C36.0243,31.7874 34.5513,30.3145 34.5513,28.499ZM48.8018,25.2105C46.9863,25.2105 45.5133,26.6834 45.5133,28.499C45.5133,30.3145 46.9863,31.7874 48.8018,31.7874C50.6173,31.7874 52.0902,30.3145 52.0902,28.499C52.0902,26.6834 50.6173,25.2105 48.8018,25.2105ZM56.474,28.499C56.474,26.6834 57.9469,25.2105 59.7624,25.2105C61.5779,25.2105 63.0509,26.6834 63.0509,28.499C63.0509,30.3145 61.5779,31.7874 59.7624,31.7874C57.9469,31.7874 56.474,30.3145 56.474,28.499ZM43.3202,34.7339C41.5047,34.7339 40.0318,36.2069 40.0318,38.0224C40.0318,39.8379 41.5047,41.3108 43.3202,41.3108C45.1357,41.3108 46.6087,39.8379 46.6087,38.0224C46.6087,36.2069 45.1357,34.7339 43.3202,34.7339ZM50.9938,38.0224C50.9938,36.2069 52.4667,34.7339 54.2822,34.7339C56.0977,34.7339 57.5707,36.2069 57.5707,38.0224C57.5707,39.8379 56.0977,41.3108 54.2822,41.3108C52.4667,41.3108 50.9938,39.8379 50.9938,38.0224Z" + android:fillColor="#ffffff" + android:fillAlpha="0.2" + android:fillType="evenOdd" /> + <path + android:pathData="M17.167,70V24.5532V22L40.167,30.1702V47.5319L33.9508,61.8298L17.167,70Z" + android:fillColor="#616F7E" /> + <path + android:pathData="M21.6667,18.4167L0,26.5417V43.0355C0,56.7126 9.2354,69.4688 21.6667,72.5834C34.0979,69.4688 43.3333,56.7126 43.3333,43.0355V26.5417L21.6667,18.4167ZM37.9167,43.0355C37.9167,53.8688 31.0104,63.8897 21.6667,66.9501C12.3229,63.8897 5.4167,53.8959 5.4167,43.0355V30.3063L21.6667,24.2126L37.9167,30.3063V43.0355Z" + android:fillColor="#ffffff" /> + <path + android:pathData="M21.667,68.5V24V21.5L3.167,29.5V46.5L8.167,60.5L21.667,68.5Z" + android:fillColor="#ffffff" /> +</vector> diff --git a/Corona-Warn-App/src/main/res/drawable/vaccination_card_icon_registration.xml b/Corona-Warn-App/src/main/res/drawable/vaccination_card_icon_registration.xml new file mode 100644 index 000000000..492a32ada --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable/vaccination_card_icon_registration.xml @@ -0,0 +1,17 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="78dp" + android:height="72dp" + android:viewportWidth="78" + android:viewportHeight="72"> + <path + android:pathData="M44.2502,0V4.3846H46.4425V6.7139C42.0321,7.1507 38.05,8.8463 34.7958,11.5096L33.1516,9.8654L34.6588,8.3582L31.5759,5.2752L25.41,11.4411L28.4929,14.524L30.0001,13.0168L31.6444,14.6611C28.9811,17.9153 27.2855,21.8974 26.8487,26.3077H24.5194V24.1154H20.1348V32.8846H24.5194V30.6923H26.8487C27.2855,35.1369 29.0153,39.1447 31.7129,42.4075L30.0001,43.9832L28.4929,42.476L25.41,45.5589L31.5759,51.7248L34.6588,48.6418L33.1516,47.1346L34.7958,45.4219C38.0586,48.1023 42.0236,49.8493 46.4425,50.2861V52.6154H44.2502V57H53.0194V52.6154H50.8271V50.2861C55.2459,49.8493 59.2109,48.1023 62.4737,45.4219H62.5422L64.1179,47.1346L62.6107,48.6418L65.6937,51.7248L71.8595,45.5589L68.7766,42.476L67.2694,43.9832L65.5566,42.4075C65.5609,42.3989 65.5588,42.386 65.5566,42.3732C65.5545,42.3604 65.5524,42.3475 65.5566,42.3389C68.2371,39.0762 69.9841,35.1112 70.4208,30.6923H72.7501V32.8846H77.1348V24.1154H72.7501V26.3077H70.4208C69.9841,21.8974 68.2885,17.9153 65.6251,14.6611L67.2694,13.0168L68.7766,14.524L71.8595,11.4411L65.6937,5.2752L62.6107,8.3582L64.1179,9.8654L62.4737,11.5096C59.2195,8.8463 55.2374,7.1507 50.8271,6.7139V4.3846H53.0194V0H44.2502ZM48.6352,10.9604C58.3465,10.9604 66.1737,18.7876 66.1737,28.4989C66.1737,38.2101 58.3465,46.0373 48.6352,46.0373C38.924,46.0373 31.0968,38.2101 31.0968,28.4989C31.0968,18.7876 38.924,10.9604 48.6352,10.9604ZM39.8653,18.9777C39.8653,17.1622 41.3382,15.6893 43.1537,15.6893C44.9692,15.6893 46.4422,17.1622 46.4422,18.9777C46.4422,20.7933 44.9692,22.2662 43.1537,22.2662C41.3382,22.2662 39.8653,20.7933 39.8653,18.9777ZM54.1157,15.6893C52.3002,15.6893 50.8273,17.1622 50.8273,18.9777C50.8273,20.7933 52.3002,22.2662 54.1157,22.2662C55.9312,22.2662 57.4042,20.7933 57.4042,18.9777C57.4042,17.1622 55.9312,15.6893 54.1157,15.6893ZM34.3848,28.499C34.3848,26.6834 35.8578,25.2105 37.6733,25.2105C39.4888,25.2105 40.9618,26.6834 40.9618,28.499C40.9618,30.3145 39.4888,31.7874 37.6733,31.7874C35.8578,31.7874 34.3848,30.3145 34.3848,28.499ZM48.6353,25.2105C46.8198,25.2105 45.3468,26.6834 45.3468,28.499C45.3468,30.3145 46.8198,31.7874 48.6353,31.7874C50.4508,31.7874 51.9237,30.3145 51.9237,28.499C51.9237,26.6834 50.4508,25.2105 48.6353,25.2105ZM56.3075,28.499C56.3075,26.6834 57.7804,25.2105 59.5959,25.2105C61.4114,25.2105 62.8844,26.6834 62.8844,28.499C62.8844,30.3145 61.4114,31.7874 59.5959,31.7874C57.7804,31.7874 56.3075,30.3145 56.3075,28.499ZM43.1537,34.7339C41.3382,34.7339 39.8653,36.2069 39.8653,38.0224C39.8653,39.8379 41.3382,41.3108 43.1537,41.3108C44.9692,41.3108 46.4422,39.8379 46.4422,38.0224C46.4422,36.2069 44.9692,34.7339 43.1537,34.7339ZM50.8273,38.0224C50.8273,36.2069 52.3002,34.7339 54.1157,34.7339C55.9312,34.7339 57.4042,36.2069 57.4042,38.0224C57.4042,39.8379 55.9312,41.3108 54.1157,41.3108C52.3002,41.3108 50.8273,39.8379 50.8273,38.0224Z" + android:fillColor="#007FAD" + android:fillAlpha="0.1" + android:fillType="evenOdd" /> + <path + android:pathData="M22,18L0,27.8182V42.5455C0,56.1682 9.3867,68.9073 22,72C34.6133,68.9073 44,56.1682 44,42.5455V27.8182L22,18Z" + android:fillColor="#007FAD" /> + <path + android:pathData="M11.29,43.7909L8,47.2335L17.3333,57L36,37.4671L32.71,34L17.3333,50.0902L11.29,43.7909Z" + android:fillColor="#ffffff" /> +</vector> diff --git a/Corona-Warn-App/src/main/res/layout/vaccination_home_complete_card.xml b/Corona-Warn-App/src/main/res/layout/vaccination_home_complete_card.xml new file mode 100644 index 000000000..598ddd22d --- /dev/null +++ b/Corona-Warn-App/src/main/res/layout/vaccination_home_complete_card.xml @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/vaccination_compelete_gradient" + android:padding="@dimen/card_padding"> + + + <ImageView + android:id="@+id/show_more_action" + android:layout_width="@dimen/icon_size_risk_card" + android:layout_height="@dimen/icon_size_risk_card" + android:importantForAccessibility="no" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:srcCompat="@drawable/ic_forward" + app:tint="@color/colorStableLight" /> + + <ImageView + android:id="@+id/icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@+id/show_more_action" + app:srcCompat="@drawable/vaccination_card_icon_complete" /> + + <TextView + android:id="@+id/card_title" + style="@style/body2" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginEnd="8dp" + android:accessibilityHeading="true" + android:focusable="false" + android:text="@string/vaccination_card_status_title" + android:textColor="@color/colorTextPrimary1InvertedStable" + app:layout_constraintEnd_toStartOf="@id/show_more_action" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <TextView + android:id="@+id/vaccination_label" + style="@style/headline5Bold" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginEnd="16dp" + android:accessibilityHeading="true" + android:focusable="false" + android:textColor="@color/colorTextPrimary1InvertedStable" + app:layout_constraintEnd_toStartOf="@+id/icon" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/card_title" + android:text="@string/vaccination_card_status_vaccination_name" /> + + <TextView + android:id="@+id/person_name" + style="@style/body1" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + android:layout_marginEnd="16dp" + android:accessibilityHeading="true" + android:focusable="false" + android:textColor="@color/colorTextPrimary1InvertedStable" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toStartOf="@+id/icon" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/vaccination_label" + tools:text="François-Joan d'Arsøns - van Halen" /> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/layout/vaccination_home_incomplete_card.xml b/Corona-Warn-App/src/main/res/layout/vaccination_home_incomplete_card.xml new file mode 100644 index 000000000..6967cbc80 --- /dev/null +++ b/Corona-Warn-App/src/main/res/layout/vaccination_home_incomplete_card.xml @@ -0,0 +1,93 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/vaccination_incomplete" + android:padding="@dimen/card_padding"> + + + <ImageView + android:id="@+id/show_more_action" + android:layout_width="@dimen/icon_size_risk_card" + android:layout_height="@dimen/icon_size_risk_card" + android:importantForAccessibility="no" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:srcCompat="@drawable/ic_forward" + app:tint="@color/colorStableLight" /> + + <ImageView + android:id="@+id/icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@+id/show_more_action" + app:srcCompat="@drawable/vaccination_card_icon_incomplete" /> + + + <TextView + android:id="@+id/card_title" + style="@style/body2" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginEnd="8dp" + android:accessibilityHeading="true" + android:focusable="false" + android:text="@string/vaccination_card_status_title" + android:textColor="@color/colorTextPrimary1InvertedStable" + app:layout_constraintEnd_toStartOf="@id/show_more_action" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <TextView + android:id="@+id/vaccination_label" + style="@style/headline5Bold" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginEnd="16dp" + android:accessibilityHeading="true" + android:focusable="false" + android:textColor="@color/colorTextPrimary1InvertedStable" + app:layout_constraintEnd_toStartOf="@+id/icon" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/card_title" + android:text="@string/vaccination_card_status_vaccination_name" /> + + <TextView + android:id="@+id/vaccination_state" + style="@style/body1" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + android:layout_marginEnd="16dp" + android:accessibilityHeading="true" + android:focusable="false" + android:text="@string/vaccination_card_status_vaccination_incomplete" + android:textColor="@color/colorTextPrimary1InvertedStable" + app:layout_constraintBottom_toTopOf="@+id/person_name" + app:layout_constraintEnd_toStartOf="@+id/icon" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/vaccination_label" + app:layout_constraintVertical_chainStyle="packed" /> + + <TextView + android:id="@+id/person_name" + style="@style/body1" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:layout_marginEnd="16dp" + android:accessibilityHeading="true" + android:focusable="false" + android:textColor="@color/colorTextPrimary1InvertedStable" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toStartOf="@+id/icon" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/vaccination_state" + tools:text="François-Joan d'Arsøns - van Halen" /> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/layout/home_vaccination_registration_card.xml b/Corona-Warn-App/src/main/res/layout/vaccination_home_registration_card.xml similarity index 96% rename from Corona-Warn-App/src/main/res/layout/home_vaccination_registration_card.xml rename to Corona-Warn-App/src/main/res/layout/vaccination_home_registration_card.xml index d2ac24a8c..2be066af0 100644 --- a/Corona-Warn-App/src/main/res/layout/home_vaccination_registration_card.xml +++ b/Corona-Warn-App/src/main/res/layout/vaccination_home_registration_card.xml @@ -37,7 +37,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/title" /> - <androidx.appcompat.widget.AppCompatImageView + <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" @@ -45,7 +45,7 @@ android:importantForAccessibility="no" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@id/body" - app:srcCompat="@drawable/ic_card_impfzertifikat_registrieren" /> + app:srcCompat="@drawable/vaccination_card_icon_registration" /> <androidx.constraintlayout.widget.Barrier android:id="@+id/button_barrier" diff --git a/Corona-Warn-App/src/main/res/values-de/strings.xml b/Corona-Warn-App/src/main/res/values-de/strings.xml index a37854f42..2aa31ae7c 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -2019,13 +2019,6 @@ <!-- XBUT: Trace location check-ins invalid qr code dialog negative button --> <string name="trace_location_attendee_invalid_qr_code_dialog_negative_button">Abbrechen</string> - <!-- XHED: Title for Vaccination Certificate Registration Home Card --> - <string name="vaccination_card_registration_title">"Impfzertifikat registrieren"</string> - <!-- YTXT: Body text for Vaccination Certificate Registration Home Card --> - <string name="vaccination_card_registration_body">"Scannen Sie den QR-Code auf Ihrem Impfzertifikat, um Ihre Impfung zu registrieren und einen digitalen Impfnachweis zu erhalten."</string> - <!-- XBUT: button for Vaccination Certificate Registration Home Card --> - <string name="vaccination_card_register">"Registrieren"</string> - <!-- #################################### Incompatibility warning 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 509205f64..1fd6ee372 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 @@ -53,4 +53,21 @@ <string name="vaccination_list_refresh_button">Aktualisieren</string> <!-- XACT: Vaccination List Qr-Code for screen readers --> <string name="vaccination_list_qr_code_accessibility">Qr-Code</string> + + <!-- #################################### + Homescreen cards + ###################################### --> + <!-- XHED: Title for Vaccination Certificate Registration Home Card --> + <string name="vaccination_card_registration_title">"Impfzertifikat registrieren"</string> + <!-- YTXT: Body text for Vaccination Certificate Registration Home Card --> + <string name="vaccination_card_registration_body">"Scannen Sie den QR-Code auf Ihrem Impfzertifikat, um Ihre Impfung zu registrieren und einen digitalen Impfnachweis zu erhalten."</string> + <!-- XBUT: button for Vaccination Certificate Registration Home Card --> + <string name="vaccination_card_register">"Registrieren"</string> + + <!-- XHED: Homescreen vaccination status card title --> + <string name="vaccination_card_status_title">Digitaler Impfnachweis</string> + <!-- XHED: Homescreen vaccination status card vaccination name --> + <string name="vaccination_card_status_vaccination_name">SARS-CoV-2 Impfschutz</string> + <!-- XTXT: Homescreen vaccination status card vaccination status label --> + <string name="vaccination_card_status_vaccination_incomplete">Unvollständiger Impfschutz</string> </resources> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index a31b14a00..7efe85f0e 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -2025,13 +2025,6 @@ <!-- XBUT: Trace location check-ins invalid qr code dialog negative button --> <string name="trace_location_attendee_invalid_qr_code_dialog_negative_button">"Cancel"</string> - <!-- XHED: Title for Vaccination Certificate Registration Home Card --> - <string name="vaccination_card_registration_title">"Impfzertifikat registrieren"</string> - <!-- YTXT: Body text for Vaccination Certificate Registration Home Card --> - <string name="vaccination_card_registration_body">"Scannen Sie den QR-Code auf Ihrem Impfzertifikat, um Ihre Impfung zu registrieren und einen digitalen Impfnachweis zu erhalten."</string> - <!-- XBUT: button for Vaccination Certificate Registration Home Card --> - <string name="vaccination_card_register">"Registrieren"</string> - <!-- #################################### Incompatibility warning 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 19d6084dc..04f9233d6 100644 --- a/Corona-Warn-App/src/main/res/values/vaccination_strings.xml +++ b/Corona-Warn-App/src/main/res/values/vaccination_strings.xml @@ -53,4 +53,21 @@ <string name="vaccination_list_refresh_button">Aktualisieren</string> <!-- XACT: Vaccination List Qr-Code for screen readers --> <string name="vaccination_list_qr_code_accessibility">Qr-Code</string> + + <!-- #################################### + Homescreen cards + ###################################### --> + <!-- XHED: Title for Vaccination Certificate Registration Home Card --> + <string name="vaccination_card_registration_title">"Impfzertifikat registrieren"</string> + <!-- YTXT: Body text for Vaccination Certificate Registration Home Card --> + <string name="vaccination_card_registration_body">"Scannen Sie den QR-Code auf Ihrem Impfzertifikat, um Ihre Impfung zu registrieren und einen digitalen Impfnachweis zu erhalten."</string> + <!-- XBUT: button for Vaccination Certificate Registration Home Card --> + <string name="vaccination_card_register">"Registrieren"</string> + + <!-- XHED: Homescreen card title --> + <string name="vaccination_card_status_title">Digitaler Impfnachweis</string> + <!-- XHED: Homescreen vaccination status card vaccination name --> + <string name="vaccination_card_status_vaccination_name">SARS-CoV-2 Impfschutz</string> + <!-- XTXT: Homescreen card vaccination status label --> + <string name="vaccination_card_status_vaccination_incomplete">Unvollständiger Impfschutz</string> </resources> \ No newline at end of file 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 3e45f0f9e..20cdd3a35 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 @@ -21,6 +21,7 @@ import de.rki.coronawarnapp.util.TimeStamper import de.rki.coronawarnapp.util.bluetooth.BluetoothSupport import de.rki.coronawarnapp.util.encryptionmigration.EncryptionErrorResetTool import de.rki.coronawarnapp.util.shortcuts.AppShortcutsHelper +import de.rki.coronawarnapp.vaccination.core.repository.VaccinationRepository import io.kotest.matchers.shouldBe import io.mockk.MockKAnnotations import io.mockk.coEvery @@ -62,6 +63,7 @@ class HomeFragmentViewModelTest : BaseTest() { @MockK lateinit var traceLocationOrganizerSettings: TraceLocationOrganizerSettings @MockK lateinit var timeStamper: TimeStamper @MockK lateinit var bluetoothSupport: BluetoothSupport + @MockK lateinit var vaccinationRepository: VaccinationRepository @BeforeEach fun setup() { @@ -74,6 +76,8 @@ class HomeFragmentViewModelTest : BaseTest() { every { coronaTestRepository.coronaTests } returns emptyFlow() + every { vaccinationRepository.vaccinationInfos } returns emptyFlow() + coEvery { appConfigProvider.currentConfig } returns emptyFlow() coEvery { statisticsProvider.current } returns emptyFlow() @@ -100,7 +104,8 @@ class HomeFragmentViewModelTest : BaseTest() { tracingSettings = tracingSettings, traceLocationOrganizerSettings = traceLocationOrganizerSettings, timeStamper = timeStamper, - bluetoothSupport = bluetoothSupport + bluetoothSupport = bluetoothSupport, + vaccinationRepository = vaccinationRepository, ) @Test diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/VaccinationTestData.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/VaccinationTestData.kt index df5f31e9f..7f89c0a02 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/VaccinationTestData.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/VaccinationTestData.kt @@ -4,8 +4,8 @@ import de.rki.coronawarnapp.vaccination.core.qrcode.VaccinationCertificateData import de.rki.coronawarnapp.vaccination.core.qrcode.VaccinationCertificateHeader import de.rki.coronawarnapp.vaccination.core.qrcode.VaccinationCertificateQRCode import de.rki.coronawarnapp.vaccination.core.qrcode.VaccinationCertificateV1 -import de.rki.coronawarnapp.vaccination.core.repository.storage.PersonData import de.rki.coronawarnapp.vaccination.core.repository.storage.ProofContainer +import de.rki.coronawarnapp.vaccination.core.repository.storage.VaccinatedPersonData import de.rki.coronawarnapp.vaccination.core.repository.storage.VaccinationContainer import de.rki.coronawarnapp.vaccination.core.server.proof.ProofCertificateData import de.rki.coronawarnapp.vaccination.core.server.proof.ProofCertificateResponse @@ -165,7 +165,7 @@ object VaccinationTestData { get() = "VGhpc0lzQVByb29mQ09TRQ".decodeBase64()!! } - val PERSON_A_DATA_2VAC_PROOF = PersonData( + val PERSON_A_DATA_2VAC_PROOF = VaccinatedPersonData( vaccinations = setOf(PERSON_A_VAC_1_CONTAINER, PERSON_A_VAC_2_CONTAINER), proofs = setOf(PERSON_A_PROOF_1_CONTAINER), ) @@ -213,7 +213,7 @@ object VaccinationTestData { preParsedData = PERSON_B_VAC_1_DATA } - val PERSON_B_DATA_1VAC_NOPROOF = PersonData( + val PERSON_B_DATA_1VAC_NOPROOF = VaccinatedPersonData( vaccinations = setOf(PERSON_B_VAC_1_CONTAINER), proofs = emptySet() ) diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/repository/VaccinationRepositoryTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/repository/VaccinationRepositoryTest.kt index dfb4b86a2..8e26cdd9d 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/repository/VaccinationRepositoryTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/repository/VaccinationRepositoryTest.kt @@ -2,7 +2,7 @@ package de.rki.coronawarnapp.vaccination.core.repository import de.rki.coronawarnapp.util.TimeStamper import de.rki.coronawarnapp.vaccination.core.VaccinationTestData -import de.rki.coronawarnapp.vaccination.core.repository.storage.PersonData +import de.rki.coronawarnapp.vaccination.core.repository.storage.VaccinatedPersonData import de.rki.coronawarnapp.vaccination.core.repository.storage.VaccinationStorage import de.rki.coronawarnapp.vaccination.core.server.proof.VaccinationProofServer import de.rki.coronawarnapp.vaccination.core.server.valueset.VaccinationValueSet @@ -30,7 +30,7 @@ class VaccinationRepositoryTest : BaseTest() { @MockK lateinit var vaccinationProofServer: VaccinationProofServer @MockK lateinit var vaccinationValueSet: VaccinationValueSet - private var testStorage: Set<PersonData> = emptySet() + private var testStorage: Set<VaccinatedPersonData> = emptySet() private var nowUTC = Instant.ofEpochMilli(1234567890) -- GitLab