Skip to content
Snippets Groups Projects
Unverified Commit 58913fd8 authored by Matthias Urhahn's avatar Matthias Urhahn Committed by GitHub
Browse files

Merge pull request #3011 from corona-warn-app/feature/vaccination-main

Vaccination Certificate (feature main branch)
parents 287c128f 3ef91cdc
Branches
Tags
No related merge requests found
Showing
with 393 additions and 39 deletions
......@@ -59,3 +59,7 @@ License: Apache-2.0
Files: Corona-Warn-App/src/test/java/testhelpers/extensions/LiveDataTestUtil.kt
Copyright: 2019 The Android Open Source Project
License: Apache-2.0
Files: Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/encoding/Base45Decoder.kt
Copyright: Copyright 2021 A-SIT Plus GmbH
License: Apache-2.0
\ No newline at end of file
......@@ -436,4 +436,7 @@ dependencies {
// ANIMATIONS
implementation "com.airbnb.android:lottie:3.5.0"
// HCert
implementation("com.upokecenter:cbor:4.4.1")
}
......@@ -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,
)
)
......
package de.rki.coronawarnapp.vaccination.ui.details
import androidx.lifecycle.MutableLiveData
import androidx.test.ext.junit.runners.AndroidJUnit4
import dagger.Module
import dagger.android.ContributesAndroidInjector
import de.rki.coronawarnapp.ui.Country
import de.rki.coronawarnapp.vaccination.core.VaccinationCertificate
import io.mockk.MockKAnnotations
import io.mockk.every
import io.mockk.impl.annotations.MockK
import io.mockk.mockk
import org.joda.time.LocalDate
import org.joda.time.format.DateTimeFormat
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import testhelpers.BaseUITest
import testhelpers.Screenshot
import testhelpers.SystemUIDemoModeRule
import testhelpers.launchFragment2
import testhelpers.launchFragmentInContainer2
import testhelpers.takeScreenshot
import tools.fastlane.screengrab.locale.LocaleTestRule
@RunWith(AndroidJUnit4::class)
class VaccinationDetailsFragmentTest : BaseUITest() {
@MockK lateinit var vaccinationDetailsViewModel: VaccinationDetailsViewModel
@Rule
@JvmField
val localeTestRule = LocaleTestRule()
@get:Rule
val systemUIDemoModeRule = SystemUIDemoModeRule()
private val args = VaccinationDetailsFragmentArgs("vaccinationCertificateId").toBundle()
@Before
fun setUp() {
MockKAnnotations.init(this, relaxed = true)
setupMockViewModel(
object : VaccinationDetailsViewModel.Factory {
override fun create(certificateId: String): VaccinationDetailsViewModel = vaccinationDetailsViewModel
}
)
}
@Test
fun launch_fragment() {
launchFragment2<VaccinationDetailsFragment>(fragmentArgs = args)
}
@Screenshot
@Test
fun capture_screenshot_complete() {
every { vaccinationDetailsViewModel.vaccinationCertificate } returns vaccinationDetailsData(true)
launchFragmentInContainer2<VaccinationDetailsFragment>(fragmentArgs = args)
takeScreenshot<VaccinationDetailsFragment>("complete")
}
@Screenshot
@Test
fun capture_screenshot_incomplete() {
every { vaccinationDetailsViewModel.vaccinationCertificate } returns vaccinationDetailsData(false)
launchFragmentInContainer2<VaccinationDetailsFragment>(fragmentArgs = args)
takeScreenshot<VaccinationDetailsFragment>("incomplete")
}
private fun vaccinationDetailsData(complete: Boolean): MutableLiveData<VaccinationDetails> {
val formatter = DateTimeFormat.forPattern("dd.MM.yyyy")
val mockCertificate = mockk<VaccinationCertificate>().apply {
every { firstName } returns "Max"
every { lastName } returns "Mustermann"
every { dateOfBirth } returns LocalDate.parse("01.02.1976", formatter)
every { vaccinatedAt } returns LocalDate.parse("01.05.2021", formatter)
every { vaccineName } returns "Comirnaty (mRNA)"
every { vaccineManufacturer } returns "BioNTech"
every { certificateIssuer } returns "Landratsamt Musterstadt"
every { certificateCountry } returns Country.DE
every { certificateId } returns "05930482748454836478695764787841"
}
return MutableLiveData(
VaccinationDetails(mockCertificate, complete)
)
}
@After
fun tearDown() {
clearAllViewModels()
}
}
@Module
abstract class VaccinationDetailsFragmentTestModule {
@ContributesAndroidInjector
abstract fun vaccinationDetailsFragment(): VaccinationDetailsFragment
}
......@@ -36,6 +36,7 @@ import de.rki.coronawarnapp.ui.submission.SubmissionTestResultTestModule
import de.rki.coronawarnapp.ui.submission.SubmissionTestResultTestNegativeModule
import de.rki.coronawarnapp.ui.submission.SubmissionYourConsentFragmentTestModule
import de.rki.coronawarnapp.ui.tracing.TracingDetailsFragmentTestTestModule
import de.rki.coronawarnapp.vaccination.ui.details.VaccinationDetailsFragmentTestModule
@Module(
includes = [
......@@ -78,10 +79,12 @@ import de.rki.coronawarnapp.ui.tracing.TracingDetailsFragmentTestTestModule
// Bugreporting
DebugLogUploadTestModule::class,
DebugLogTestModule::class,
// Event Registration
// Presence tracing
CreateEventTestModule::class,
TraceLocationsFragmentTestModule::class,
QrCodeDetailFragmentTestModule::class
QrCodeDetailFragmentTestModule::class,
// Vaccination Passport
VaccinationDetailsFragmentTestModule::class,
]
)
class FragmentTestModuleRegistrar
......@@ -3,14 +3,11 @@ package testhelpers
import android.app.Activity
import android.graphics.Bitmap
import android.os.Bundle
import android.provider.Settings
import android.util.Log
import androidx.annotation.StyleRes
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentFactory
import androidx.test.espresso.ViewAction
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
import de.rki.coronawarnapp.R
import tools.fastlane.screengrab.Screengrab
import tools.fastlane.screengrab.ScreenshotCallback
......@@ -29,19 +26,11 @@ inline fun <reified T> takeScreenshot(suffix: String = "", delay: Long = SCREENS
Thread.sleep(delay)
val simpleName = T::class.simpleName
val name = if (suffix.isEmpty()) simpleName else simpleName.plus("_$suffix")
val contentResolver = getInstrumentation().targetContext.contentResolver
val testLabSetting = Settings.System.getString(contentResolver, "firebase.test.lab")
val androidStudioMode = InstrumentationRegistry.getArguments().getString("androidStudioMode")
if ("true" in listOf(testLabSetting, androidStudioMode)) {
Screengrab.screenshot(
name,
UiAutomatorScreenshotStrategy(),
SDCardCallback
)
} else {
Screengrab.screenshot(name)
}
}
/**
......
......@@ -71,6 +71,8 @@ class DebugOptionsFragment : Fragment(R.layout.fragment_test_debugoptions), Auto
environmentCdnurlVerification.text = "Verification CDN:\n${state.urlVerification}"
environmentUrlDatadonation.text = "DataDonation:\n${state.urlDataDonation}"
environmentUrlLogUpload.text = "LogUpload:\n${state.urlLogUpload}"
environmentUrlVaccinationProof.text = "Vaccination Proof: \n${state.urlVaccinationProof}"
environmentCdnUrlVaccination.text = "Vaccination CDN: \n${state.urlVaccination}"
environmentPubkeyCrowdnotifier.text = "CrowdNotifierPubKey:\n${state.pubKeyCrowdNotifier}"
environmentPubkeyAppconfig.text = "AppConfigPubKey:\n${state.pubKeyAppConfig}"
}
......
......@@ -10,6 +10,8 @@ data class EnvironmentState(
val urlVerification: String,
val urlDataDonation: String,
val urlLogUpload: String,
val urlVaccinationProof: String,
val urlVaccination: String,
val pubKeyCrowdNotifier: String,
val pubKeyAppConfig: String,
) {
......@@ -22,6 +24,8 @@ data class EnvironmentState(
urlVerification = verificationCdnUrl,
urlDataDonation = dataDonationCdnUrl,
urlLogUpload = logUploadServerUrl,
urlVaccinationProof = vaccinationProofServerUrl,
urlVaccination = vaccinationCdnUrl,
pubKeyCrowdNotifier = crowdNotifierPublicKey,
pubKeyAppConfig = appConfigPublicKey,
)
......
......@@ -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>()
......
......@@ -34,6 +34,8 @@ 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.VaccinationTestFragment
import de.rki.coronawarnapp.vaccination.ui.VaccinationTestFragmentModule
@Module
abstract class MainActivityTestModule {
......@@ -85,4 +87,7 @@ abstract class MainActivityTestModule {
@ContributesAndroidInjector(modules = [CoronaTestTestFragmentModule::class])
abstract fun coronaTest(): CoronaTestTestFragment
@ContributesAndroidInjector(modules = [VaccinationTestFragmentModule::class])
abstract fun vaccinationTest(): VaccinationTestFragment
}
package de.rki.coronawarnapp.vaccination.ui
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.View
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.doNavigate
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()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.openVaccinationList.setOnClickListener {
doNavigate(
VaccinationTestFragmentDirections.actionVaccinationTestFragmentToVaccinationListFragment(
"vaccinated-person-identifier"
)
)
}
binding.openVaccinationDetailsIncomplete.setOnClickListener {
doNavigate(
VaccinationTestFragmentDirections
.actionVaccinationTestFragmentToVaccinationDetailsFragment(
"05930482748454836478695764787840"
)
)
}
binding.openVaccinationDetailsComplete.setOnClickListener {
doNavigate(
VaccinationTestFragmentDirections
.actionVaccinationTestFragmentToVaccinationDetailsFragment(
"05930482748454836478695764787841"
)
)
}
}
companion object {
val MENU_ITEM = TestMenuItem(
title = "Vaccination",
description = "View & Control vaccination related features.",
targetId = R.id.vaccinationTestFragment
)
}
}
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>
}
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>
}
......@@ -109,6 +109,22 @@
android:layout_marginTop="4dp"
tools:text="LogUpload: ?" />
<TextView
android:id="@+id/environment_url_vaccination_proof"
style="@style/TextAppearance.MaterialComponents.Caption"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
tools:text="VaccinationProof: ?" />
<TextView
android:id="@+id/environment_cdn_url_vaccination"
style="@style/TextAppearance.MaterialComponents.Caption"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
tools:text="Vaccination: ?" />
<TextView
android:id="@+id/environment_pubkey_appconfig"
style="@style/TextAppearance.MaterialComponents.Caption"
......
<?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:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Vaccinations"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.button.MaterialButton
android:id="@+id/open_vaccination_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Vaccination List"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView2" />
<com.google.android.material.button.MaterialButton
android:id="@+id/open_vaccination_details_complete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Vaccination details - complete"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/open_vaccination_list" />
<com.google.android.material.button.MaterialButton
android:id="@+id/open_vaccination_details_incomplete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Vaccination details - incomplete"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/open_vaccination_details_complete" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
......@@ -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,42 @@
<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" >
<action
android:id="@+id/action_vaccinationTestFragment_to_vaccinationDetailsFragment"
app:destination="@id/vaccinationDetailsFragment" />
<action
android:id="@+id/action_vaccinationTestFragment_to_vaccinationListFragment"
app:destination="@id/vaccinationListFragment" />
</fragment>
<fragment
android:id="@+id/vaccinationListFragment"
android:name="de.rki.coronawarnapp.vaccination.ui.list.VaccinationListFragment"
android:label="fragment_vaccination_list"
tools:layout="@layout/fragment_vaccination_list">
<argument
android:name="vaccinatedPersonId"
app:argType="string" />
<action
android:id="@+id/action_vaccinationListFragment_to_vaccinationDetailsFragment"
app:destination="@id/vaccinationDetailsFragment" />
</fragment>
<fragment
android:id="@+id/vaccinationDetailsFragment"
android:name="de.rki.coronawarnapp.vaccination.ui.details.VaccinationDetailsFragment"
android:label="fragment_vaccination_details"
tools:layout="@layout/fragment_vaccination_details">
<argument
android:name="vaccinationCertificateId"
app:argType="string" />
</fragment>
</navigation>
......@@ -40,6 +40,7 @@ import de.rki.coronawarnapp.util.device.ForegroundState
import de.rki.coronawarnapp.util.di.AppInjector
import de.rki.coronawarnapp.util.di.ApplicationComponent
import de.rki.coronawarnapp.util.hasAPILevel
import de.rki.coronawarnapp.vaccination.core.execution.VaccinationUpdateScheduler
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
......@@ -78,6 +79,7 @@ class CoronaWarnApplication : Application(), HasAndroidInjector {
@Inject lateinit var raTestResultScheduler: RAResultScheduler
@Inject lateinit var pcrTestResultAvailableNotificationService: PCRTestResultAvailableNotificationService
@Inject lateinit var raTestResultAvailableNotificationService: RATTestResultAvailableNotificationService
@Inject lateinit var vaccinationUpdateScheduler: VaccinationUpdateScheduler
@LogHistoryTree @Inject lateinit var rollingLogHistory: Timber.Tree
......@@ -131,6 +133,9 @@ class CoronaWarnApplication : Application(), HasAndroidInjector {
pcrTestResultAvailableNotificationService.setup()
raTestResultAvailableNotificationService.setup()
Timber.v("Setting up vaccination data update scheduler.")
vaccinationUpdateScheduler.setup()
deviceTimeHandler.launch()
configChangeDetector.launch()
riskLevelChangeDetector.launch()
......
......@@ -41,7 +41,8 @@ private fun MaterialAlertDialogBuilder.setMessageView(
setView(textView)
}
fun Throwable.toErrorDialogBuilder(context: Context) = MaterialAlertDialogBuilder(context).apply {
fun Throwable.toErrorDialogBuilder(context: Context) =
MaterialAlertDialogBuilder(context).apply {
val error = this@toErrorDialogBuilder
val humanReadable = error.tryHumanReadableError(context)
......
......@@ -5,6 +5,7 @@ import de.rki.coronawarnapp.environment.bugreporting.BugReportingServerModule
import de.rki.coronawarnapp.environment.datadonation.DataDonationCDNModule
import de.rki.coronawarnapp.environment.download.DownloadCDNModule
import de.rki.coronawarnapp.environment.submission.SubmissionCDNModule
import de.rki.coronawarnapp.environment.vaccination.VaccinationCertificateUrlModule
import de.rki.coronawarnapp.environment.verification.VerificationCDNModule
@Module(
......@@ -13,7 +14,8 @@ import de.rki.coronawarnapp.environment.verification.VerificationCDNModule
SubmissionCDNModule::class,
VerificationCDNModule::class,
DataDonationCDNModule::class,
BugReportingServerModule::class
BugReportingServerModule::class,
VaccinationCertificateUrlModule::class
]
)
class EnvironmentModule
......@@ -12,6 +12,8 @@ import de.rki.coronawarnapp.environment.EnvironmentSetup.EnvKey.LOG_UPLOAD
import de.rki.coronawarnapp.environment.EnvironmentSetup.EnvKey.SAFETYNET_API_KEY
import de.rki.coronawarnapp.environment.EnvironmentSetup.EnvKey.SUBMISSION
import de.rki.coronawarnapp.environment.EnvironmentSetup.EnvKey.USE_EUR_KEY_PKGS
import de.rki.coronawarnapp.environment.EnvironmentSetup.EnvKey.VACCINATION_PROOF
import de.rki.coronawarnapp.environment.EnvironmentSetup.EnvKey.VACCINATION_VALUE
import de.rki.coronawarnapp.environment.EnvironmentSetup.EnvKey.VERIFICATION
import de.rki.coronawarnapp.environment.EnvironmentSetup.EnvKey.VERIFICATION_KEYS
import de.rki.coronawarnapp.environment.EnvironmentSetup.Type.Companion.toEnvironmentType
......@@ -36,6 +38,8 @@ class EnvironmentSetup @Inject constructor(
VERIFICATION_KEYS("PUB_KEYS_SIGNATURE_VERIFICATION"),
DATA_DONATION("DATA_DONATION_CDN_URL"),
LOG_UPLOAD("LOG_UPLOAD_SERVER_URL"),
VACCINATION_PROOF("VACCINATION_PROOF_SERVER_URL"),
VACCINATION_VALUE("VACCINATION_CDN_URL"),
SAFETYNET_API_KEY("SAFETYNET_API_KEY"),
CROWD_NOTIFIER_PUBLIC_KEY("CROWD_NOTIFIER_PUBLIC_KEY")
}
......@@ -135,6 +139,12 @@ class EnvironmentSetup @Inject constructor(
val logUploadServerUrl: String
get() = getEnvironmentValue(LOG_UPLOAD).asString
val vaccinationProofServerUrl: String
get() = getEnvironmentValue(VACCINATION_PROOF).asString
val vaccinationCdnUrl: String
get() = getEnvironmentValue(VACCINATION_VALUE).asString
companion object {
private const val PKEY_CURRENT_ENVINROMENT = "environment.current"
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment