Skip to content
This repository was archived by the owner on Jun 20, 2023. It is now read-only.

Commit 9d6525b

Browse files
committed
Merge tag 'v2.10.1'
2 parents 127889b + fc1d42d commit 9d6525b

File tree

292 files changed

+6869
-3586
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

292 files changed

+6869
-3586
lines changed

.reuse/dep5

+4
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ Files: Corona-Warn-App/src/main/res/font/roboto.ttf
5656
Copyright: 2011 Google Inc.
5757
License: Apache-2.0
5858

59+
Files: Corona-Warn-App/src/main/res/font/opensans.ttf
60+
Copyright: 2011 Google Inc.
61+
License: Apache-2.0
62+
5963
Files: Corona-Warn-App/src/test/java/testhelpers/extensions/LiveDataTestUtil.kt
6064
Copyright: 2019 The Android Open Source Project
6165
License: Apache-2.0

Corona-Warn-App/build.gradle

+6-8
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,13 @@ android {
167167
compileOptions {
168168
// Required for rdgca.verifier.app:dgc-certlogic-android-light API 26 Time API
169169
coreLibraryDesugaringEnabled true
170-
sourceCompatibility JavaVersion.VERSION_1_8
171-
targetCompatibility JavaVersion.VERSION_1_8
170+
sourceCompatibility JavaVersion.VERSION_11
171+
targetCompatibility JavaVersion.VERSION_11
172172
}
173173

174174
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
175175
kotlinOptions {
176-
jvmTarget = "1.8"
176+
jvmTarget = "11"
177177

178178
freeCompilerArgs += [
179179
"-Xno-kotlin-nothing-value-exception",
@@ -222,9 +222,7 @@ android {
222222
useBuildCache true
223223
includeCompileClasspath = false
224224
}
225-
dexOptions {
226-
preDexLibraries true
227-
}
225+
228226
packagingOptions {
229227
exclude "**/module-info.class"
230228
exclude 'NOTICE'
@@ -355,7 +353,7 @@ dependencies {
355353
implementation "androidx.recyclerview:recyclerview-selection:1.1.0"
356354

357355
// DAGGER
358-
def dagger_version = "2.35.1"
356+
def dagger_version = "2.38.1"
359357
implementation "com.google.dagger:dagger:$dagger_version"
360358
implementation "com.google.dagger:dagger-android:$dagger_version"
361359
implementation "com.google.dagger:dagger-android-support:$dagger_version"
@@ -459,7 +457,7 @@ dependencies {
459457
implementation 'org.conscrypt:conscrypt-android:2.5.1'
460458

461459
// LOGGING
462-
implementation 'com.jakewharton.timber:timber:4.7.1@aar'
460+
implementation 'com.jakewharton.timber:timber:5.0.1@aar'
463461

464462
// ANIMATIONS
465463
implementation "com.airbnb.android:lottie:3.5.0"

Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/covidcertificate/person/ui/details/PersonDetailsFragmentTest.kt

+53-8
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package de.rki.coronawarnapp.covidcertificate.person.ui.details
22

33
import androidx.lifecycle.LiveData
44
import androidx.lifecycle.MutableLiveData
5-
import androidx.lifecycle.SavedStateHandle
65
import androidx.test.espresso.Espresso.onView
76
import androidx.test.espresso.action.ViewActions.swipeUp
87
import androidx.test.espresso.matcher.ViewMatchers.withId
@@ -16,7 +15,6 @@ import de.rki.coronawarnapp.covidcertificate.common.certificate.CwaCovidCertific
1615
import de.rki.coronawarnapp.covidcertificate.common.certificate.DccV1
1716
import de.rki.coronawarnapp.covidcertificate.common.certificate.TestDccV1
1817
import de.rki.coronawarnapp.covidcertificate.common.certificate.VaccinationDccV1
19-
import de.rki.coronawarnapp.covidcertificate.common.repository.CertificateContainerId
2018
import de.rki.coronawarnapp.covidcertificate.common.repository.RecoveryCertificateContainerId
2119
import de.rki.coronawarnapp.covidcertificate.common.repository.TestCertificateContainerId
2220
import de.rki.coronawarnapp.covidcertificate.common.repository.VaccinationCertificateContainerId
@@ -27,11 +25,13 @@ import de.rki.coronawarnapp.covidcertificate.person.ui.details.items.PersonDetai
2725
import de.rki.coronawarnapp.covidcertificate.person.ui.details.items.RecoveryCertificateCard
2826
import de.rki.coronawarnapp.covidcertificate.person.ui.details.items.TestCertificateCard
2927
import de.rki.coronawarnapp.covidcertificate.person.ui.details.items.VaccinationCertificateCard
28+
import de.rki.coronawarnapp.covidcertificate.person.ui.details.items.VaccinationInfoCard
3029
import de.rki.coronawarnapp.covidcertificate.person.ui.overview.PersonColorShade
3130
import de.rki.coronawarnapp.covidcertificate.recovery.core.RecoveryCertificate
3231
import de.rki.coronawarnapp.covidcertificate.test.core.TestCertificate
3332
import de.rki.coronawarnapp.covidcertificate.vaccination.core.VaccinatedPerson
3433
import de.rki.coronawarnapp.covidcertificate.vaccination.core.VaccinationCertificate
34+
import de.rki.coronawarnapp.covidcertificate.validation.core.rule.DccValidationRule
3535
import de.rki.coronawarnapp.util.TimeAndDateExtensions.toLocalDateUserTz
3636
import de.rki.coronawarnapp.util.qrcode.coil.CoilQrCode
3737
import de.rki.coronawarnapp.util.ui.SingleLiveEvent
@@ -51,6 +51,7 @@ import testhelpers.launchFragment2
5151
import testhelpers.launchFragmentInContainer2
5252
import testhelpers.setupFakeImageLoader
5353
import testhelpers.takeScreenshot
54+
import java.util.Locale
5455

5556
@RunWith(AndroidJUnit4::class)
5657
class PersonDetailsFragmentTest : BaseUITest() {
@@ -74,9 +75,7 @@ class PersonDetailsFragmentTest : BaseUITest() {
7475
object : PersonDetailsViewModel.Factory {
7576
override fun create(
7677
personIdentifierCode: String,
77-
colorShade: PersonColorShade,
78-
containerId: CertificateContainerId?,
79-
savedInstance: SavedStateHandle
78+
colorShade: PersonColorShade
8079
): PersonDetailsViewModel = viewModel
8180
}
8281
)
@@ -131,6 +130,17 @@ class PersonDetailsFragmentTest : BaseUITest() {
131130
)
132131

133132
add(PersonDetailsQrCard.Item(testCertificate, false) {})
133+
134+
add(
135+
VaccinationInfoCard.Item(
136+
vaccinationStatus = VaccinatedPerson.Status.IMMUNITY,
137+
daysUntilImmunity = null,
138+
boosterRule = null,
139+
daysSinceLastVaccination = 86,
140+
hasBoosterNotification = false
141+
)
142+
)
143+
134144
add(CwaUserCard.Item(personCertificates) {})
135145
add(
136146
VaccinationCertificateCard.Item(
@@ -172,12 +182,43 @@ class PersonDetailsFragmentTest : BaseUITest() {
172182
private fun boosterCertificateData(isCwa: Boolean = false): LiveData<List<CertificateItem>> = MutableLiveData(
173183
mutableListOf<CertificateItem>().apply {
174184
val vaccinationCertificate1 = mockVaccinationCertificate(number = 3, final = false, booster = true)
185+
186+
every { vaccinationCertificate1.hasNotificationBadge } returns true
187+
175188
val personCertificates = PersonCertificates(
176189
listOf(vaccinationCertificate1),
177190
isCwaUser = isCwa
178191
)
179192

193+
val ruleDescriptionDE = mockk<DccValidationRule.Description> {
194+
Locale.GERMAN.also {
195+
every { description } returns "Sie könnten für eine Auffrischungsimpfung berechtigt sein, da sie for mehr als 4 Monaten von COVID-19 genesen sind trotz einer vorherigen Impfung."
196+
every { languageCode } returns it.language
197+
}
198+
}
199+
200+
val ruleDescriptionEN = mockk<DccValidationRule.Description> {
201+
Locale.ENGLISH.also {
202+
every { description } returns "You may be eligible for a booster because you recovered from COVID-19 more than 4 months ago despite a prior vaccination."
203+
every { languageCode } returns it.language
204+
}
205+
}
206+
180207
add(PersonDetailsQrCard.Item(vaccinationCertificate1, false) {})
208+
209+
add(
210+
VaccinationInfoCard.Item(
211+
vaccinationStatus = VaccinatedPerson.Status.BOOSTER_ELIGIBLE,
212+
daysUntilImmunity = null,
213+
boosterRule = mockk<DccValidationRule>().apply {
214+
every { identifier } returns "BNR-DE-4161"
215+
every { description } returns listOf(ruleDescriptionDE, ruleDescriptionEN)
216+
},
217+
daysSinceLastVaccination = 147,
218+
hasBoosterNotification = true
219+
)
220+
)
221+
181222
add(CwaUserCard.Item(personCertificates) {})
182223
add(
183224
VaccinationCertificateCard.Item(
@@ -215,6 +256,8 @@ class PersonDetailsFragmentTest : BaseUITest() {
215256
every { isValid } returns true
216257
every { sampleCollectedAt } returns Instant.parse("2021-05-21T11:35:00.000Z")
217258
every { getState() } returns CwaCovidCertificate.State.Valid(headerExpiresAt)
259+
every { isNewlyRetrieved } returns false
260+
every { hasNotificationBadge } returns false
218261
}
219262

220263
private fun mockVaccinationCertificate(
@@ -236,32 +279,34 @@ class PersonDetailsFragmentTest : BaseUITest() {
236279
every { containerId } returns vcContainerId
237280
every { vaccinatedOn } returns localDate
238281
every { personIdentifier } returns certificatePersonIdentifier
239-
every { vaccinatedOn } returns Instant.parse("2021-06-01T11:35:00.000Z").toLocalDateUserTz()
282+
every { vaccinatedOn } returns Instant.parse("2021-04-01T11:35:00.000Z").toLocalDateUserTz()
240283
every { personIdentifier } returns CertificatePersonIdentifier(
241284
firstNameStandardized = "firstNameStandardized",
242285
lastNameStandardized = "lastNameStandardized",
243286
dateOfBirthFormatted = "1943-04-18"
244287
)
245288
every { doseNumber } returns number
246-
every { totalSeriesOfDoses } returns 2
289+
every { totalSeriesOfDoses } returns if (booster) number else 2
247290
every { dateOfBirthFormatted } returns "1981-03-20"
248291
every { isFinalShot } returns final
249292
every { qrCodeToDisplay } returns CoilQrCode(ScreenshotCertificateTestData.vaccinationCertificate)
250293
every { isValid } returns true
251294
every { getState() } returns CwaCovidCertificate.State.Valid(Instant.now().plus(20))
295+
every { hasNotificationBadge } returns false
252296
}
253297

254298
private fun mockRecoveryCertificate(): RecoveryCertificate =
255299
mockk<RecoveryCertificate>().apply {
256300
every { fullName } returns "Andrea Schneider"
257301
every { certificateId } returns "recoveryCertificateId"
258302
every { dateOfBirthFormatted } returns "1981-03-20"
259-
every { validUntil } returns Instant.parse("2021-05-31T11:35:00.000Z").toLocalDateUserTz()
303+
every { validUntil } returns Instant.parse("2021-03-31T11:35:00.000Z").toLocalDateUserTz()
260304
every { personIdentifier } returns certificatePersonIdentifier
261305
every { qrCodeToDisplay } returns CoilQrCode(ScreenshotCertificateTestData.recoveryCertificate)
262306
every { containerId } returns rcContainerId
263307
every { isValid } returns true
264308
every { getState() } returns CwaCovidCertificate.State.Valid(Instant.now().plus(20))
309+
every { hasNotificationBadge } returns false
265310
}
266311

267312
private val certificatePersonIdentifier = CertificatePersonIdentifier(

Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/covidcertificate/person/ui/overview/PersonOverviewFragmentTest.kt

+7-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ class PersonOverviewFragmentTest : BaseUITest() {
4848
viewModel.apply {
4949
every { events } returns SingleLiveEvent()
5050
every { personCertificates } returns MutableLiveData()
51-
every { markNewCertsAsSeen } returns MutableLiveData()
5251
}
5352
setupFakeImageLoader(
5453
createFakeImageLoaderForQrCodes()
@@ -129,6 +128,7 @@ class PersonOverviewFragmentTest : BaseUITest() {
129128
certificate = mockTestCertificate("Andrea Schneider"),
130129
onClickAction = { _, _ -> },
131130
colorShade = PersonColorShade.COLOR_1,
131+
badgeCount = 0
132132
)
133133
)
134134
}
@@ -148,6 +148,7 @@ class PersonOverviewFragmentTest : BaseUITest() {
148148
certificate = mockTestCertificate("Andrea Schneider"),
149149
onClickAction = { _, _ -> },
150150
colorShade = PersonColorShade.COLOR_1,
151+
badgeCount = 0
151152
)
152153
)
153154
}
@@ -159,6 +160,7 @@ class PersonOverviewFragmentTest : BaseUITest() {
159160
certificate = mockTestCertificate("Andrea Schneider"),
160161
onClickAction = { _, _ -> },
161162
colorShade = PersonColorShade.COLOR_1,
163+
badgeCount = 5
162164
)
163165
)
164166

@@ -167,6 +169,7 @@ class PersonOverviewFragmentTest : BaseUITest() {
167169
certificate = mockTestCertificate("Mia Schneider"),
168170
onClickAction = { _, _ -> },
169171
colorShade = PersonColorShade.COLOR_2,
172+
badgeCount = 3
170173
)
171174
)
172175

@@ -175,6 +178,7 @@ class PersonOverviewFragmentTest : BaseUITest() {
175178
certificate = mockTestCertificate("Thomas Schneider"),
176179
onClickAction = { _, _ -> },
177180
colorShade = PersonColorShade.COLOR_3,
181+
badgeCount = 0
178182
)
179183
)
180184
}
@@ -186,6 +190,7 @@ class PersonOverviewFragmentTest : BaseUITest() {
186190
certificate = mockTestCertificate("Andrea Schneider"),
187191
onClickAction = { _, _ -> },
188192
colorShade = PersonColorShade.COLOR_1,
193+
badgeCount = 0
189194
)
190195
)
191196
}
@@ -209,6 +214,7 @@ class PersonOverviewFragmentTest : BaseUITest() {
209214
every { isValid } returns true
210215
every { sampleCollectedAt } returns Instant.parse("2021-05-21T11:35:00.000Z")
211216
every { getState() } returns CwaCovidCertificate.State.Valid(headerExpiresAt)
217+
every { isNewlyRetrieved } returns false
212218
}
213219

214220
fun mockTestCertificateWrapper(isUpdating: Boolean) = mockk<TestCertificateWrapper>().apply {

Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/covidcertificate/recovery/ui/RecoveryCertificateDetailFragmentTest.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,10 @@ class RecoveryCertificateDetailFragmentTest : BaseUITest() {
122122
every { targetDisease } returns "COVID-19"
123123
every { testedPositiveOnFormatted } returns "2021-05-24"
124124
every { certificateCountry } returns "Deutschland"
125-
every { certificateIssuer } returns "Robert-Koch-Institut"
125+
every { certificateIssuer } returns "Robert Koch-Institut"
126126
every { validFromFormatted } returns "2021-06-07"
127127
every { validUntilFormatted } returns "2021-11-10"
128+
every { hasNotificationBadge } returns false
128129
every { certificateId } returns "05930482748454836478695764787841"
129130
every { qrCodeToDisplay } returns CoilQrCode(ScreenshotCertificateTestData.recoveryCertificate)
130131
every { validUntil } returns

Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/covidcertificate/test/ui/TestCertificateDetailsFragmentTest.kt

+11
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,17 @@ class TestCertificateDetailsFragmentTest : BaseUITest() {
179179
get() = "05930482748454836478695764787840"
180180
override val dccData: DccData<*>
181181
get() = mockk()
182+
183+
override val hasNotificationBadge: Boolean
184+
get() = false
185+
186+
override val notifiedInvalidAt: Instant?
187+
get() = null
188+
189+
override val lastSeenStateChange: CwaCovidCertificate.State?
190+
get() = null
191+
override val lastSeenStateChangeAt: Instant?
192+
get() = null
182193
}
183194

184195
private fun getTestCertificateObject(state: CwaCovidCertificate.State): TestCertificate {

Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/covidcertificate/vaccination/ui/details/VaccinationDetailsFragmentTest.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,8 @@ class VaccinationDetailsFragmentTest : BaseUITest() {
134134
return mockk<VaccinationCertificate>().apply {
135135
every { fullName } returns "Max Mustermann"
136136
every { fullNameStandardizedFormatted } returns "MUSTERMANN, MAX"
137-
every { dateOfBirthFormatted } returns "01.02.1976"
138-
every { vaccinatedOnFormatted } returns "18.02.2021"
137+
every { dateOfBirthFormatted } returns "1976-02-01"
138+
every { vaccinatedOnFormatted } returns "2021-02-18"
139139
every { vaccinatedOn } returns LocalDate.parse("18.02.2021", formatter)
140140
every { targetDisease } returns "COVID-19"
141141
every { medicalProductName } returns "Comirnaty"
@@ -146,6 +146,7 @@ class VaccinationDetailsFragmentTest : BaseUITest() {
146146
every { certificateId } returns "05930482748454836478695764787841"
147147
every { headerExpiresAt } returns Instant.parse("2021-05-16T00:00:00.000Z")
148148
every { totalSeriesOfDoses } returns 2
149+
every { hasNotificationBadge } returns false
149150
every { qrCodeToDisplay } returns CoilQrCode(ScreenshotCertificateTestData.vaccinationCertificate)
150151
every { fullNameFormatted } returns "Mustermann, Max"
151152
}

Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/eventregistration/organizer/TraceLocationsFragmentTest.kt

+1-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
1010
import dagger.Module
1111
import dagger.android.ContributesAndroidInjector
1212
import de.rki.coronawarnapp.R
13-
import de.rki.coronawarnapp.covidcertificate.test.ui.details.TestCertificateDetailsFragment
1413
import de.rki.coronawarnapp.presencetracing.checkins.CheckInRepository
1514
import de.rki.coronawarnapp.presencetracing.storage.repo.TraceLocationRepository
1615
import de.rki.coronawarnapp.ui.presencetracing.organizer.list.TraceLocationsFragment
@@ -92,7 +91,7 @@ class TraceLocationsFragmentTest : BaseUITest() {
9291

9392
launchFragmentInContainer2<TraceLocationsFragment>()
9493
openActionBarOverflowOrOptionsMenu(getInstrumentation().targetContext)
95-
takeScreenshot<TestCertificateDetailsFragment>()
94+
takeScreenshot<TraceLocationsFragment>("_menu")
9695
}
9796

9897
private fun createViewModel() = TraceLocationsViewModel(

Corona-Warn-App/src/androidTest/java/testhelpers/TestExtensions.kt

+15
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package testhelpers
22

3+
import android.content.Context
34
import android.content.Intent
5+
import android.content.res.Configuration
46
import android.os.Bundle
7+
import androidx.annotation.StringRes
58
import androidx.annotation.StyleRes
69
import androidx.fragment.app.Fragment
710
import androidx.fragment.app.FragmentFactory
@@ -13,6 +16,7 @@ import de.rki.coronawarnapp.R
1316
import de.rki.coronawarnapp.ui.main.FakeEmptyActivity
1417
import de.rki.coronawarnapp.ui.main.FakeMainActivity
1518
import de.rki.coronawarnapp.ui.main.MainActivity
19+
import java.util.Locale
1620

1721
/** Delay time before taking screenshot
1822
*/
@@ -104,3 +108,14 @@ inline fun <reified F : Fragment> launchInEmptyActivity(
104108
}
105109
launchActivity<FakeEmptyActivity>(intent)
106110
}
111+
112+
/**
113+
* Helper to get a string for a specific locale
114+
*/
115+
fun stringForLocale(locale: Locale, @StringRes stringRes: Int): String {
116+
val ctx: Context = ApplicationProvider.getApplicationContext()
117+
val conf = ctx.resources.configuration
118+
.let { Configuration(it) }
119+
.apply { setLocale(locale) }
120+
return ctx.createConfigurationContext(conf).getString(stringRes)
121+
}

0 commit comments

Comments
 (0)