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

Commit

Permalink
Merge branch 'release/2.5.x' into dev/qr-code-not-nullable
Browse files Browse the repository at this point in the history
  • Loading branch information
chiljamgossow committed Jun 23, 2021
2 parents 37cf77e + fb84dd6 commit 6d89d8d
Show file tree
Hide file tree
Showing 35 changed files with 345 additions and 338 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,23 @@ import dagger.Module
import dagger.android.ContributesAndroidInjector
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.covidcertificate.common.certificate.CertificatePersonIdentifier
import de.rki.coronawarnapp.covidcertificate.common.certificate.DccV1
import de.rki.coronawarnapp.covidcertificate.common.certificate.TestDccV1
import de.rki.coronawarnapp.covidcertificate.common.certificate.VaccinationDccV1
import de.rki.coronawarnapp.covidcertificate.common.repository.RecoveryCertificateContainerId
import de.rki.coronawarnapp.covidcertificate.common.repository.TestCertificateContainerId
import de.rki.coronawarnapp.covidcertificate.common.repository.VaccinationCertificateContainerId
import de.rki.coronawarnapp.covidcertificate.person.core.PersonCertificates
import de.rki.coronawarnapp.covidcertificate.person.ui.details.items.CertificateItem
import de.rki.coronawarnapp.covidcertificate.person.ui.details.items.CwaUserCard
import de.rki.coronawarnapp.covidcertificate.person.ui.details.items.PersonDetailsQrCard
import de.rki.coronawarnapp.covidcertificate.person.ui.details.items.RecoveryCertificateCard
import de.rki.coronawarnapp.covidcertificate.person.ui.details.items.TestCertificateCard
import de.rki.coronawarnapp.covidcertificate.person.ui.details.items.VaccinationCertificateCard
import de.rki.coronawarnapp.covidcertificate.person.ui.overview.PersonColorShade
import de.rki.coronawarnapp.covidcertificate.recovery.core.RecoveryCertificate
import de.rki.coronawarnapp.covidcertificate.test.core.TestCertificate
import de.rki.coronawarnapp.covidcertificate.vaccination.core.VaccinatedPerson
import de.rki.coronawarnapp.covidcertificate.vaccination.core.VaccinationCertificate
import de.rki.coronawarnapp.util.TimeAndDateExtensions.toLocalDateUserTz
import de.rki.coronawarnapp.util.ui.SingleLiveEvent
Expand All @@ -48,6 +56,9 @@ class PersonDetailsFragmentTest : BaseUITest() {
@MockK lateinit var viewModel: PersonDetailsViewModel
private lateinit var bitmap: Bitmap
private val args = PersonDetailsFragmentArgs("code").toBundle()
private val vcContainerId = VaccinationCertificateContainerId("1")
private val tcsContainerId = TestCertificateContainerId("2")
private val rcContainerId = RecoveryCertificateContainerId("3")

@Before
fun setUp() {
Expand All @@ -63,7 +74,10 @@ class PersonDetailsFragmentTest : BaseUITest() {
)
setupMockViewModel(
object : PersonDetailsViewModel.Factory {
override fun create(personIdentifierCode: String): PersonDetailsViewModel = viewModel
override fun create(
personIdentifierCode: String,
colorShade: PersonColorShade
): PersonDetailsViewModel = viewModel
}
)
}
Expand Down Expand Up @@ -105,50 +119,90 @@ class PersonDetailsFragmentTest : BaseUITest() {

add(PersonDetailsQrCard.Item(testCertificate, bitmap))
add(CwaUserCard.Item(personCertificates) {})
add(VaccinationCertificateCard.Item(vaccinationCertificate1, isCurrentCertificate = false) {})
add(VaccinationCertificateCard.Item(vaccinationCertificate2, isCurrentCertificate = false) {})
add(TestCertificateCard.Item(testCertificate, isCurrentCertificate = true) {})
add(RecoveryCertificateCard.Item(recoveryCertificate, isCurrentCertificate = false) {})
add(
VaccinationCertificateCard.Item(
vaccinationCertificate1,
isCurrentCertificate = false,
VaccinatedPerson.Status.COMPLETE,
PersonColorShade.COLOR_1
) {}
)
add(
VaccinationCertificateCard.Item(
vaccinationCertificate2,
isCurrentCertificate = false,
VaccinatedPerson.Status.COMPLETE,
PersonColorShade.COLOR_1
) {}
)
add(TestCertificateCard.Item(testCertificate, isCurrentCertificate = true, PersonColorShade.COLOR_1) {})
add(
RecoveryCertificateCard.Item(
recoveryCertificate,
isCurrentCertificate = false,
PersonColorShade.COLOR_1
) {}
)
}
)

