From a96bb279b4eb4eb419dd87c3d0994e263b9acbc3 Mon Sep 17 00:00:00 2001 From: chris-cwa <69595386+chris-cwa@users.noreply.github.com> Date: Wed, 18 Nov 2020 17:05:04 +0100 Subject: [PATCH] Removed enf v1 exposure summary and tokens (EXPOSUREAPP-3538) (#1644) * activate WindowExposure mode * extirpated tokens! * detekt, ktlint * fixed tests * - v1 methods * - get v1 exposure summary * - fixme * updated exposure summary repo * Adding mock dependencies that are required to instantiate the worker factories in our binding test. * Added numberOfDaysWithHighRisk and numberOfDaysWithLowRisk according to new tech spec * Transformed minimumDistinctEncountersForRisk and mostRecentDateForRisk into extension fun * make sure list of windows and aggregated result belong together * sending values for current UI * fixed ktlint * renamed ExposureResultStore * fixed tests Co-authored-by: Matthias Urhahn <matthias.urhahn@sap.com> Co-authored-by: BMItter <berndus@gmx.de> --- .../storage/ExposureSummaryDaoTest.kt | 76 ------------ .../test/api/ui/TestForAPIFragment.kt | 87 +++++++------- .../ui/TestRiskLevelCalculationFragment.kt | 2 +- ...iskLevelCalculationFragmentCWAViewModel.kt | 18 +-- .../download/DownloadDiagnosisKeysTask.kt | 20 +--- .../nearby/ExposureStateUpdateWorker.kt | 15 +-- .../InternalExposureNotificationClient.kt | 19 --- .../coronawarnapp/risk/DefaultRiskLevels.kt | 25 +++- .../coronawarnapp/risk/ExposureResultStore.kt | 16 +++ .../rki/coronawarnapp/storage/AppDatabase.kt | 1 - .../storage/ExposureSummaryRepository.kt | 70 ----------- .../de/rki/coronawarnapp/storage/LocalData.kt | 28 ----- .../storage/TracingRepository.kt | 31 ----- .../rki/coronawarnapp/submission/Symptoms.kt | 5 +- .../ui/main/home/HomeFragmentViewModel.kt | 1 - .../tracing/card/TracingCardStateProvider.kt | 6 +- .../details/RiskDetailsFragmentViewModel.kt | 1 - .../details/TracingDetailsStateProvider.kt | 6 +- .../util/di/ApplicationComponent.kt | 3 + .../src/main/res/values-bg/strings.xml | 2 - .../src/main/res/values-de/strings.xml | 2 - .../src/main/res/values-en/strings.xml | 2 - .../src/main/res/values-pl/strings.xml | 2 - .../src/main/res/values-ro/strings.xml | 2 - .../src/main/res/values-tr/strings.xml | 2 - .../src/main/res/values/strings.xml | 2 - .../windows/ExposureWindowsCalculationTest.kt | 4 +- .../rki/coronawarnapp/risk/RiskLevelsTest.kt | 3 +- .../storage/ExposureSummaryRepositoryTest.kt | 112 ------------------ .../util/worker/WorkerBinderTest.kt | 9 ++ 30 files changed, 120 insertions(+), 452 deletions(-) delete mode 100644 Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/storage/ExposureSummaryDaoTest.kt create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/ExposureResultStore.kt delete mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/ExposureSummaryRepository.kt delete mode 100644 Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/ExposureSummaryRepositoryTest.kt diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/storage/ExposureSummaryDaoTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/storage/ExposureSummaryDaoTest.kt deleted file mode 100644 index 32df9c31b..000000000 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/storage/ExposureSummaryDaoTest.kt +++ /dev/null @@ -1,76 +0,0 @@ -package de.rki.coronawarnapp.storage - -import android.content.Context -import androidx.room.Room -import androidx.test.core.app.ApplicationProvider -import androidx.test.ext.junit.runners.AndroidJUnit4 -import com.google.common.truth.Truth.assertThat -import kotlinx.coroutines.runBlocking -import org.junit.After -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith - -/** - * ExposureSummaryDao test. - */ -@RunWith(AndroidJUnit4::class) -class ExposureSummaryDaoTest { - private lateinit var dao: ExposureSummaryDao - private lateinit var db: AppDatabase - - @Before - fun setUp() { - val context = ApplicationProvider.getApplicationContext<Context>() - db = Room.inMemoryDatabaseBuilder( - context, AppDatabase::class.java - ).build() - dao = db.exposureSummaryDao() - } - - /** - * Test Create / Read DB operations. - */ - @Test - fun testCROperations() { - runBlocking { - val testEntity1 = ExposureSummaryEntity().apply { - this.daysSinceLastExposure = 1 - this.matchedKeyCount = 1 - this.maximumRiskScore = 1 - this.summationRiskScore = 1 - } - - val testEntity2 = ExposureSummaryEntity().apply { - this.daysSinceLastExposure = 2 - this.matchedKeyCount = 2 - this.maximumRiskScore = 2 - this.summationRiskScore = 2 - } - - assertThat(dao.getExposureSummaryEntities().isEmpty()).isTrue() - - val id1 = dao.insertExposureSummaryEntity(testEntity1) - var selectAll = dao.getExposureSummaryEntities() - var selectLast = dao.getLatestExposureSummary() - assertThat(dao.getExposureSummaryEntities().isEmpty()).isFalse() - assertThat(selectAll.size).isEqualTo(1) - assertThat(selectAll[0].id).isEqualTo(id1) - assertThat(selectLast).isNotNull() - assertThat(selectLast?.id).isEqualTo(id1) - - val id2 = dao.insertExposureSummaryEntity(testEntity2) - selectAll = dao.getExposureSummaryEntities() - selectLast = dao.getLatestExposureSummary() - assertThat(selectAll.isEmpty()).isFalse() - assertThat(selectAll.size).isEqualTo(2) - assertThat(selectLast).isNotNull() - assertThat(selectLast?.id).isEqualTo(id2) - } - } - - @After - fun closeDb() { - db.close() - } -} diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/api/ui/TestForAPIFragment.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/api/ui/TestForAPIFragment.kt index 1f9d0818c..cd1af3acc 100644 --- a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/api/ui/TestForAPIFragment.kt +++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/api/ui/TestForAPIFragment.kt @@ -16,7 +16,7 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 import com.google.android.gms.nearby.exposurenotification.ExposureNotificationClient -import com.google.android.gms.nearby.exposurenotification.ExposureSummary +import com.google.android.gms.nearby.exposurenotification.ExposureWindow import com.google.android.gms.nearby.exposurenotification.TemporaryExposureKey import com.google.android.material.snackbar.Snackbar import com.google.gson.Gson @@ -32,15 +32,12 @@ import de.rki.coronawarnapp.exception.ExceptionCategory import de.rki.coronawarnapp.exception.ExceptionCategory.INTERNAL import de.rki.coronawarnapp.exception.TransactionException import de.rki.coronawarnapp.exception.reporting.report -import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient import de.rki.coronawarnapp.nearby.InternalExposureNotificationPermissionHelper import de.rki.coronawarnapp.receiver.ExposureStateUpdateReceiver import de.rki.coronawarnapp.risk.TimeVariables import de.rki.coronawarnapp.server.protocols.AppleLegacyKeyExchange import de.rki.coronawarnapp.sharing.ExposureSharingService import de.rki.coronawarnapp.storage.AppDatabase -import de.rki.coronawarnapp.storage.ExposureSummaryRepository -import de.rki.coronawarnapp.storage.LocalData import de.rki.coronawarnapp.storage.tracing.TracingIntervalRepository import de.rki.coronawarnapp.test.menu.ui.TestMenuItem import de.rki.coronawarnapp.util.KeyFileHelper @@ -89,6 +86,10 @@ class TestForAPIFragment : Fragment(R.layout.fragment_test_for_a_p_i), AppInjector.component.enfClient } + private val exposureSummaryRepository by lazy { + AppInjector.component.exposureResultStore + } + private var myExposureKeysJSON: String? = null private var myExposureKeys: List<TemporaryExposureKey>? = mutableListOf() private var otherExposureKey: AppleLegacyKeyExchange.Key? = null @@ -96,8 +97,6 @@ class TestForAPIFragment : Fragment(R.layout.fragment_test_for_a_p_i), private lateinit var internalExposureNotificationPermissionHelper: InternalExposureNotificationPermissionHelper - private var token: String? = null - private lateinit var qrPager: ViewPager2 private lateinit var qrPagerAdapter: RecyclerView.Adapter<QRPagerAdapter.QRViewHolder> @@ -108,8 +107,6 @@ class TestForAPIFragment : Fragment(R.layout.fragment_test_for_a_p_i), override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - token = UUID.randomUUID().toString() - internalExposureNotificationPermissionHelper = InternalExposureNotificationPermissionHelper(this, this) @@ -168,8 +165,7 @@ class TestForAPIFragment : Fragment(R.layout.fragment_test_for_a_p_i), buttonRetrieveExposureSummary.setOnClickListener { vm.launch { - val summary = ExposureSummaryRepository.getExposureSummaryRepository() - .getExposureSummaryEntities().toString() + val summary = exposureSummaryRepository.exposureWindowEntities.toString() withContext(Dispatchers.Main) { showToast(summary) @@ -274,9 +270,6 @@ class TestForAPIFragment : Fragment(R.layout.fragment_test_for_a_p_i), if (null == otherExposureKey) { showToast("No other keys provided. Please fill the EditText with the JSON containing keys") } else { - token = UUID.randomUUID().toString() - LocalData.googleApiToken(token) - val appleKeyList = mutableListOf<AppleLegacyKeyExchange.Key>() for (key in otherExposureKeyList) { @@ -298,7 +291,7 @@ class TestForAPIFragment : Fragment(R.layout.fragment_test_for_a_p_i), val dir = File( File(requireContext().getExternalFilesDir(null), "key-export"), - token ?: "" + UUID.randomUUID().toString() ) dir.mkdirs() @@ -306,13 +299,13 @@ class TestForAPIFragment : Fragment(R.layout.fragment_test_for_a_p_i), lifecycleScope.launch { googleFileList = KeyFileHelper.asyncCreateExportFiles(appleFiles, dir) - Timber.i("Provide ${googleFileList.count()} files with ${appleKeyList.size} keys with token $token") + Timber.i("Provide ${googleFileList.count()} files with ${appleKeyList.size} keys") try { // only testing implementation: this is used to wait for the broadcastreceiver of the OS / EN API enfClient.provideDiagnosisKeys( googleFileList ) - showToast("Provided ${appleKeyList.size} keys to Google API with token $token") + showToast("Provided ${appleKeyList.size} keys to Google API") } catch (e: Exception) { e.report(ExceptionCategory.EXPOSURENOTIFICATION) } @@ -321,15 +314,14 @@ class TestForAPIFragment : Fragment(R.layout.fragment_test_for_a_p_i), } private fun checkExposure() { - Timber.d("Check Exposure with token $token") + Timber.d("Check Exposure") lifecycleScope.launch { try { - val exposureSummary = - InternalExposureNotificationClient.asyncGetExposureSummary(token!!) + val exposureSummary = enfClient.exposureWindows() updateExposureSummaryDisplay(exposureSummary) - showToast("Updated Exposure Summary with token $token") - Timber.d("Received exposure with token $token from QR Code") + showToast("Updated Exposure Summary") + Timber.d("Received exposure from QR Code") Timber.i(exposureSummary.toString()) } catch (e: Exception) { e.report(ExceptionCategory.EXPOSURENOTIFICATION) @@ -337,32 +329,33 @@ class TestForAPIFragment : Fragment(R.layout.fragment_test_for_a_p_i), } } - private fun updateExposureSummaryDisplay(exposureSummary: ExposureSummary?) { - - binding.labelExposureSummaryMatchedKeyCount.text = getString( - R.string.test_api_body_matchedKeyCount, - (exposureSummary?.matchedKeyCount ?: "-").toString() - ) - - binding.labelExposureSummaryDaysSinceLastExposure.text = getString( - R.string.test_api_body_daysSinceLastExposure, - (exposureSummary?.daysSinceLastExposure ?: "-").toString() - ) - - binding.labelExposureSummaryMaximumRiskScore.text = getString( - R.string.test_api_body_maximumRiskScore, - (exposureSummary?.maximumRiskScore ?: "-").toString() - ) - - binding.labelExposureSummarySummationRiskScore.text = getString( - R.string.test_api_body_summation_risk, - (exposureSummary?.summationRiskScore ?: "-").toString() - ) - - binding.labelExposureSummaryAttenuation.text = getString( - R.string.test_api_body_attenuation, - (exposureSummary?.attenuationDurationsInMinutes?.joinToString() ?: "-").toString() - ) + private fun updateExposureSummaryDisplay(windows: List<ExposureWindow>?) { + + // FIXME +// binding.labelExposureSummaryMatchedKeyCount.text = getString( +// R.string.test_api_body_matchedKeyCount, +// (exposureSummary?.matchedKeyCount ?: "-").toString() +// ) +// +// binding.labelExposureSummaryDaysSinceLastExposure.text = getString( +// R.string.test_api_body_daysSinceLastExposure, +// (exposureSummary?.daysSinceLastExposure ?: "-").toString() +// ) +// +// binding.labelExposureSummaryMaximumRiskScore.text = getString( +// R.string.test_api_body_maximumRiskScore, +// (exposureSummary?.maximumRiskScore ?: "-").toString() +// ) +// +// binding.labelExposureSummarySummationRiskScore.text = getString( +// R.string.test_api_body_summation_risk, +// (exposureSummary?.summationRiskScore ?: "-").toString() +// ) +// +// binding.labelExposureSummaryAttenuation.text = getString( +// R.string.test_api_body_attenuation, +// (exposureSummary?.attenuationDurationsInMinutes?.joinToString() ?: "-").toString() +// ) } private fun updateKeysDisplay() { diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragment.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragment.kt index f9834cdc7..9c8a948bb 100644 --- a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragment.kt +++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragment.kt @@ -79,7 +79,7 @@ class TestRiskLevelCalculationFragment : Fragment(R.layout.fragment_test_risk_le vm.apiKeysProvidedEvent.observe2(this) { event -> Toast.makeText( requireContext(), - "Provided ${event.keyCount} keys to Google API with token ${event.token}", + "Provided ${event.keyCount} keys to Google API", Toast.LENGTH_SHORT ).show() } diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragmentCWAViewModel.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragmentCWAViewModel.kt index 3e0afe100..9f7b65e8d 100644 --- a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragmentCWAViewModel.kt +++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragmentCWAViewModel.kt @@ -102,7 +102,6 @@ class TestRiskLevelCalculationFragmentCWAViewModel @AssistedInject constructor( LocalData.lastCalculatedRiskLevel(RiskLevel.UNDETERMINED.raw) LocalData.lastSuccessfullyCalculatedRiskLevel(RiskLevel.UNDETERMINED.raw) LocalData.lastTimeDiagnosisKeysFromServerFetch(null) - LocalData.googleApiToken(null) } catch (e: Exception) { e.report(ExceptionCategory.INTERNAL) } @@ -176,14 +175,10 @@ class TestRiskLevelCalculationFragmentCWAViewModel @AssistedInject constructor( } data class DiagnosisKeyProvidedEvent( - val keyCount: Int, - val token: String + val keyCount: Int ) fun provideDiagnosisKey(transmissionNumber: Int, key: AppleLegacyKeyExchange.Key) { - val token = UUID.randomUUID().toString() - LocalData.googleApiToken(token) - val appleKeyList = mutableListOf<AppleLegacyKeyExchange.Key>() AppleLegacyKeyExchange.Key.newBuilder() @@ -200,23 +195,20 @@ class TestRiskLevelCalculationFragmentCWAViewModel @AssistedInject constructor( .build() ) - val dir = File(File(context.getExternalFilesDir(null), "key-export"), token) + val dir = File(File(context.getExternalFilesDir(null), "key-export"), UUID.randomUUID().toString()) dir.mkdirs() var googleFileList: List<File> launch { googleFileList = KeyFileHelper.asyncCreateExportFiles(appleFiles, dir) - Timber.i("Provide ${googleFileList.count()} files with ${appleKeyList.size} keys with token $token") + Timber.i("Provide ${googleFileList.count()} files with ${appleKeyList.size} keys") try { // only testing implementation: this is used to wait for the broadcastreceiver of the OS / EN API - enfClient.provideDiagnosisKeys( - googleFileList - ) + enfClient.provideDiagnosisKeys(googleFileList) apiKeysProvidedEvent.postValue( DiagnosisKeyProvidedEvent( - keyCount = appleFiles.size, - token = token + keyCount = appleFiles.size ) ) } catch (e: Exception) { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/download/DownloadDiagnosisKeysTask.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/download/DownloadDiagnosisKeysTask.kt index 42b2008d5..f5d5bef1d 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/download/DownloadDiagnosisKeysTask.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/download/DownloadDiagnosisKeysTask.kt @@ -26,7 +26,6 @@ import org.joda.time.Duration import org.joda.time.Instant import timber.log.Timber import java.util.Date -import java.util.UUID import javax.inject.Inject import javax.inject.Provider @@ -69,9 +68,8 @@ class DownloadDiagnosisKeysTask @Inject constructor( Timber.tag(TAG).d("Using $currentDate as current date in task.") /**************************************************** - * RETRIEVE TOKEN + * DOWNLOAD KEYS ****************************************************/ - val token = retrieveToken(rollbackItems) throwIfCancelled() // RETRIEVE RISK SCORE PARAMETERS @@ -113,10 +111,8 @@ class DownloadDiagnosisKeysTask @Inject constructor( ) Timber.tag(TAG).d("Attempting submission to ENF") - val isSubmissionSuccessful = enfClient.provideDiagnosisKeys( - keyFiles = availableKeyFiles - ) - Timber.tag(TAG).d("Diagnosis Keys provided (success=%s, token=%s)", isSubmissionSuccessful, token) + val isSubmissionSuccessful = enfClient.provideDiagnosisKeys(availableKeyFiles) + Timber.tag(TAG).d("Diagnosis Keys provided (success=%s)", isSubmissionSuccessful) internalProgress.send(Progress.ApiSubmissionFinished) throwIfCancelled() @@ -179,16 +175,6 @@ class DownloadDiagnosisKeysTask @Inject constructor( LocalData.lastTimeDiagnosisKeysFromServerFetch(currentDate) } - private fun retrieveToken(rollbackItems: MutableList<RollbackItem>): String { - val googleAPITokenForRollback = LocalData.googleApiToken() - rollbackItems.add { - LocalData.googleApiToken(googleAPITokenForRollback) - } - return UUID.randomUUID().toString().also { - LocalData.googleApiToken(it) - } - } - private fun noKeysFetchedToday(): Boolean { val currentDate = DateTime(timeStamper.nowUTC, DateTimeZone.UTC) val lastFetch = DateTime( diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/ExposureStateUpdateWorker.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/ExposureStateUpdateWorker.kt index b0c92e94c..f52f40756 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/ExposureStateUpdateWorker.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/ExposureStateUpdateWorker.kt @@ -4,14 +4,12 @@ import android.content.Context import androidx.work.CoroutineWorker import androidx.work.WorkerParameters import com.google.android.gms.common.api.ApiException -import com.google.android.gms.nearby.exposurenotification.ExposureNotificationClient import com.squareup.inject.assisted.Assisted import com.squareup.inject.assisted.AssistedInject import de.rki.coronawarnapp.exception.ExceptionCategory -import de.rki.coronawarnapp.exception.NoTokenException import de.rki.coronawarnapp.exception.reporting.report import de.rki.coronawarnapp.risk.RiskLevelTask -import de.rki.coronawarnapp.storage.ExposureSummaryRepository +import de.rki.coronawarnapp.risk.ExposureResultStore import de.rki.coronawarnapp.task.TaskController import de.rki.coronawarnapp.task.common.DefaultTaskRequest import de.rki.coronawarnapp.util.worker.InjectedWorkerFactory @@ -20,19 +18,16 @@ import timber.log.Timber class ExposureStateUpdateWorker @AssistedInject constructor( @Assisted val context: Context, @Assisted workerParams: WorkerParameters, + private val exposureResultStore: ExposureResultStore, + private val enfClient: ENFClient, private val taskController: TaskController ) : CoroutineWorker(context, workerParams) { override suspend fun doWork(): Result { try { Timber.v("worker to persist exposure summary started") - val token = inputData.getString(ExposureNotificationClient.EXTRA_TOKEN) - ?: throw NoTokenException(IllegalArgumentException("no token was found in the intent")) - Timber.v("valid token $token retrieved") - InternalExposureNotificationClient - .asyncGetExposureSummary(token).also { - ExposureSummaryRepository.getExposureSummaryRepository() - .insertExposureSummaryEntity(it) + enfClient.exposureWindows().also { + exposureResultStore.exposureWindowEntities = Pair(it, null) Timber.v("exposure summary state updated: $it") } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/InternalExposureNotificationClient.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/InternalExposureNotificationClient.kt index 53c0aa600..2284f36d6 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/InternalExposureNotificationClient.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/InternalExposureNotificationClient.kt @@ -1,6 +1,5 @@ package de.rki.coronawarnapp.nearby -import com.google.android.gms.nearby.exposurenotification.ExposureSummary import com.google.android.gms.nearby.exposurenotification.TemporaryExposureKey import de.rki.coronawarnapp.CoronaWarnApplication import de.rki.coronawarnapp.risk.TimeVariables @@ -118,22 +117,4 @@ object InternalExposureNotificationClient { cont.resumeWithException(it) } } - - /** - * Retrieves the ExposureSummary object that matches the token from - * provideDiagnosisKeys() that you provide to the method. The ExposureSummary - * object provides a high-level overview of the exposure that a user has experienced. - * - * @param token - * @return - */ - suspend fun asyncGetExposureSummary(token: String): ExposureSummary = - suspendCoroutine { cont -> - exposureNotificationClient.getExposureSummary(token) - .addOnSuccessListener { - cont.resume(it) - }.addOnFailureListener { - cont.resumeWithException(it) - } - } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/DefaultRiskLevels.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/DefaultRiskLevels.kt index 07481acc9..5104df0c8 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/DefaultRiskLevels.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/DefaultRiskLevels.kt @@ -22,6 +22,8 @@ import de.rki.coronawarnapp.server.protocols.internal.v2.RiskCalculationParamete import de.rki.coronawarnapp.storage.LocalData import de.rki.coronawarnapp.storage.RiskLevelRepository import de.rki.coronawarnapp.util.TimeAndDateExtensions.millisecondsToHours +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.runBlocking import org.joda.time.Instant @@ -32,7 +34,8 @@ typealias ProtoRiskLevel = RiskCalculationParametersOuterClass.NormalizedTimeToR @Singleton class DefaultRiskLevels @Inject constructor( - private val appConfigProvider: AppConfigProvider + private val appConfigProvider: AppConfigProvider, + private val exposureResultStore: ExposureResultStore ) : RiskLevels { private var appConfig: ConfigData @@ -107,7 +110,19 @@ class DefaultRiskLevels @Inject constructor( val aggregatedResult = aggregateResults(riskResultsPerWindow) - return aggregatedResult.totalRiskLevel == ProtoRiskLevel.HIGH + exposureResultStore.exposureWindowEntities = Pair(exposureWindows, aggregatedResult) + + val highRisk = aggregatedResult.totalRiskLevel == ProtoRiskLevel.HIGH + + if (highRisk) { + internalMatchedKeyCount.value = aggregatedResult.totalMinimumDistinctEncountersWithHighRisk + internalDaysSinceLastExposure.value = aggregatedResult.numberOfDaysWithHighRisk + } else { + internalMatchedKeyCount.value = aggregatedResult.totalMinimumDistinctEncountersWithLowRisk + internalDaysSinceLastExposure.value = aggregatedResult.numberOfDaysWithLowRisk + } + + return highRisk } override fun isActiveTracingTimeAboveThreshold(): Boolean { @@ -470,5 +485,11 @@ class DefaultRiskLevels @Inject constructor( !maxExclusive && value.toDouble() > max -> false else -> true } + + private val internalMatchedKeyCount = MutableStateFlow(0) + val matchedKeyCount: Flow<Int> = internalMatchedKeyCount + + private val internalDaysSinceLastExposure = MutableStateFlow(0) + val daysSinceLastExposure: Flow<Int> = internalDaysSinceLastExposure } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/ExposureResultStore.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/ExposureResultStore.kt new file mode 100644 index 000000000..d58a2848b --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/risk/ExposureResultStore.kt @@ -0,0 +1,16 @@ +package de.rki.coronawarnapp.risk + +import com.google.android.gms.nearby.exposurenotification.ExposureWindow +import de.rki.coronawarnapp.risk.result.AggregatedRiskResult +import javax.inject.Inject + +class ExposureResultStore @Inject constructor() { + + private var entities: Pair<List<ExposureWindow>, AggregatedRiskResult?> = Pair(emptyList(), null) + + var exposureWindowEntities: Pair<List<ExposureWindow>, AggregatedRiskResult?> + get() = entities + set(value) { + entities = value + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/AppDatabase.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/AppDatabase.kt index 66fc87e9d..1f37983a9 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/AppDatabase.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/AppDatabase.kt @@ -62,7 +62,6 @@ abstract class AppDatabase : RoomDatabase() { val keyRepository = AppInjector.component.keyCacheRepository runBlocking { keyRepository.clear() } // TODO this is not nice TracingIntervalRepository.resetInstance() - ExposureSummaryRepository.resetInstance() } private fun buildDatabase(context: Context): AppDatabase { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/ExposureSummaryRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/ExposureSummaryRepository.kt deleted file mode 100644 index bd0202944..000000000 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/ExposureSummaryRepository.kt +++ /dev/null @@ -1,70 +0,0 @@ -package de.rki.coronawarnapp.storage - -import com.google.android.gms.nearby.exposurenotification.ExposureSummary -import de.rki.coronawarnapp.CoronaWarnApplication -import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow - -class ExposureSummaryRepository(private val exposureSummaryDao: ExposureSummaryDao) { - companion object { - @Volatile - private var instance: ExposureSummaryRepository? = null - - private fun getInstance(exposureSummaryDao: ExposureSummaryDao) = - instance ?: synchronized(this) { - instance ?: ExposureSummaryRepository(exposureSummaryDao).also { instance = it } - } - - fun resetInstance() = synchronized(this) { - instance = null - } - - fun getExposureSummaryRepository(): ExposureSummaryRepository { - return getInstance( - AppDatabase.getInstance(CoronaWarnApplication.getAppContext()) - .exposureSummaryDao() - ) - } - - private val internalMatchedKeyCount = MutableStateFlow(0) - val matchedKeyCount: Flow<Int> = internalMatchedKeyCount - - private val internalDaysSinceLastExposure = MutableStateFlow(0) - val daysSinceLastExposure: Flow<Int> = internalDaysSinceLastExposure - } - - suspend fun getExposureSummaryEntities() = exposureSummaryDao.getExposureSummaryEntities() - .map { it.convertToExposureSummary() } - - suspend fun insertExposureSummaryEntity(exposureSummary: ExposureSummary) = - ExposureSummaryEntity().apply { - this.daysSinceLastExposure = exposureSummary.daysSinceLastExposure - this.matchedKeyCount = exposureSummary.matchedKeyCount - this.maximumRiskScore = exposureSummary.maximumRiskScore - this.summationRiskScore = exposureSummary.summationRiskScore - this.attenuationDurationsInMinutes = - exposureSummary.attenuationDurationsInMinutes.toTypedArray().toList() - }.run { - exposureSummaryDao.insertExposureSummaryEntity(this) - internalMatchedKeyCount.value = matchedKeyCount - internalDaysSinceLastExposure.value = daysSinceLastExposure - } - - suspend fun getLatestExposureSummary(token: String) { - if (InternalExposureNotificationClient.asyncIsEnabled()) - InternalExposureNotificationClient.asyncGetExposureSummary(token).also { - internalMatchedKeyCount.value = it.matchedKeyCount - internalDaysSinceLastExposure.value = it.daysSinceLastExposure - } - } - - private fun ExposureSummaryEntity.convertToExposureSummary() = - ExposureSummary.ExposureSummaryBuilder() - .setAttenuationDurations(this.attenuationDurationsInMinutes.toIntArray()) - .setDaysSinceLastExposure(this.daysSinceLastExposure) - .setMatchedKeyCount(this.matchedKeyCount) - .setMaximumRiskScore(this.maximumRiskScore) - .setSummationRiskScore(this.summationRiskScore) - .build() -} 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 04b08cdd1..a0bac95d6 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 @@ -446,34 +446,6 @@ object LocalData { } } - /**************************************************** - * EXPOSURE NOTIFICATION DATA - ****************************************************/ - - /** - * Gets the last token that was used to provide the diagnosis keys to the Exposure Notification API - * - * @return UUID as string - */ - fun googleApiToken(): String? = getSharedPreferenceInstance().getString( - CoronaWarnApplication.getAppContext() - .getString(R.string.preference_string_google_api_token), - null - ) - - /** - * Sets the last token that was used to provide the diagnosis keys to the Exposure Notification API - * - * @param value UUID as string - */ - fun googleApiToken(value: String?) = getSharedPreferenceInstance().edit(true) { - putString( - CoronaWarnApplication.getAppContext() - .getString(R.string.preference_string_google_api_token), - value - ) - } - /**************************************************** * SETTINGS DATA ****************************************************/ diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/TracingRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/TracingRepository.kt index 0658b1060..ada8c8b9b 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/TracingRepository.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/TracingRepository.kt @@ -2,8 +2,6 @@ package de.rki.coronawarnapp.storage import android.content.Context import de.rki.coronawarnapp.diagnosiskeys.download.DownloadDiagnosisKeysTask -import de.rki.coronawarnapp.exception.ExceptionCategory -import de.rki.coronawarnapp.exception.reporting.report import de.rki.coronawarnapp.nearby.ENFClient import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient import de.rki.coronawarnapp.risk.RiskLevelTask @@ -88,8 +86,6 @@ class TracingRepository @Inject constructor( * Regardless of whether the transactions where successful or not the * lastTimeDiagnosisKeysFetchedDate is updated. But the the value will only be updated after a * successful go through from the RetrievelDiagnosisKeysTransaction. - * - * @see RiskLevelRepository */ fun refreshDiagnosisKeys() { scope.launch { @@ -172,33 +168,6 @@ class TracingRepository @Inject constructor( } } - /** - * Exposure summary - * Refresh the following variables in TracingRepository - * - daysSinceLastExposure - * - matchedKeysCount - * - * @see TracingRepository - */ - fun refreshExposureSummary() { - scope.launch { - try { - val token = LocalData.googleApiToken() - if (token != null) { - ExposureSummaryRepository.getExposureSummaryRepository() - .getLatestExposureSummary(token) - } - Timber.tag(TAG).v("retrieved latest exposure summary from db") - } catch (e: Exception) { - e.report( - ExceptionCategory.EXPOSURENOTIFICATION, - TAG, - null - ) - } - } - } - fun refreshLastSuccessfullyCalculatedScore() { RiskLevelRepository.refreshLastSuccessfullyCalculatedScore() } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/submission/Symptoms.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/submission/Symptoms.kt index 769df6264..0743eb1aa 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/submission/Symptoms.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/submission/Symptoms.kt @@ -6,6 +6,9 @@ import org.joda.time.LocalDate @Parcelize data class Symptoms( + /** + * this is null if there are no symptoms or there is no information + */ val startOfSymptoms: StartOf?, val symptomIndication: Indication ) : Parcelable { @@ -36,7 +39,7 @@ data class Symptoms( companion object { val NO_INFO_GIVEN = Symptoms( - startOfSymptoms = null, // FIXME should this be null? + startOfSymptoms = null, symptomIndication = Indication.NO_INFORMATION ) } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentViewModel.kt index ea111127b..86c98ead5 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentViewModel.kt @@ -103,7 +103,6 @@ class HomeFragmentViewModel @AssistedInject constructor( SubmissionRepository.refreshDeviceUIState() // TODO the ordering here is weird, do we expect these to run in sequence? tracingRepository.refreshRiskLevel() - tracingRepository.refreshExposureSummary() tracingRepository.refreshLastTimeDiagnosisKeysFetchedDate() tracingRepository.refreshActiveTracingDaysInRetentionPeriod() TimerHelper.checkManualKeyRetrievalTimer() diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardStateProvider.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardStateProvider.kt index 7e2f05d5b..0997dc50f 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardStateProvider.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardStateProvider.kt @@ -1,7 +1,7 @@ package de.rki.coronawarnapp.ui.tracing.card import dagger.Reusable -import de.rki.coronawarnapp.storage.ExposureSummaryRepository +import de.rki.coronawarnapp.risk.DefaultRiskLevels import de.rki.coronawarnapp.storage.RiskLevelRepository import de.rki.coronawarnapp.storage.SettingsRepository import de.rki.coronawarnapp.storage.TracingRepository @@ -37,10 +37,10 @@ class TracingCardStateProvider @Inject constructor( tracingRepository.tracingProgress.onEach { Timber.v("tracingProgress: $it") }, - ExposureSummaryRepository.matchedKeyCount.onEach { + DefaultRiskLevels.matchedKeyCount.onEach { Timber.v("matchedKeyCount: $it") }, - ExposureSummaryRepository.daysSinceLastExposure.onEach { + DefaultRiskLevels.daysSinceLastExposure.onEach { Timber.v("daysSinceLastExposure: $it") }, tracingRepository.activeTracingDaysInRetentionPeriod.onEach { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/details/RiskDetailsFragmentViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/details/RiskDetailsFragmentViewModel.kt index 2075f82ed..8ca9c951c 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/details/RiskDetailsFragmentViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/details/RiskDetailsFragmentViewModel.kt @@ -36,7 +36,6 @@ class RiskDetailsFragmentViewModel @AssistedInject constructor( fun refreshData() { tracingRepository.refreshRiskLevel() - tracingRepository.refreshExposureSummary() tracingRepository.refreshLastTimeDiagnosisKeysFetchedDate() TimerHelper.checkManualKeyRetrievalTimer() tracingRepository.refreshActiveTracingDaysInRetentionPeriod() diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/details/TracingDetailsStateProvider.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/details/TracingDetailsStateProvider.kt index f07401a32..f7265e75c 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/details/TracingDetailsStateProvider.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/details/TracingDetailsStateProvider.kt @@ -1,7 +1,7 @@ package de.rki.coronawarnapp.ui.tracing.details import dagger.Reusable -import de.rki.coronawarnapp.storage.ExposureSummaryRepository +import de.rki.coronawarnapp.risk.DefaultRiskLevels import de.rki.coronawarnapp.storage.RiskLevelRepository import de.rki.coronawarnapp.storage.SettingsRepository import de.rki.coronawarnapp.storage.TracingRepository @@ -30,8 +30,8 @@ class TracingDetailsStateProvider @Inject constructor( RiskLevelRepository.riskLevelScore, RiskLevelRepository.riskLevelScoreLastSuccessfulCalculated, tracingRepository.tracingProgress, - ExposureSummaryRepository.matchedKeyCount, - ExposureSummaryRepository.daysSinceLastExposure, + DefaultRiskLevels.matchedKeyCount, + DefaultRiskLevels.daysSinceLastExposure, tracingRepository.activeTracingDaysInRetentionPeriod, tracingRepository.lastTimeDiagnosisKeysFetched, backgroundModeStatus.isAutoModeEnabled, diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt index af2cb89a0..b9452f8b0 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt @@ -22,6 +22,7 @@ import de.rki.coronawarnapp.receiver.ReceiverBinder import de.rki.coronawarnapp.risk.RiskModule import de.rki.coronawarnapp.service.ServiceBinder import de.rki.coronawarnapp.storage.SettingsRepository +import de.rki.coronawarnapp.risk.ExposureResultStore import de.rki.coronawarnapp.storage.interoperability.InteroperabilityRepository import de.rki.coronawarnapp.submission.SubmissionModule import de.rki.coronawarnapp.submission.SubmissionTaskModule @@ -84,6 +85,8 @@ interface ApplicationComponent : AndroidInjector<CoronaWarnApplication> { val enfClient: ENFClient + val exposureResultStore: ExposureResultStore + val encryptedPreferencesFactory: EncryptedPreferencesFactory val errorResetTool: EncryptionErrorResetTool diff --git a/Corona-Warn-App/src/main/res/values-bg/strings.xml b/Corona-Warn-App/src/main/res/values-bg/strings.xml index 719004385..2d1890d30 100644 --- a/Corona-Warn-App/src/main/res/values-bg/strings.xml +++ b/Corona-Warn-App/src/main/res/values-bg/strings.xml @@ -24,8 +24,6 @@ <!-- NOTR --> <string name="preference_timestamp_manual_diagnosis_keys_retrieval"><xliff:g id="preference">"preference_timestamp_manual_diagnosis_keys_retrieval"</xliff:g></string> <!-- NOTR --> - <string name="preference_string_google_api_token"><xliff:g id="preference">"preference_m_string_google_api_token"</xliff:g></string> - <!-- NOTR --> <string name="preference_background_job_allowed"><xliff:g id="preference">"preference_background_job_enabled"</xliff:g></string> <!-- NOTR --> <string name="preference_mobile_data_allowed"><xliff:g id="preference">"preference_mobile_data_enabled"</xliff:g></string> diff --git a/Corona-Warn-App/src/main/res/values-de/strings.xml b/Corona-Warn-App/src/main/res/values-de/strings.xml index 23ae7c9f3..1bcba1244 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -25,8 +25,6 @@ <!-- NOTR --> <string name="preference_timestamp_manual_diagnosis_keys_retrieval"><xliff:g id="preference">"preference_timestamp_manual_diagnosis_keys_retrieval"</xliff:g></string> <!-- NOTR --> - <string name="preference_string_google_api_token"><xliff:g id="preference">"preference_m_string_google_api_token"</xliff:g></string> - <!-- NOTR --> <string name="preference_background_job_allowed"><xliff:g id="preference">"preference_background_job_enabled"</xliff:g></string> <!-- NOTR --> <string name="preference_mobile_data_allowed"><xliff:g id="preference">"preference_mobile_data_enabled"</xliff:g></string> diff --git a/Corona-Warn-App/src/main/res/values-en/strings.xml b/Corona-Warn-App/src/main/res/values-en/strings.xml index 9d8ce585c..1671da109 100644 --- a/Corona-Warn-App/src/main/res/values-en/strings.xml +++ b/Corona-Warn-App/src/main/res/values-en/strings.xml @@ -24,8 +24,6 @@ <!-- NOTR --> <string name="preference_timestamp_manual_diagnosis_keys_retrieval"><xliff:g id="preference">"preference_timestamp_manual_diagnosis_keys_retrieval"</xliff:g></string> <!-- NOTR --> - <string name="preference_string_google_api_token"><xliff:g id="preference">"preference_m_string_google_api_token"</xliff:g></string> - <!-- NOTR --> <string name="preference_background_job_allowed"><xliff:g id="preference">"preference_background_job_enabled"</xliff:g></string> <!-- NOTR --> <string name="preference_mobile_data_allowed"><xliff:g id="preference">"preference_mobile_data_enabled"</xliff:g></string> diff --git a/Corona-Warn-App/src/main/res/values-pl/strings.xml b/Corona-Warn-App/src/main/res/values-pl/strings.xml index 7a02cc77e..657e14803 100644 --- a/Corona-Warn-App/src/main/res/values-pl/strings.xml +++ b/Corona-Warn-App/src/main/res/values-pl/strings.xml @@ -24,8 +24,6 @@ <!-- NOTR --> <string name="preference_timestamp_manual_diagnosis_keys_retrieval"><xliff:g id="preference">"preference_timestamp_manual_diagnosis_keys_retrieval"</xliff:g></string> <!-- NOTR --> - <string name="preference_string_google_api_token"><xliff:g id="preference">"preference_m_string_google_api_token"</xliff:g></string> - <!-- NOTR --> <string name="preference_background_job_allowed"><xliff:g id="preference">"preference_background_job_enabled"</xliff:g></string> <!-- NOTR --> <string name="preference_mobile_data_allowed"><xliff:g id="preference">"preference_mobile_data_enabled"</xliff:g></string> diff --git a/Corona-Warn-App/src/main/res/values-ro/strings.xml b/Corona-Warn-App/src/main/res/values-ro/strings.xml index 450e1d43d..1f52872f8 100644 --- a/Corona-Warn-App/src/main/res/values-ro/strings.xml +++ b/Corona-Warn-App/src/main/res/values-ro/strings.xml @@ -24,8 +24,6 @@ <!-- NOTR --> <string name="preference_timestamp_manual_diagnosis_keys_retrieval"><xliff:g id="preference">"preference_timestamp_manual_diagnosis_keys_retrieval"</xliff:g></string> <!-- NOTR --> - <string name="preference_string_google_api_token"><xliff:g id="preference">"preference_m_string_google_api_token"</xliff:g></string> - <!-- NOTR --> <string name="preference_background_job_allowed"><xliff:g id="preference">"preference_background_job_enabled"</xliff:g></string> <!-- NOTR --> <string name="preference_mobile_data_allowed"><xliff:g id="preference">"preference_mobile_data_enabled"</xliff:g></string> diff --git a/Corona-Warn-App/src/main/res/values-tr/strings.xml b/Corona-Warn-App/src/main/res/values-tr/strings.xml index 6cfc04d33..2a391bcd3 100644 --- a/Corona-Warn-App/src/main/res/values-tr/strings.xml +++ b/Corona-Warn-App/src/main/res/values-tr/strings.xml @@ -24,8 +24,6 @@ <!-- NOTR --> <string name="preference_timestamp_manual_diagnosis_keys_retrieval"><xliff:g id="preference">"preference_timestamp_manual_diagnosis_keys_retrieval"</xliff:g></string> <!-- NOTR --> - <string name="preference_string_google_api_token"><xliff:g id="preference">"preference_m_string_google_api_token"</xliff:g></string> - <!-- NOTR --> <string name="preference_background_job_allowed"><xliff:g id="preference">"preference_background_job_enabled"</xliff:g></string> <!-- NOTR --> <string name="preference_mobile_data_allowed"><xliff:g id="preference">"preference_mobile_data_enabled"</xliff:g></string> diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index 35bfadc55..403af6326 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -25,8 +25,6 @@ <!-- NOTR --> <string name="preference_timestamp_manual_diagnosis_keys_retrieval"><xliff:g id="preference">"preference_timestamp_manual_diagnosis_keys_retrieval"</xliff:g></string> <!-- NOTR --> - <string name="preference_string_google_api_token"><xliff:g id="preference">"preference_m_string_google_api_token"</xliff:g></string> - <!-- NOTR --> <string name="preference_background_job_allowed"><xliff:g id="preference">"preference_background_job_enabled"</xliff:g></string> <!-- NOTR --> <string name="preference_mobile_data_allowed"><xliff:g id="preference">"preference_mobile_data_enabled"</xliff:g></string> diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/nearby/windows/ExposureWindowsCalculationTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/nearby/windows/ExposureWindowsCalculationTest.kt index 41c26ebc2..a2064a835 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/nearby/windows/ExposureWindowsCalculationTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/nearby/windows/ExposureWindowsCalculationTest.kt @@ -16,6 +16,7 @@ import de.rki.coronawarnapp.nearby.windows.entities.configuration.JsonMinutesAtA import de.rki.coronawarnapp.nearby.windows.entities.configuration.JsonNormalizedTimeToRiskLevelMapping import de.rki.coronawarnapp.nearby.windows.entities.configuration.JsonTrlFilter import de.rki.coronawarnapp.risk.DefaultRiskLevels +import de.rki.coronawarnapp.risk.ExposureResultStore import de.rki.coronawarnapp.risk.result.AggregatedRiskResult import de.rki.coronawarnapp.risk.result.RiskResult import de.rki.coronawarnapp.server.protocols.internal.v2.RiskCalculationParametersOuterClass @@ -48,6 +49,7 @@ class ExposureWindowsCalculationTest : BaseTest() { @MockK lateinit var appConfigProvider: AppConfigProvider @MockK lateinit var configData: ConfigData @MockK lateinit var timeStamper: TimeStamper + @MockK lateinit var exposureResultStore: ExposureResultStore private lateinit var riskLevels: DefaultRiskLevels private lateinit var testConfig: ConfigData @@ -102,7 +104,7 @@ class ExposureWindowsCalculationTest : BaseTest() { coEvery { appConfigProvider.getAppConfig() } returns testConfig every { appConfigProvider.currentConfig } returns flow { testConfig } logConfiguration(testConfig) - riskLevels = DefaultRiskLevels(appConfigProvider) + riskLevels = DefaultRiskLevels(appConfigProvider, exposureResultStore) // 4 - Mock and log exposure windows val allExposureWindows = mutableListOf<ExposureWindow>() diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/risk/RiskLevelsTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/risk/RiskLevelsTest.kt index 3bc127ce1..26b3cd86f 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/risk/RiskLevelsTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/risk/RiskLevelsTest.kt @@ -14,6 +14,7 @@ import testhelpers.BaseTest class RiskLevelsTest : BaseTest() { @MockK lateinit var appConfigProvider: AppConfigProvider + @MockK lateinit var exposureResultStore: ExposureResultStore private lateinit var riskLevels: DefaultRiskLevels @Before @@ -23,7 +24,7 @@ class RiskLevelsTest : BaseTest() { coEvery { appConfigProvider.getAppConfig() } returns mockk() every { appConfigProvider.currentConfig } returns mockk() - riskLevels = DefaultRiskLevels(appConfigProvider) + riskLevels = DefaultRiskLevels(appConfigProvider, exposureResultStore) } @Test diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/ExposureSummaryRepositoryTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/ExposureSummaryRepositoryTest.kt deleted file mode 100644 index b4a6ffd64..000000000 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/ExposureSummaryRepositoryTest.kt +++ /dev/null @@ -1,112 +0,0 @@ -package de.rki.coronawarnapp.storage - -import com.google.android.gms.nearby.exposurenotification.ExposureSummary -import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient -import io.mockk.MockKAnnotations -import io.mockk.coEvery -import io.mockk.coVerify -import io.mockk.every -import io.mockk.impl.annotations.MockK -import io.mockk.mockk -import io.mockk.mockkObject -import io.mockk.unmockkAll -import kotlinx.coroutines.runBlocking -import org.junit.After -import org.junit.Before -import org.junit.Test -import java.util.UUID - -/** - * ExposureSummaryRepository test. - */ -class ExposureSummaryRepositoryTest { - - @MockK - private lateinit var dao: ExposureSummaryDao - private lateinit var repository: ExposureSummaryRepository - - @Before - fun setUp() { - MockKAnnotations.init(this) - repository = ExposureSummaryRepository(dao) - - mockkObject(InternalExposureNotificationClient) - coEvery { InternalExposureNotificationClient.asyncGetExposureSummary(any()) } returns buildSummary() - coEvery { InternalExposureNotificationClient.asyncIsEnabled() } returns true - - coEvery { dao.getExposureSummaryEntities() } returns listOf() - coEvery { dao.getLatestExposureSummary() } returns null - coEvery { dao.insertExposureSummaryEntity(any()) } returns 0 - } - - /** - * Test DAO is called. - */ - @Test - fun testGet() { - runBlocking { - repository.getExposureSummaryEntities() - - coVerify { - dao.getExposureSummaryEntities() - } - } - } - - /** - * Test DAO is called. - */ - @Test - fun testGetLatest() { - runBlocking { - val token = UUID.randomUUID().toString() - repository.getLatestExposureSummary(token) - - coVerify { - InternalExposureNotificationClient.asyncGetExposureSummary(token) - } - } - } - - /** - * Test DAO is called. - */ - @Test - fun testInsert() { - val es = mockk<ExposureSummary>() - every { es.attenuationDurationsInMinutes } returns intArrayOf(0) - every { es.daysSinceLastExposure } returns 1 - every { es.matchedKeyCount } returns 1 - every { es.maximumRiskScore } returns 0 - every { es.summationRiskScore } returns 0 - - runBlocking { - repository.insertExposureSummaryEntity(es) - - coVerify { - dao.insertExposureSummaryEntity(any()) - } - } - } - - private fun buildSummary( - maxRisk: Int = 0, - lowAttenuation: Int = 0, - midAttenuation: Int = 0, - highAttenuation: Int = 0 - ): ExposureSummary { - val intArray = IntArray(3) - intArray[0] = lowAttenuation - intArray[1] = midAttenuation - intArray[2] = highAttenuation - return ExposureSummary.ExposureSummaryBuilder() - .setMaximumRiskScore(maxRisk) - .setAttenuationDurations(intArray) - .build() - } - - @After - fun cleanUp() { - unmockkAll() - } -} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/worker/WorkerBinderTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/worker/WorkerBinderTest.kt index 468877bba..88976e539 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/worker/WorkerBinderTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/worker/WorkerBinderTest.kt @@ -6,7 +6,9 @@ import dagger.Module import dagger.Provides import de.rki.coronawarnapp.deadman.DeadmanNotificationScheduler import de.rki.coronawarnapp.deadman.DeadmanNotificationSender +import de.rki.coronawarnapp.nearby.ENFClient import de.rki.coronawarnapp.playbook.Playbook +import de.rki.coronawarnapp.risk.ExposureResultStore import de.rki.coronawarnapp.task.TaskController import de.rki.coronawarnapp.util.di.AssistedInjectModule import io.github.classgraph.ClassGraph @@ -87,4 +89,11 @@ class MockProvider { @Provides fun taskController(): TaskController = mockk() + + // For ExposureStateUpdateWorker + @Provides + fun enfClient(): ENFClient = mockk() + + @Provides + fun exposureSummaryRepository(): ExposureResultStore = mockk() } -- GitLab