From 3a97d2aa8fee5a47121815f6f664f2a825af7a7a Mon Sep 17 00:00:00 2001
From: Mohamed Metwalli <mohamed.metwalli@sap.com>
Date: Wed, 23 Jun 2021 11:04:15 +0200
Subject: [PATCH] Fix Qr Code flickering (#3526)

Co-authored-by: I502720 <axel.herbstreith@sap.com>
Co-authored-by: BMItter <Berndus@gmx.de>
---
 .../person/core/PersonCertificatesProvider.kt          |  2 +-
 .../person/ui/details/PersonDetailsViewModel.kt        | 10 ++++++++--
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/person/core/PersonCertificatesProvider.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/person/core/PersonCertificatesProvider.kt
index 6487c5303..c07e9fc33 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/person/core/PersonCertificatesProvider.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/person/core/PersonCertificatesProvider.kt
@@ -56,7 +56,7 @@ class PersonCertificatesProvider @Inject constructor(
      * After calling this [personCertificates] will emit new values.
      * Setting it to null deletes it.
      */
-    suspend fun setCurrentCwaUser(personIdentifier: CertificatePersonIdentifier?) {
+    fun setCurrentCwaUser(personIdentifier: CertificatePersonIdentifier?) {
         Timber.d("setCurrentCwaUser(personIdentifier=%s)", personIdentifier)
         personCertificatesSettings.currentCwaUser.update { personIdentifier }
     }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/person/ui/details/PersonDetailsViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/person/ui/details/PersonDetailsViewModel.kt
index 26157fe83..484a22e52 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/person/ui/details/PersonDetailsViewModel.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/person/ui/details/PersonDetailsViewModel.kt
@@ -55,9 +55,15 @@ class PersonDetailsViewModel @AssistedInject constructor(
         events.postValue(Back)
     }
 
+    private val qrcodeCache = mutableMapOf<String, Bitmap?>()
+
     private val qrCodeFlow: Flow<Bitmap?> = personCertificatesFlow.transform {
-        emit(null)
-        emit(qrCodeGenerator.createQrCode(it.highestPriorityCertificate.qrCode, margin = 0))
+        val input = it.highestPriorityCertificate.qrCode
+        emit(qrcodeCache[input]) // Initial state
+
+        val qrcode = qrcodeCache[input] ?: qrCodeGenerator.createQrCode(input, margin = 0)
+        qrcodeCache[input] = qrcode
+        emit(qrcode)
     }
 
     val uiState: LiveData<List<CertificateItem>> = combine(
-- 
GitLab