private fun mockTestCertificate(): TestCertificate = mockk<TestCertificate>().apply {
every { certificateId } returns "testCertificateId"
every { fullName } returns "Andrea Schneider"
every { rawCertificate } returns mockk<TestDccV1>().apply {
every { test } returns mockk<DccV1.TestCertificateData>().apply {
every { testType } returns "LP6464-4"
every { sampleCollectedAt } returns Instant.parse("2021-05-31T11:35:00.000Z")
}
}
every { containerId } returns tcsContainerId
every { testType } returns "PCR-Test"
every { dateOfBirth } returns LocalDate.parse("18.04.1943", DateTimeFormat.forPattern("dd.MM.yyyy"))
every { sampleCollectedAt } returns Instant.parse("2021-05-31T11:35:00.000Z")
every { registeredAt } returns Instant.parse("2021-05-21T11:35:00.000Z")
every { personIdentifier } returns CertificatePersonIdentifier(
firstNameStandardized = "firstNameStandardized",
lastNameStandardized = "lastNameStandardized",
dateOfBirth = LocalDate.now()
)
every { personIdentifier } returns certificatePersonIdentifier
every { qrCode } returns "qrCode"
}

private fun mockVaccinationCertificate(
number: Int = 1,
final: Boolean = false
): VaccinationCertificate =
private fun mockVaccinationCertificate(number: Int = 1, final: Boolean = false): VaccinationCertificate =
mockk<VaccinationCertificate>().apply {
val localDate = Instant.parse("2021-06-01T11:35:00.000Z").toLocalDateUserTz()
every { fullName } returns "Andrea Schneider"
every { certificateId } returns "vaccinationCertificateId$number"
every { vaccinatedAt } returns Instant.parse("2021-06-01T11:35:00.000Z").toLocalDateUserTz()
every { personIdentifier } returns CertificatePersonIdentifier(
firstNameStandardized = "firstNameStandardized",
lastNameStandardized = "lastNameStandardized",
dateOfBirth = LocalDate.now()
)
every { rawCertificate } returns mockk<VaccinationDccV1>().apply {
every { vaccination } returns mockk<DccV1.VaccinationData>().apply {
every { doseNumber } returns number
every { totalSeriesOfDoses } returns 2
every { vaccinatedAt } returns localDate
}
}
every { containerId } returns vcContainerId
every { vaccinatedAt } returns localDate
every { personIdentifier } returns certificatePersonIdentifier
every { doseNumber } returns number
every { totalSeriesOfDoses } returns 2
every { dateOfBirth } returns LocalDate.now()
every { isFinalShot } returns final
every { qrCode } returns "qrCode"
}

private fun mockRecoveryCertificate(): RecoveryCertificate =
mockk<RecoveryCertificate>().apply {
every { fullName } returns "Andrea Schneider"
every { certificateId } returns "recoveryCertificateId"
every { dateOfBirth } returns LocalDate.now()
every { validUntil } returns Instant.parse("2021-05-31T11:35:00.000Z").toLocalDateUserTz()
every { personIdentifier } returns certificatePersonIdentifier
every { qrCode } returns "qrCode"
every { containerId } returns rcContainerId
}

private val certificatePersonIdentifier = CertificatePersonIdentifier(
dateOfBirth = LocalDate.parse("01.01.2020", DateTimeFormat.forPattern("dd.MM.yyyy")),
firstNameStandardized = "firstNameStandardized",
lastNameStandardized = "lastNameStandardized",
)

