From 36462b98d188abffd84097086f0076f1d8453fc5 Mon Sep 17 00:00:00 2001
From: Matthias Urhahn <matthias.urhahn@sap.com>
Date: Thu, 17 Jun 2021 11:50:37 +0200
Subject: [PATCH] Fix merge regression & conflicts (2.4.x -> 2.5.x)

---
 .../ui/overview/PersonOverviewFragment.kt     | 30 +++++++++++++++----
 .../ui/overview/PersonOverviewViewModel.kt    | 29 ++++++++++++++++--
 .../items/CovidTestCertificatePendingCard.kt  |  6 ++--
 .../test/core/TestCertificateRepository.kt    |  2 +-
 .../test/ui/CertificatesViewModel.kt          | 17 +----------
 .../CovidCertificateDetailsFragment.kt        |  3 --
 .../rki/coronawarnapp/ui/main/MainActivity.kt |  2 +-
 7 files changed, 56 insertions(+), 33 deletions(-)

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/person/ui/overview/PersonOverviewFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/person/ui/overview/PersonOverviewFragment.kt
index 3304e0ad3..e7a6f912a 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/person/ui/overview/PersonOverviewFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/person/ui/overview/PersonOverviewFragment.kt
@@ -8,8 +8,11 @@ import androidx.fragment.app.Fragment
 import androidx.recyclerview.widget.DefaultItemAnimator
 import com.google.android.material.dialog.MaterialAlertDialogBuilder
 import de.rki.coronawarnapp.R
+import de.rki.coronawarnapp.bugreporting.ui.toErrorDialogBuilder
+import de.rki.coronawarnapp.covidcertificate.common.exception.TestCertificateServerException
 import de.rki.coronawarnapp.covidcertificate.person.ui.overview.items.CertificatesItem
 import de.rki.coronawarnapp.databinding.PersonOverviewFragmentBinding
+import de.rki.coronawarnapp.util.ExternalActionHelper.openUrl
 import de.rki.coronawarnapp.util.di.AutoInject
 import de.rki.coronawarnapp.util.lists.decorations.TopBottomPaddingDecorator
 import de.rki.coronawarnapp.util.lists.diffutil.update
@@ -35,6 +38,13 @@ class PersonOverviewFragment : Fragment(R.layout.person_overview_fragment), Auto
         }
         viewModel.personCertificates.observe(viewLifecycleOwner) { binding.bindViews(it) }
         viewModel.events.observe(viewLifecycleOwner) { onNavEvent(it) }
+
+        viewModel.markNewCertsAsSeen.observe(viewLifecycleOwner) {
+            /**
+             * This just needs to stay subscribed while the UI is open.
+             * It causes new certificates to be marked seen automatically.
+             */
+        }
     }
 
     private fun onNavEvent(event: PersonOverviewFragmentEvents) {
@@ -54,12 +64,20 @@ class PersonOverviewFragment : Fragment(R.layout.person_overview_fragment), Auto
                 }
                 .show()
 
