From 11f0adbc386fabe06d04981569ac499275e26a76 Mon Sep 17 00:00:00 2001
From: Thomas Klingbeil <64434904+tklingbeil@users.noreply.github.com>
Date: Tue, 2 Jun 2020 13:12:30 +0200
Subject: [PATCH] Add persistance of timestamp and whether user is allowed to
 submit keys (#74)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* Store timestamp of receiving registration token

* also reset this timestamp when deleting the registration token

* use correct timestamp for display of test time

* replace tracing activation time by test result reception time

* rename TAN request to match context

* set isAllowedToSubmitDiagnosisKeys properly

Co-authored-by: Jakob Möller <jakob.moeller@sap.com>
---
 .../coronawarnapp/http/WebRequestBuilder.kt    |  4 ++--
 .../service/submission/SubmissionService.kt    |  2 ++
 .../de/rki/coronawarnapp/storage/LocalData.kt  | 18 ++++++++++++++++++
 .../storage/SubmissionRepository.kt            |  6 ++++--
 .../ui/viewmodel/SubmissionViewModel.kt        |  2 ++
 .../src/main/res/values/strings.xml            |  3 +++
 6 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/WebRequestBuilder.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/WebRequestBuilder.kt
index 7088a91ac..68167454a 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/WebRequestBuilder.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/WebRequestBuilder.kt
@@ -192,7 +192,7 @@ object WebRequestBuilder {
     ) =
         suspendCoroutine<String> { cont ->
             val requestID = UUID.randomUUID()
-            val getTestResultRequest =
+            val getTANRequest =
                 TanRequest(
                     url,
                     requestID,
@@ -209,7 +209,7 @@ object WebRequestBuilder {
                     },
                     RequestErrorListener(requestID, cont)
                 )
-            RequestQueueHolder.addToRequestQueue(getTestResultRequest)
+            RequestQueueHolder.addToRequestQueue(getTANRequest)
             Log.d(TAG, "$requestID: Added $url to queue.")
         }
 
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionService.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionService.kt
index b6751d06c..77f4d57c1 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionService.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionService.kt
@@ -22,6 +22,7 @@ object SubmissionService {
             testTAN != null -> asyncRegisterDeviceViaTAN(testTAN)
             else -> throw NoGUIDOrTANSetException()
         }
+        LocalData.devicePairingSuccessfulTimestamp(System.currentTimeMillis())
     }
 
     private suspend fun asyncRegisterDeviceViaGUID(guid: String) {
@@ -73,6 +74,7 @@ object SubmissionService {
 
     fun deleteRegistrationToken() {
         LocalData.registrationToken(null)
+        LocalData.devicePairingSuccessfulTimestamp(0L)
     }
 
     private fun deleteAuthCode() {
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/LocalData.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/LocalData.kt
index a469d22a3..7725698b6 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/LocalData.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/LocalData.kt
@@ -386,6 +386,24 @@ object LocalData {
         return timestamp
     }
 
+    fun devicePairingSuccessfulTimestamp(value: Long) =
+        with(getSharedPreferenceInstance().edit()) {
+            putLong(
+                CoronaWarnApplication.getAppContext()
+                    .getString(R.string.preference_device_pairing_successful_time),
+                value
+            )
+            commit()
+        }
+
+    fun devicePairingSuccessfulTimestamp(): Long? {
+        return getSharedPreferenceInstance().getLong(
+            CoronaWarnApplication.getAppContext()
+                .getString(R.string.preference_device_pairing_successful_time),
+            0L
+        )
+    }
+
     fun numberOfSuccessfulSubmissions(value: Int) =
         getSharedPreferenceInstance().edit(true) {
             putInt(
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/SubmissionRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/SubmissionRepository.kt
index 839ab0715..5d3546d60 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/SubmissionRepository.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/SubmissionRepository.kt
@@ -19,12 +19,14 @@ object SubmissionRepository {
         val testResultValue =
             WebRequestBuilder.asyncGetTestResult(TEST_RESULT_URL, registrationToken)
         testResult.value = TestResult.fromInt(testResultValue)
-
+        if (testResult == TestResult.POSITIVE) {
+            LocalData.isAllowedToSubmitDiagnosisKeys(true)
+        }
         val initialTestResultReceivedTimestamp = LocalData.inititalTestResultReceivedTimestamp()
 
         if (initialTestResultReceivedTimestamp == null) {
             val currentTime = System.currentTimeMillis()
-            LocalData.initialTracingActivationTimestamp(currentTime)
+            LocalData.inititalTestResultReceivedTimestamp(currentTime)
             testResultReceivedDate.value = Date(currentTime)
         } else {
             testResultReceivedDate.value = Date(initialTestResultReceivedTimestamp)
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModel.kt
index 1fec0e4e1..e1fda8bb4 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModel.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModel.kt
@@ -60,6 +60,8 @@ class SubmissionViewModel : ViewModel() {
     fun deregisterTestFromDevice() {
         deleteTestGUID()
         SubmissionService.deleteRegistrationToken()
+        LocalData.isAllowedToSubmitDiagnosisKeys(false)
+        LocalData.inititalTestResultReceivedTimestamp(0L)
     }
 
     private fun executeRequestWithState(apiRequest: suspend () -> Unit, state: MutableLiveData<ApiRequestState>) {
diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml
index 9075db9a4..2839a6bc0 100644
--- a/Corona-Warn-App/src/main/res/values/strings.xml
+++ b/Corona-Warn-App/src/main/res/values/strings.xml
@@ -47,6 +47,9 @@
     <string name="preference_m_registration_token">
         <xliff:g id="preference">preference_m_registration_token</xliff:g>
     </string>
+    <string name="preference_device_pairing_successful_time">
+        <xliff:g id="preference">preference_device_pairing_successful_time</xliff:g>
+    </string>
     <string name="preference_initial_tracing_activation_time">
         <xliff:g id="preference">preference_initial_tracing_activation_time</xliff:g>
     </string>
-- 
GitLab