@After
fun tearDown() {
clearAllViewModels()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ class PersonOverviewFragmentTest : BaseUITest() {
PersonCertificateCard.Item(
certificate = mockTestCertificate("Andrea Schneider"),
onClickAction = { _, _ -> },
color = PersonOverviewItemColor.COLOR_1,
colorShade = PersonColorShade.COLOR_1,
qrcodeBitmap = bitmap
)
)
Expand All @@ -137,7 +137,7 @@ class PersonOverviewFragmentTest : BaseUITest() {
PersonCertificateCard.Item(
certificate = mockTestCertificate("Andrea Schneider"),
onClickAction = { _, _ -> },
color = PersonOverviewItemColor.COLOR_1,
colorShade = PersonColorShade.COLOR_1,
qrcodeBitmap = bitmap
)
)
Expand All @@ -149,7 +149,7 @@ class PersonOverviewFragmentTest : BaseUITest() {
PersonCertificateCard.Item(
certificate = mockTestCertificate("Andrea Schneider"),
onClickAction = { _, _ -> },
color = PersonOverviewItemColor.COLOR_1,
colorShade = PersonColorShade.COLOR_1,
qrcodeBitmap = bitmap
)
)
Expand All @@ -158,7 +158,7 @@ class PersonOverviewFragmentTest : BaseUITest() {
PersonCertificateCard.Item(
certificate = mockTestCertificate("Mia Schneider"),
onClickAction = { _, _ -> },
color = PersonOverviewItemColor.COLOR_2,
colorShade = PersonColorShade.COLOR_2,
qrcodeBitmap = bitmap
)
)
Expand All @@ -167,7 +167,7 @@ class PersonOverviewFragmentTest : BaseUITest() {
PersonCertificateCard.Item(
certificate = mockTestCertificate("Thomas Schneider"),
onClickAction = { _, _ -> },
color = PersonOverviewItemColor.COLOR_3,
colorShade = PersonColorShade.COLOR_3,
qrcodeBitmap = bitmap
)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@ import android.os.Bundle
import android.view.View
import android.widget.LinearLayout
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.graphics.drawable.DrawableCompat
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.navArgs
import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.transition.MaterialContainerTransform
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.databinding.PersonDetailsFragmentBinding
import de.rki.coronawarnapp.ui.view.onOffsetChange
import de.rki.coronawarnapp.util.ContextExtensions.getColorCompat
import de.rki.coronawarnapp.util.ContextExtensions.getDrawableCompat
import de.rki.coronawarnapp.util.di.AutoInject
import de.rki.coronawarnapp.util.lists.decorations.TopBottomPaddingDecorator
import de.rki.coronawarnapp.util.lists.diffutil.update
Expand All @@ -33,7 +36,8 @@ class PersonDetailsFragment : Fragment(R.layout.person_details_fragment), AutoIn
constructorCall = { factory, _ ->
factory as PersonDetailsViewModel.Factory
factory.create(
personIdentifierCode = args.personIdentifierCode
personIdentifierCode = args.personIdentifierCode,
colorShade = args.colorShade
)
}
)
Expand Down Expand Up @@ -66,6 +70,17 @@ class PersonDetailsFragment : Fragment(R.layout.person_details_fragment), AutoIn
personDetailsAdapter.update(it)
}
viewModel.events.observe(viewLifecycleOwner) { onNavEvent(it) }

expandedImage.setImageResource(args.colorShade.background)
europaImage.setImageDrawable(
requireContext().getDrawableCompat(R.drawable.ic_eu_stars_blue)?.let {
DrawableCompat.wrap(it)
.mutate()
.apply {
setTint(requireContext().getColorCompat(args.colorShade.starsTint))
}
}
)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import de.rki.coronawarnapp.covidcertificate.person.ui.details.items.Certificate
import de.rki.coronawarnapp.covidcertificate.person.ui.details.items.TestCertificateCard
import de.rki.coronawarnapp.covidcertificate.person.ui.details.items.VaccinationCertificateCard
import de.rki.coronawarnapp.covidcertificate.person.ui.details.items.VaccinationInfoCard
import de.rki.coronawarnapp.covidcertificate.person.ui.overview.PersonColorShade
import de.rki.coronawarnapp.covidcertificate.recovery.core.RecoveryCertificate
import de.rki.coronawarnapp.covidcertificate.test.core.TestCertificate
import de.rki.coronawarnapp.covidcertificate.vaccination.core.VaccinatedPerson
Expand Down Expand Up @@ -42,6 +43,7 @@ class PersonDetailsViewModel @AssistedInject constructor(
private val vaccinationRepository: VaccinationRepository,
private val timeStamper: TimeStamper,
@Assisted private val personIdentifierCode: String,
@Assisted private val colorShade: PersonColorShade,
) : CWAViewModel(dispatcherProvider) {

val events = SingleLiveEvent<PersonDetailsEvents>()
Expand Down Expand Up @@ -100,28 +102,33 @@ class PersonDetailsViewModel @AssistedInject constructor(
}
}