-            is ShowRefreshErrorDialog -> MaterialAlertDialogBuilder(requireContext())
-                .setTitle(R.string.test_certificate_refresh_dialog_title)
-                .setMessage(event.error.localizedMessage ?: getString(R.string.errors_generic_headline))
-                .setCancelable(false)
-                .setPositiveButton(R.string.test_certificate_refresh_dialog_confirm_button) { _, _ -> }
-                .show()
+            is ShowRefreshErrorDialog -> {
+                event.error.toErrorDialogBuilder(requireContext()).apply {
+                    setTitle(R.string.test_certificate_refresh_dialog_title)
+                    setCancelable(false)
+                    if (
+                        event.error is TestCertificateServerException &&
+                        event.error.errorCode == TestCertificateServerException.ErrorCode.DCC_NOT_SUPPORTED_BY_LAB
+                    ) {
+                        setNeutralButton(R.string.test_certificate_error_invalid_labid_faq) { _, _ ->
+                            openUrl(getString(R.string.test_certificate_error_invalid_labid_faq_link))
+                        }
+                    }
+                }.show()
+            }
 
             ScanQrCode -> Toast.makeText(
                 requireContext(),
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/person/ui/overview/PersonOverviewViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/person/ui/overview/PersonOverviewViewModel.kt
index de79765ae..320305628 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/person/ui/overview/PersonOverviewViewModel.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/person/ui/overview/PersonOverviewViewModel.kt
@@ -1,25 +1,32 @@
 package de.rki.coronawarnapp.covidcertificate.person.ui.overview
 
+import android.content.Context
 import android.graphics.Bitmap
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.asLiveData
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import de.rki.coronawarnapp.contactdiary.util.getLocale
 import de.rki.coronawarnapp.covidcertificate.common.qrcode.QrCodeString
 import de.rki.coronawarnapp.covidcertificate.person.core.PersonCertificates
 import de.rki.coronawarnapp.covidcertificate.person.core.PersonCertificatesProvider
+import de.rki.coronawarnapp.covidcertificate.person.ui.overview.items.CertificatesItem
+import de.rki.coronawarnapp.covidcertificate.person.ui.overview.items.CovidTestCertificatePendingCard
 import de.rki.coronawarnapp.covidcertificate.person.ui.overview.items.PersonCertificateCard
 import de.rki.coronawarnapp.covidcertificate.test.core.TestCertificate
 import de.rki.coronawarnapp.covidcertificate.test.core.TestCertificateRepository
 import de.rki.coronawarnapp.covidcertificate.test.core.storage.TestCertificateIdentifier
-import de.rki.coronawarnapp.covidcertificate.person.ui.overview.items.CovidTestCertificatePendingCard
-import de.rki.coronawarnapp.covidcertificate.person.ui.overview.items.CertificatesItem
+import de.rki.coronawarnapp.covidcertificate.valueset.ValueSetsRepository
 import de.rki.coronawarnapp.presencetracing.checkins.qrcode.QrCodeGenerator
 import de.rki.coronawarnapp.util.coroutine.DispatcherProvider
+import de.rki.coronawarnapp.util.di.AppContext
 import de.rki.coronawarnapp.util.ui.SingleLiveEvent
 import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
 import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory
+import kotlinx.coroutines.flow.catch
 import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.onEach
 import kotlinx.coroutines.flow.transform
 import timber.log.Timber
 
@@ -28,6 +35,8 @@ class PersonOverviewViewModel @AssistedInject constructor(
     certificatesProvider: PersonCertificatesProvider,
     private val testCertificateRepository: TestCertificateRepository,
     private val qrCodeGenerator: QrCodeGenerator,
+    valueSetsRepository: ValueSetsRepository,
+    @AppContext context: Context,
 ) : CWAViewModel(dispatcherProvider) {
 
     private val qrCodes = mutableMapOf<String, Bitmap?>()
@@ -39,6 +48,22 @@ class PersonOverviewViewModel @AssistedInject constructor(
         mapPersons(persons, qrCodesMap)
     }.asLiveData(dispatcherProvider.Default)
 
+    val markNewCertsAsSeen = testCertificateRepository.certificates
+        .onEach { wrappers ->
+            wrappers
+                .filter { !it.seenByUser && !it.isCertificateRetrievalPending }
+                .forEach {
+                    testCertificateRepository.markCertificateAsSeenByUser(it.identifier)
+                }
+        }
+        .map { }
+        .catch { Timber.w("Failed to mark certificates as seen.") }
+        .asLiveData2()
+
+    init {
+        valueSetsRepository.triggerUpdateValueSet(languageCode = context.getLocale())
+    }
+
     private fun mapPersons(persons: Set<PersonCertificates>, qrCodesMap: Map<String, Bitmap?>): List<CertificatesItem> =
         mutableListOf<CertificatesItem>().apply {
             addPendingCards(persons)
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/person/ui/overview/items/CovidTestCertificatePendingCard.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/person/ui/overview/items/CovidTestCertificatePendingCard.kt
index 0565eec8d..0ad83cc46 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/person/ui/overview/items/CovidTestCertificatePendingCard.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/person/ui/overview/items/CovidTestCertificatePendingCard.kt
@@ -10,7 +10,6 @@ import de.rki.coronawarnapp.databinding.CovidTestErrorCardBinding
 import de.rki.coronawarnapp.util.TimeAndDateExtensions.toDayFormat
 import de.rki.coronawarnapp.util.TimeAndDateExtensions.toShortTimeFormat
 import de.rki.coronawarnapp.util.lists.diffutil.HasPayloadDiffer
-import org.joda.time.DateTime
 
 class CovidTestCertificatePendingCard(parent: ViewGroup) :
     CertificatesAdapter.CertificatesItemVH<CovidTestCertificatePendingCard.Item, CovidTestErrorCardBinding>(
@@ -30,8 +29,8 @@ class CovidTestCertificatePendingCard(parent: ViewGroup) :
 
         testTime.text = context.getString(
             R.string.test_certificate_time,
-            curItem.testDate.toDayFormat(),
-            curItem.testDate.toShortTimeFormat()
+            curItem.certificate.registeredAt.toDayFormat(),
+            curItem.certificate.registeredAt.toShortTimeFormat()
         )
 
         retryButton.setOnClickListener {
@@ -55,7 +54,6 @@ class CovidTestCertificatePendingCard(parent: ViewGroup) :
     }
 
     data class Item(
-        override val testDate: DateTime,
         val certificate: TestCertificate,
         val onRetryAction: (Item) -> Unit,
         val onDeleteAction: (Item) -> Unit
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/core/TestCertificateRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/core/TestCertificateRepository.kt
index b632cea27..658d7b433 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/core/TestCertificateRepository.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/core/TestCertificateRepository.kt
@@ -2,7 +2,7 @@ package de.rki.coronawarnapp.covidcertificate.test.core
 
 import de.rki.coronawarnapp.bugreporting.reportProblem
 import de.rki.coronawarnapp.coronatest.type.CoronaTest
-import de.rki.coronawarnapp.covidcertificate.exception.TestCertificateServerException
+import de.rki.coronawarnapp.covidcertificate.common.exception.TestCertificateServerException
 import de.rki.coronawarnapp.covidcertificate.test.core.qrcode.TestCertificateQRCodeExtractor
 import de.rki.coronawarnapp.covidcertificate.test.core.storage.PCRCertificateData
 import de.rki.coronawarnapp.covidcertificate.test.core.storage.RACertificateData
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/CertificatesViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/CertificatesViewModel.kt
index d287cc625..9e1753a7f 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/CertificatesViewModel.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/CertificatesViewModel.kt
@@ -1,12 +1,10 @@
 package de.rki.coronawarnapp.covidcertificate.test.ui
 
-import android.content.Context
 import androidx.lifecycle.LiveData
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
-import de.rki.coronawarnapp.contactdiary.util.getLocale
-import de.rki.coronawarnapp.covidcertificate.test.core.TestCertificateRepository
 import de.rki.coronawarnapp.covidcertificate.person.ui.overview.items.CertificatesItem
+import de.rki.coronawarnapp.covidcertificate.test.core.TestCertificateRepository
 import de.rki.coronawarnapp.covidcertificate.vaccination.core.VaccinatedPerson
 import de.rki.coronawarnapp.covidcertificate.vaccination.core.VaccinationSettings
 import de.rki.coronawarnapp.covidcertificate.vaccination.core.repository.VaccinationRepository
@@ -15,30 +13,17 @@ import de.rki.coronawarnapp.covidcertificate.vaccination.ui.cards.HeaderInfoVacc
 import de.rki.coronawarnapp.covidcertificate.vaccination.ui.cards.ImmuneVaccinationCard
 import de.rki.coronawarnapp.covidcertificate.vaccination.ui.cards.NoCovidTestCertificatesCard
 import de.rki.coronawarnapp.covidcertificate.vaccination.ui.cards.VaccinationCard
-import de.rki.coronawarnapp.util.TimeAndDateExtensions.toUserTimeZone
-import de.rki.coronawarnapp.covidcertificate.valueset.ValueSetsRepository
-import de.rki.coronawarnapp.util.di.AppContext
 import de.rki.coronawarnapp.util.ui.SingleLiveEvent
 import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
 import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory
-import kotlinx.coroutines.flow.catch
 import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.flow.onEach
-import timber.log.Timber
 
 class CertificatesViewModel @AssistedInject constructor(
     vaccinationRepository: VaccinationRepository,
-    valueSetsRepository: ValueSetsRepository,
-    @AppContext context: Context,
     private val vaccinationSettings: VaccinationSettings,
     private val testCertificateRepository: TestCertificateRepository
 ) : CWAViewModel() {
 
-    init {
-        valueSetsRepository.triggerUpdateValueSet(languageCode = context.getLocale())
-    }
-
     val events = SingleLiveEvent<CertificatesFragmentEvents>()
 
     val screenItems: LiveData<List<CertificatesItem>> =
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/details/CovidCertificateDetailsFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/details/CovidCertificateDetailsFragment.kt
index 671bcc486..670da564f 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/details/CovidCertificateDetailsFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/details/CovidCertificateDetailsFragment.kt
@@ -5,7 +5,6 @@ import android.os.Bundle
 import android.view.View
 import android.widget.LinearLayout
 import androidx.coordinatorlayout.widget.CoordinatorLayout
-import androidx.core.view.isGone
 import androidx.fragment.app.Fragment
 import androidx.navigation.fragment.FragmentNavigatorExtras
 import androidx.navigation.fragment.findNavController
@@ -44,8 +43,6 @@ class CovidCertificateDetailsFragment : Fragment(R.layout.fragment_covid_certifi
     )
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) = with(binding) {
-        qrCodeCard.title.isGone = true
-        qrCodeCard.subtitle.isGone = true
         appBarLayout.onOffsetChange { titleAlpha, subtitleAlpha ->
             title.alpha = titleAlpha
             subtitle.alpha = subtitleAlpha
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivity.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivity.kt
index cf227d6ca..1b93880e5 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivity.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/MainActivity.kt
@@ -107,7 +107,7 @@ class MainActivity : AppCompatActivity(), HasAndroidInjector {
         }
 
         vm.newCertificates.observe(this) { count ->
-            binding.mainBottomNavigation.updateCountBadge(R.id.green_certificate_graph, count)
+            binding.mainBottomNavigation.updateCountBadge(R.id.certificate_graph, count)
         }
 
         if (savedInstanceState == null) {
-- 
GitLab