From e37d250800103aedbf7621e6ef857f94d69352ef Mon Sep 17 00:00:00 2001
From: Matthias Urhahn <matthias.urhahn@sap.com>
Date: Thu, 29 Apr 2021 13:52:06 +0200
Subject: [PATCH] Vaccination skeleton classes. (#3010)

---
 .../test/menu/ui/TestMenuFragmentViewModel.kt |  2 +
 .../ui/main/MainActivityTestModule.kt         |  4 ++
 .../vaccination/ui/VaccinationTestFragment.kt | 29 +++++++++++++++
 .../ui/VaccinationTestFragmentModule.kt       | 18 +++++++++
 .../ui/VaccinationTestFragmentViewModel.kt    | 15 ++++++++
 .../res/layout/fragment_test_vaccination.xml  | 37 +++++++++++++++++++
 .../res/navigation/test_nav_graph.xml         | 12 +++++-
 .../ui/main/MainActivityModule.kt             |  4 +-
 .../util/di/ApplicationComponent.kt           |  2 +
 .../vaccination/core/ProofCertificate.kt      |  8 ++++
 .../vaccination/core/VaccinatedPerson.kt      | 32 ++++++++++++++++
 .../core/VaccinationCertificate.kt            | 27 ++++++++++++++
 .../vaccination/core/VaccinationModule.kt     |  6 +++
 .../qrcode/VaccinationCertificateQRCode.kt    |  9 +++++
 .../core/qrcode/VaccinationQRCodeValidator.kt | 12 ++++++
 .../core/repository/VaccinationRepository.kt  | 25 +++++++++++++
 .../core/server/ProofCertificateServerData.kt |  3 ++
 .../core/server/VaccinationProofServer.kt     | 15 ++++++++
 .../core/server/VaccinationServer.kt          | 17 +++++++++
 .../core/server/VaccinationValueSet.kt        |  7 ++++
 .../vaccination/ui/VaccinationUIModule.kt     |  6 +++
 .../res/navigation/vaccination_nav_graph.xml  |  6 +++
 22 files changed, 293 insertions(+), 3 deletions(-)
 create mode 100644 Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/vaccination/ui/VaccinationTestFragment.kt
 create mode 100644 Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/vaccination/ui/VaccinationTestFragmentModule.kt
 create mode 100644 Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/vaccination/ui/VaccinationTestFragmentViewModel.kt
 create mode 100644 Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_vaccination.xml
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/ProofCertificate.kt
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/VaccinatedPerson.kt
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/VaccinationCertificate.kt
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/VaccinationModule.kt
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/qrcode/VaccinationCertificateQRCode.kt
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/qrcode/VaccinationQRCodeValidator.kt
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/repository/VaccinationRepository.kt
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/server/ProofCertificateServerData.kt
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/server/VaccinationProofServer.kt
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/server/VaccinationServer.kt
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/server/VaccinationValueSet.kt
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/VaccinationUIModule.kt
 create mode 100644 Corona-Warn-App/src/main/res/navigation/vaccination_nav_graph.xml

diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/menu/ui/TestMenuFragmentViewModel.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/menu/ui/TestMenuFragmentViewModel.kt
index 5481b8257..e4ef69df2 100644
--- a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/menu/ui/TestMenuFragmentViewModel.kt
+++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/menu/ui/TestMenuFragmentViewModel.kt
@@ -21,6 +21,7 @@ import de.rki.coronawarnapp.test.tasks.ui.TestTaskControllerFragment
 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.ui.VaccinationTestFragment
 
 class TestMenuFragmentViewModel @AssistedInject constructor() : CWAViewModel() {
 
@@ -41,6 +42,7 @@ class TestMenuFragmentViewModel @AssistedInject constructor() : CWAViewModel() {
             PresenceTracingTestFragment.MENU_ITEM,
             HomeTestCardsFragment.MENU_ITEM,
             CoronaTestTestFragment.MENU_ITEM,
+            VaccinationTestFragment.MENU_ITEM,
         ).let { MutableLiveData(it) }
     }
     val showTestScreenEvent = SingleLiveEvent<TestMenuItem>()
diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/ui/main/MainActivityTestModule.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/ui/main/MainActivityTestModule.kt
index 65aa2e652..169db0804 100644
--- a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/ui/main/MainActivityTestModule.kt
+++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/ui/main/MainActivityTestModule.kt
@@ -34,6 +34,7 @@ import de.rki.coronawarnapp.test.submission.ui.SubmissionTestFragment
 import de.rki.coronawarnapp.test.submission.ui.SubmissionTestFragmentModule
 import de.rki.coronawarnapp.test.tasks.ui.TestTaskControllerFragment
 import de.rki.coronawarnapp.test.tasks.ui.TestTaskControllerFragmentModule
+import de.rki.coronawarnapp.vaccination.ui.VaccinationTestFragmentModule
 
 @Module
 abstract class MainActivityTestModule {
@@ -85,4 +86,7 @@ abstract class MainActivityTestModule {
 
     @ContributesAndroidInjector(modules = [CoronaTestTestFragmentModule::class])
     abstract fun coronaTest(): CoronaTestTestFragment
+
+    @ContributesAndroidInjector(modules = [VaccinationTestFragmentModule::class])
+    abstract fun vaccinationTest(): VaccinationTestFragmentModule
 }
diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/vaccination/ui/VaccinationTestFragment.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/vaccination/ui/VaccinationTestFragment.kt
new file mode 100644
index 000000000..5e9b68b66
--- /dev/null
+++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/vaccination/ui/VaccinationTestFragment.kt
@@ -0,0 +1,29 @@
+package de.rki.coronawarnapp.vaccination.ui
+
+import android.annotation.SuppressLint
+import androidx.fragment.app.Fragment
+import de.rki.coronawarnapp.R
+import de.rki.coronawarnapp.databinding.FragmentTestVaccinationBinding
+import de.rki.coronawarnapp.test.menu.ui.TestMenuItem
+import de.rki.coronawarnapp.util.di.AutoInject
+import de.rki.coronawarnapp.util.ui.viewBindingLazy
+import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider
+import de.rki.coronawarnapp.util.viewmodel.cwaViewModels
+import javax.inject.Inject
+
+@SuppressLint("SetTextI18n")
+class VaccinationTestFragment : Fragment(R.layout.fragment_test_vaccination), AutoInject {
+
+    @Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory
+    private val vm: VaccinationTestFragmentViewModel by cwaViewModels { viewModelFactory }
+
+    private val binding: FragmentTestVaccinationBinding by viewBindingLazy()
+
+    companion object {
+        val MENU_ITEM = TestMenuItem(
+            title = "Vaccination",
+            description = "View & Control vaccination related features.",
+            targetId = R.id.vaccinationTestFragment
+        )
+    }
+}
diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/vaccination/ui/VaccinationTestFragmentModule.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/vaccination/ui/VaccinationTestFragmentModule.kt
new file mode 100644
index 000000000..fb24039c6
--- /dev/null
+++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/vaccination/ui/VaccinationTestFragmentModule.kt
@@ -0,0 +1,18 @@
+package de.rki.coronawarnapp.vaccination.ui
+
+import dagger.Binds
+import dagger.Module
+import dagger.multibindings.IntoMap
+import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
+import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory
+import de.rki.coronawarnapp.util.viewmodel.CWAViewModelKey
+
+@Module
+abstract class VaccinationTestFragmentModule {
+    @Binds
+    @IntoMap
+    @CWAViewModelKey(VaccinationTestFragmentViewModel::class)
+    abstract fun testVaccinationFragment(
+        factory: VaccinationTestFragmentViewModel.Factory
+    ): CWAViewModelFactory<out CWAViewModel>
+}
diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/vaccination/ui/VaccinationTestFragmentViewModel.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/vaccination/ui/VaccinationTestFragmentViewModel.kt
new file mode 100644
index 000000000..b9e4d4498
--- /dev/null
+++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/vaccination/ui/VaccinationTestFragmentViewModel.kt
@@ -0,0 +1,15 @@
+package de.rki.coronawarnapp.vaccination.ui
+
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
+import de.rki.coronawarnapp.util.coroutine.DispatcherProvider
+import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
+import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory
+
+class VaccinationTestFragmentViewModel @AssistedInject constructor(
+    dispatcherProvider: DispatcherProvider,
+) : CWAViewModel(dispatcherProvider = dispatcherProvider) {
+
+    @AssistedFactory
+    interface Factory : SimpleCWAViewModelFactory<VaccinationTestFragmentViewModel>
+}
diff --git a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_vaccination.xml b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_vaccination.xml
new file mode 100644
index 000000000..f170270ef
--- /dev/null
+++ b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_vaccination.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<androidx.core.widget.NestedScrollView 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="match_parent"
+    tools:ignore="HardcodedText">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_margin="8dp"
+        android:orientation="vertical"
+        android:paddingBottom="32dp">
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            style="@style/Card"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="@dimen/spacing_tiny"
+            android:layout_marginStart="8dp"
+            android:layout_marginEnd="8dp"
+            android:orientation="vertical">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="Vaccinations"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+    </LinearLayout>
+</androidx.core.widget.NestedScrollView>
diff --git a/Corona-Warn-App/src/deviceForTesters/res/navigation/test_nav_graph.xml b/Corona-Warn-App/src/deviceForTesters/res/navigation/test_nav_graph.xml
index fcb6ad236..ae905210d 100644
--- a/Corona-Warn-App/src/deviceForTesters/res/navigation/test_nav_graph.xml
+++ b/Corona-Warn-App/src/deviceForTesters/res/navigation/test_nav_graph.xml
@@ -55,6 +55,9 @@
         <action
             android:id="@+id/action_test_menu_fragment_to_coronaTestTestFragment"
             app:destination="@id/coronaTestTestFragment" />
+        <action
+            android:id="@+id/action_test_menu_fragment_to_vaccinationTestFragment"
+            app:destination="@id/vaccinationTestFragment" />
     </fragment>
 
     <fragment
@@ -160,6 +163,11 @@
     <fragment
         android:id="@+id/coronaTestTestFragment"
         android:name="de.rki.coronawarnapp.test.coronatest.ui.CoronaTestTestFragment"
-        tools:layout="@layout/fragment_test_coronatest"
-        android:label="CoronaTestTestFragment" />
+        android:label="CoronaTestTestFragment"
+        tools:layout="@layout/fragment_test_coronatest" />
+    <fragment
+        android:id="@+id/vaccinationTestFragment"
+        android:name="de.rki.coronawarnapp.vaccination.ui.VaccinationTestFragment"
+        android:label="VaccinationTestFragment"
+        tools:layout="@layout/fragment_test_vaccination" />
 </navigation>
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivityModule.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivityModule.kt
index 30e1176b6..b81d1a5fc 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivityModule.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivityModule.kt
@@ -9,13 +9,13 @@ import de.rki.coronawarnapp.release.NewReleaseInfoFragment
 import de.rki.coronawarnapp.release.NewReleaseInfoFragmentModule
 import de.rki.coronawarnapp.tracing.ui.details.TracingDetailsFragmentModule
 import de.rki.coronawarnapp.ui.coronatest.rat.profile.RATProfileUIModule
-import de.rki.coronawarnapp.ui.presencetracing.PresenceTracingUIModule
 import de.rki.coronawarnapp.ui.information.InformationFragmentModule
 import de.rki.coronawarnapp.ui.interoperability.InteroperabilityConfigurationFragment
 import de.rki.coronawarnapp.ui.interoperability.InteroperabilityConfigurationFragmentModule
 import de.rki.coronawarnapp.ui.main.home.HomeFragmentModule
 import de.rki.coronawarnapp.ui.onboarding.OnboardingDeltaAnalyticsModule
 import de.rki.coronawarnapp.ui.onboarding.OnboardingDeltaInteroperabilityModule
+import de.rki.coronawarnapp.ui.presencetracing.PresenceTracingUIModule
 import de.rki.coronawarnapp.ui.settings.SettingFragmentsModule
 import de.rki.coronawarnapp.ui.settings.SettingsResetFragment
 import de.rki.coronawarnapp.ui.settings.SettingsResetModule
@@ -23,6 +23,7 @@ import de.rki.coronawarnapp.ui.submission.viewmodel.SubmissionFragmentModule
 import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
 import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory
 import de.rki.coronawarnapp.util.viewmodel.CWAViewModelKey
+import de.rki.coronawarnapp.vaccination.ui.VaccinationUIModule
 
 @Module(
     includes = [
@@ -37,6 +38,7 @@ import de.rki.coronawarnapp.util.viewmodel.CWAViewModelKey
         AnalyticsUIModule::class,
         PresenceTracingUIModule::class,
         RATProfileUIModule::class,
+        VaccinationUIModule::class,
     ]
 )
 abstract class MainActivityModule {
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt
index 574ed5dbc..d66b60dcd 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt
@@ -44,6 +44,7 @@ import de.rki.coronawarnapp.util.encryptionmigration.EncryptionErrorResetTool
 import de.rki.coronawarnapp.util.security.SecurityModule
 import de.rki.coronawarnapp.util.serialization.SerializationModule
 import de.rki.coronawarnapp.util.worker.WorkerBinder
+import de.rki.coronawarnapp.vaccination.core.VaccinationModule
 import javax.inject.Singleton
 
 @Singleton
@@ -78,6 +79,7 @@ import javax.inject.Singleton
         SecurityModule::class,
         PresenceTracingModule::class,
         CoronaTestModule::class,
+        VaccinationModule::class,
     ]
 )
 interface ApplicationComponent : AndroidInjector<CoronaWarnApplication> {
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/ProofCertificate.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/ProofCertificate.kt
new file mode 100644
index 000000000..9db77d4b5
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/ProofCertificate.kt
@@ -0,0 +1,8 @@
+package de.rki.coronawarnapp.vaccination.core
+
+import org.joda.time.Instant
+
+interface ProofCertificate {
+
+    val expiresAt: Instant
+}
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
new file mode 100644
index 000000000..24dc25d45
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/VaccinatedPerson.kt
@@ -0,0 +1,32 @@
+package de.rki.coronawarnapp.vaccination.core
+
+import org.joda.time.Instant
+import org.joda.time.LocalDate
+
+data class VaccinatedPerson(
+    val vaccinationCertificates: Set<VaccinationCertificate>,
+    val proofCertificates: Set<ProofCertificate>,
+    val isRefreshing: Boolean,
+    val lastUpdatedAt: Instant,
+) {
+    val identifier: VaccinatedPersonIdentifier = ""
+
+    val firstName: String
+        get() = ""
+
+    val lastName: String
+        get() = ""
+
+    val dateOfBirth: LocalDate
+        get() = LocalDate.now()
+
+    val vaccinationStatus: Status
+        get() = Status.INCOMPLETE
+
+    enum class Status {
+        INCOMPLETE,
+        COMPLETE
+    }
+}
+
+typealias VaccinatedPersonIdentifier = String
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/VaccinationCertificate.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/VaccinationCertificate.kt
new file mode 100644
index 000000000..e2c3580d3
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/VaccinationCertificate.kt
@@ -0,0 +1,27 @@
+package de.rki.coronawarnapp.vaccination.core
+
+import de.rki.coronawarnapp.ui.Country
+import org.joda.time.Instant
+import org.joda.time.LocalDate
+
+interface VaccinationCertificate {
+
+    val firstName: String
+    val lastName: String
+    val dateOfBirth: LocalDate
+
+    val vaccinatedAt: Instant
+
+    val vaccinationName: String
+    val vaccinationManufacturer: String
+
+    val chargeId: String
+
+    val certificateIssuer: String
+    val certificateCountry: Country
+
+    val certificateId: String
+
+    val identifier: VaccinatedPersonIdentifier
+        get() = ""
+}
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/VaccinationModule.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/VaccinationModule.kt
new file mode 100644
index 000000000..a8347a192
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/VaccinationModule.kt
@@ -0,0 +1,6 @@
+package de.rki.coronawarnapp.vaccination.core
+
+import dagger.Module
+
+@Module
+class VaccinationModule
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/qrcode/VaccinationCertificateQRCode.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/qrcode/VaccinationCertificateQRCode.kt
new file mode 100644
index 000000000..ad4ff24d6
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/qrcode/VaccinationCertificateQRCode.kt
@@ -0,0 +1,9 @@
+package de.rki.coronawarnapp.vaccination.core.qrcode
+
+// TODO
+data class VaccinationCertificateQRCode(
+    // Vaccine or prophylaxis
+    val vaccineNameId: String,
+    val vaccineMedicinalProduct: String,
+    val marketAuthorizationHolder: String,
+)
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/qrcode/VaccinationQRCodeValidator.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/qrcode/VaccinationQRCodeValidator.kt
new file mode 100644
index 000000000..e3767500c
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/qrcode/VaccinationQRCodeValidator.kt
@@ -0,0 +1,12 @@
+package de.rki.coronawarnapp.vaccination.core.qrcode
+
+import dagger.Reusable
+import javax.inject.Inject
+
+@Reusable
+class VaccinationQRCodeValidator @Inject constructor() {
+
+    fun validate(raw: String): VaccinationCertificateQRCode {
+        throw NotImplementedError()
+    }
+}
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
new file mode 100644
index 000000000..ba12dd14b
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/repository/VaccinationRepository.kt
@@ -0,0 +1,25 @@
+package de.rki.coronawarnapp.vaccination.core.repository
+
+import de.rki.coronawarnapp.vaccination.core.VaccinatedPerson
+import de.rki.coronawarnapp.vaccination.core.VaccinationCertificate
+import de.rki.coronawarnapp.vaccination.core.qrcode.VaccinationCertificateQRCode
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.emptyFlow
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class VaccinationRepository @Inject constructor() {
+
+    val vaccinationInfos: Flow<Set<VaccinatedPerson>> = emptyFlow()
+
+    suspend fun registerVaccination(
+        qrCode: VaccinationCertificateQRCode
+    ): VaccinationCertificate {
+        throw NotImplementedError()
+    }
+
+    fun clear() {
+        throw NotImplementedError()
+    }
+}
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/server/ProofCertificateServerData.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/server/ProofCertificateServerData.kt
new file mode 100644
index 000000000..f298c3328
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/server/ProofCertificateServerData.kt
@@ -0,0 +1,3 @@
+package de.rki.coronawarnapp.vaccination.core.server
+
+interface ProofCertificateServerData
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/server/VaccinationProofServer.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/server/VaccinationProofServer.kt
new file mode 100644
index 000000000..8259e4855
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/server/VaccinationProofServer.kt
@@ -0,0 +1,15 @@
+package de.rki.coronawarnapp.vaccination.core.server
+
+import de.rki.coronawarnapp.vaccination.core.VaccinationCertificate
+
+/**
+ * Talks with IBM servers?
+ */
+class VaccinationProofServer {
+
+    suspend fun getProofCertificate(
+        vaccinationCertificate: Set<VaccinationCertificate>
+    ): ProofCertificateServerData {
+        throw NotImplementedError()
+    }
+}
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/server/VaccinationServer.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/server/VaccinationServer.kt
new file mode 100644
index 000000000..4f2c5e9fc
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/server/VaccinationServer.kt
@@ -0,0 +1,17 @@
+package de.rki.coronawarnapp.vaccination.core.server
+
+import java.util.Locale
+
+/**
+ * Talks with CWA servers
+ */
+class VaccinationServer {
+    suspend fun getVaccinationValueSets(languageCode: Locale): VaccinationValueSet {
+        throw NotImplementedError()
+    }
+
+    fun clear() {
+        // Clear cache
+        throw NotImplementedError()
+    }
+}
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/server/VaccinationValueSet.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/server/VaccinationValueSet.kt
new file mode 100644
index 000000000..f8c9d6d92
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/server/VaccinationValueSet.kt
@@ -0,0 +1,7 @@
+package de.rki.coronawarnapp.vaccination.core.server
+
+import java.util.Locale
+
+interface VaccinationValueSet {
+    val languageCode: Locale
+}
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/VaccinationUIModule.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/VaccinationUIModule.kt
new file mode 100644
index 000000000..e98e08156
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/VaccinationUIModule.kt
@@ -0,0 +1,6 @@
+package de.rki.coronawarnapp.vaccination.ui
+
+import dagger.Module
+
+@Module
+class VaccinationUIModule
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
new file mode 100644
index 000000000..516c9387c
--- /dev/null
+++ b/Corona-Warn-App/src/main/res/navigation/vaccination_nav_graph.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<navigation xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/vaccination_nav_graph">
+
+
+</navigation>
\ No newline at end of file
-- 
GitLab