private fun MutableList<CertificateItem>.addCardItem(
private suspend fun MutableList<CertificateItem>.addCardItem(
certificate: CwaCovidCertificate,
priorityCertificate: CwaCovidCertificate
) {
val isCurrentCertificate = certificate.certificateId == priorityCertificate.certificateId
when (certificate) {
is TestCertificate -> add(
TestCertificateCard.Item(certificate, isCurrentCertificate) {
TestCertificateCard.Item(certificate, isCurrentCertificate, colorShade) {
events.postValue(OpenTestCertificateDetails(certificate.containerId))
}
)
is VaccinationCertificate -> add(
VaccinationCertificateCard.Item(
certificate = certificate,
isCurrentCertificate = isCurrentCertificate
) {
events.postValue(OpenVaccinationCertificateDetails(certificate.containerId))
}
)
is VaccinationCertificate -> {
val status = vaccinatedPerson(certificate).getVaccinationStatus(timeStamper.nowUTC)
add(
VaccinationCertificateCard.Item(
certificate = certificate,
isCurrentCertificate = isCurrentCertificate,
colorShade = colorShade,
status = status
) {
events.postValue(OpenVaccinationCertificateDetails(certificate.containerId))
}
)
}

is RecoveryCertificate -> add(
RecoveryCertificateCard.Item(certificate, isCurrentCertificate) {
RecoveryCertificateCard.Item(certificate, isCurrentCertificate, colorShade) {
events.postValue(OpenRecoveryCertificateDetails(certificate.containerId))
}
)
Expand All @@ -136,7 +143,8 @@ class PersonDetailsViewModel @AssistedInject constructor(
@AssistedFactory
interface Factory : CWAViewModelFactory<PersonDetailsViewModel> {
fun create(
personIdentifierCode: String
personIdentifierCode: String,
colorShade: PersonColorShade,
): PersonDetailsViewModel
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.view.ViewGroup
import androidx.core.view.isVisible
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.covidcertificate.person.ui.details.PersonDetailsAdapter
import de.rki.coronawarnapp.covidcertificate.person.ui.overview.PersonColorShade
import de.rki.coronawarnapp.covidcertificate.recovery.core.RecoveryCertificate
import de.rki.coronawarnapp.databinding.RecoveryCertificateCardBinding
import de.rki.coronawarnapp.util.TimeAndDateExtensions.toShortDayFormat
Expand Down Expand Up @@ -34,16 +35,17 @@ class RecoveryCertificateCard(parent: ViewGroup) :

currentCertificate.isVisible = curItem.isCurrentCertificate

val iconRes = when {
curItem.isCurrentCertificate -> R.drawable.ic_recovery_certificate_valid
else -> R.drawable.ic_recovery_certificate_valid_secondary
val background = when {
curItem.isCurrentCertificate -> curItem.colorShade.currentCertificateBg
else -> curItem.colorShade.defaultCertificateBg
}
certificateIcon.setImageResource(iconRes)
certificateBg.setImageResource(background)
}

data class Item(
val certificate: RecoveryCertificate,
val isCurrentCertificate: Boolean,
val colorShade: PersonColorShade,
val onClick: () -> Unit
) : CertificateItem, HasPayloadDiffer {
override fun diffPayload(old: Any, new: Any): Any? = if (old::class == new::class) new else null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.view.ViewGroup
import androidx.core.view.isVisible
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.covidcertificate.person.ui.details.PersonDetailsAdapter
import de.rki.coronawarnapp.covidcertificate.person.ui.overview.PersonColorShade
import de.rki.coronawarnapp.covidcertificate.test.core.TestCertificate
import de.rki.coronawarnapp.databinding.TestCertificateCardBinding
import de.rki.coronawarnapp.util.TimeAndDateExtensions.toDayFormat
Expand Down Expand Up @@ -34,16 +35,17 @@ class TestCertificateCard(parent: ViewGroup) :
testCertificateType.text = certificate.testType
currentCertificate.isVisible = curItem.isCurrentCertificate

val iconRes = when {
curItem.isCurrentCertificate -> R.drawable.ic_test_certificate_valid
else -> R.drawable.ic_test_certificate_valid_secondary
val background = when {
curItem.isCurrentCertificate -> curItem.colorShade.currentCertificateBg
else -> curItem.colorShade.defaultCertificateBg
}
certificateIcon.setImageResource(iconRes)
certificateBg.setImageResource(background)
}

data class Item(
val certificate: TestCertificate,
val isCurrentCertificate: Boolean,
val colorShade: PersonColorShade,
val onClick: () -> Unit
) : CertificateItem, HasPayloadDiffer {
override fun diffPayload(old: Any, new: Any): Any? = if (old::class == new::class) new else null
Expand Down
Loading

0 comments on commit 6d89d8d

Please sign in to comment.