Skip to content
Snippets Groups Projects
Unverified Commit c964aca1 authored by Matthias Urhahn's avatar Matthias Urhahn Committed by GitHub
Browse files

Merge pull request #1631 from corona-warn-app/release1.7_to_1.8

Release 1.7 to 1.8
parents 6736566f 9367f3cf
No related branches found
No related tags found
No related merge requests found
Showing
with 281 additions and 29 deletions
......@@ -3,10 +3,10 @@ name: "Validate Gradle Wrapper"
on:
push:
branches:
- master
- main
pull_request:
branches:
- master
- main
jobs:
validation:
......
......@@ -163,11 +163,12 @@ android {
}
println("deviceForTesters adjusted versionName: $adjustedVersionName")
}
variant.outputs.each { output ->
def apkName = "Corona-Warn-App-${output.versionNameOverride}-${flavor.name}-${variant.buildType.name}.apk"
println("APK Name: $apkName")
output.outputFileName = apkName
if (flavor.name != "device") {
variant.outputs.each { output ->
def apkName = "Corona-Warn-App-${output.versionNameOverride}-${flavor.name}-${variant.buildType.name}.apk"
println("Override APK Name: $apkName")
output.outputFileName = apkName
}
}
}
......
......@@ -4,7 +4,6 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.asLiveData
import androidx.lifecycle.map
import androidx.lifecycle.viewModelScope
import com.squareup.inject.assisted.AssistedInject
import de.rki.coronawarnapp.bugreporting.event.BugEvent
import de.rki.coronawarnapp.bugreporting.reportProblem
......@@ -12,9 +11,7 @@ import de.rki.coronawarnapp.bugreporting.storage.repository.BugRepository
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import timber.log.Timber
import java.lang.Exception
class SettingsCrashReportViewModel @AssistedInject constructor(
private val crashReportRepository: BugRepository
......@@ -28,7 +25,7 @@ class SettingsCrashReportViewModel @AssistedInject constructor(
createBugEventFormattedText(it)
}
fun deleteAllCrashReports() = viewModelScope.launch(Dispatchers.IO) {
fun deleteAllCrashReports() = launch(Dispatchers.IO) {
crashReportRepository.clear()
}
......
package de.rki.coronawarnapp.test.debugoptions.ui
import android.content.Context
import androidx.lifecycle.viewModelScope
import com.squareup.inject.assisted.AssistedInject
import de.rki.coronawarnapp.environment.EnvironmentSetup
import de.rki.coronawarnapp.environment.EnvironmentSetup.Type.Companion.toEnvironmentType
......@@ -15,8 +14,6 @@ import de.rki.coronawarnapp.util.ui.SingleLiveEvent
import de.rki.coronawarnapp.util.ui.smartLiveData
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.io.File
class DebugOptionsFragmentViewModel @AssistedInject constructor(
......@@ -69,7 +66,7 @@ class DebugOptionsFragmentViewModel @AssistedInject constructor(
fun shareLogFile() {
CWADebug.fileLogger?.let {
viewModelScope.launch(context = Dispatchers.Default) {
launch {
if (!it.logFile.exists()) return@launch
val externalPath = File(
......
......@@ -8,6 +8,7 @@ import de.rki.coronawarnapp.test.crash.ui.SettingsCrashReportFragment
import de.rki.coronawarnapp.test.debugoptions.ui.DebugOptionsFragment
import de.rki.coronawarnapp.test.keydownload.ui.KeyDownloadTestFragment
import de.rki.coronawarnapp.test.risklevel.ui.TestRiskLevelCalculationFragment
import de.rki.coronawarnapp.test.submission.ui.SubmissionTestFragment
import de.rki.coronawarnapp.test.tasks.ui.TestTaskControllerFragment
import de.rki.coronawarnapp.util.ui.SingleLiveEvent
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
......@@ -23,6 +24,7 @@ class TestMenuFragmentViewModel @AssistedInject constructor() : CWAViewModel() {
TestRiskLevelCalculationFragment.MENU_ITEM,
KeyDownloadTestFragment.MENU_ITEM,
TestTaskControllerFragment.MENU_ITEM,
SubmissionTestFragment.MENU_ITEM,
SettingsCrashReportFragment.MENU_ITEM
).let { MutableLiveData(it) }
}
......
......@@ -15,7 +15,6 @@ import de.rki.coronawarnapp.server.protocols.AppleLegacyKeyExchange
import de.rki.coronawarnapp.sharing.ExposureSharingService
import de.rki.coronawarnapp.test.menu.ui.TestMenuItem
import de.rki.coronawarnapp.ui.viewmodel.SettingsViewModel
import de.rki.coronawarnapp.ui.viewmodel.SubmissionViewModel
import de.rki.coronawarnapp.util.di.AutoInject
import de.rki.coronawarnapp.util.ui.observe2
import de.rki.coronawarnapp.util.ui.viewBindingLazy
......@@ -39,7 +38,6 @@ class TestRiskLevelCalculationFragment : Fragment(R.layout.fragment_test_risk_le
)
private val settingsViewModel: SettingsViewModel by activityViewModels()
private val submissionViewModel: SubmissionViewModel by activityViewModels()
private val binding: FragmentTestRiskLevelCalculationBinding by viewBindingLazy()
......@@ -51,7 +49,10 @@ class TestRiskLevelCalculationFragment : Fragment(R.layout.fragment_test_risk_le
}
binding.settingsViewModel = settingsViewModel
binding.submissionViewModel = submissionViewModel
vm.showRiskStatusCard.observe2(this) {
binding.showRiskStatusCard = it
}
binding.buttonRetrieveDiagnosisKeys.setOnClickListener { vm.retrieveDiagnosisKeys() }
binding.buttonProvideKeyViaQr.setOnClickListener { vm.scanLocalQRCodeAndProvide() }
......
......@@ -4,7 +4,6 @@ import android.content.Context
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import com.google.android.gms.nearby.exposurenotification.ExposureInformation
import com.squareup.inject.assisted.Assisted
import com.squareup.inject.assisted.AssistedInject
......@@ -23,11 +22,13 @@ import de.rki.coronawarnapp.server.protocols.AppleLegacyKeyExchange
import de.rki.coronawarnapp.storage.AppDatabase
import de.rki.coronawarnapp.storage.LocalData
import de.rki.coronawarnapp.storage.RiskLevelRepository
import de.rki.coronawarnapp.storage.SubmissionRepository
import de.rki.coronawarnapp.task.TaskController
import de.rki.coronawarnapp.task.common.DefaultTaskRequest
import de.rki.coronawarnapp.task.submitBlocking
import de.rki.coronawarnapp.ui.tracing.card.TracingCardStateProvider
import de.rki.coronawarnapp.util.KeyFileHelper
import de.rki.coronawarnapp.util.NetworkRequestWrapper.Companion.withSuccess
import de.rki.coronawarnapp.util.coroutine.DispatcherProvider
import de.rki.coronawarnapp.util.di.AppContext
import de.rki.coronawarnapp.util.di.AppInjector
......@@ -36,8 +37,8 @@ import de.rki.coronawarnapp.util.ui.SingleLiveEvent
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.sample
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import timber.log.Timber
import java.io.File
......@@ -65,6 +66,9 @@ class TestRiskLevelCalculationFragmentCWAViewModel @AssistedInject constructor(
val riskLevelResetEvent = SingleLiveEvent<Unit>()
val apiKeysProvidedEvent = SingleLiveEvent<DiagnosisKeyProvidedEvent>()
val riskScoreState = MutableLiveData<RiskScoreState>(RiskScoreState())
val showRiskStatusCard = SubmissionRepository.deviceUIStateFlow.map {
it.withSuccess(false) { true }
}.asLiveData(dispatcherProvider.Default)
val tracingCardState = tracingCardStateProvider.state
.sample(150L)
......@@ -90,7 +94,7 @@ class TestRiskLevelCalculationFragmentCWAViewModel @AssistedInject constructor(
}
fun resetRiskLevel() {
viewModelScope.launch {
launch {
withContext(Dispatchers.IO) {
try {
// Preference reset
......@@ -122,7 +126,7 @@ class TestRiskLevelCalculationFragmentCWAViewModel @AssistedInject constructor(
)
fun startENFObserver() {
viewModelScope.launch {
launch {
try {
var workState = riskScoreState.value!!
......@@ -263,7 +267,7 @@ class TestRiskLevelCalculationFragmentCWAViewModel @AssistedInject constructor(
dir.mkdirs()
var googleFileList: List<File>
viewModelScope.launch {
launch {
googleFileList = KeyFileHelper.asyncCreateExportFiles(appleFiles, dir)
Timber.i("Provide ${googleFileList.count()} files with ${appleKeyList.size} keys with token $token")
......@@ -291,7 +295,7 @@ class TestRiskLevelCalculationFragmentCWAViewModel @AssistedInject constructor(
}
fun clearKeyCache() {
viewModelScope.launch { keyCacheRepository.clear() }
launch { keyCacheRepository.clear() }
}
@AssistedInject.Factory
......
package de.rki.coronawarnapp.test.submission.ui
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.databinding.FragmentTestSubmissionBinding
import de.rki.coronawarnapp.test.menu.ui.TestMenuItem
import de.rki.coronawarnapp.util.di.AutoInject
import de.rki.coronawarnapp.util.ui.observe2
import de.rki.coronawarnapp.util.ui.viewBindingLazy
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider
import de.rki.coronawarnapp.util.viewmodel.cwaViewModels
import javax.inject.Inject
@SuppressLint("SetTextI18n")
class SubmissionTestFragment : Fragment(R.layout.fragment_test_submission), AutoInject {
@Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory
private val vm: SubmissionTestFragmentViewModel by cwaViewModels { viewModelFactory }
private val binding: FragmentTestSubmissionBinding by viewBindingLazy()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
vm.currentTestId.observe2(this) {
binding.registrationTokenCurrent.text = "Current: '$it'"
}
binding.apply {
deleteTokenAction.setOnClickListener { vm.deleteRegistrationToken() }
scrambleTokenAction.setOnClickListener { vm.scrambleRegistrationToken() }
}
}
companion object {
val TAG: String = SubmissionTestFragment::class.simpleName!!
val MENU_ITEM = TestMenuItem(
title = "Submission Test Options",
description = "Submission related test options..",
targetId = R.id.test_submission_fragment
)
}
}
package de.rki.coronawarnapp.test.submission.ui
import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoMap
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelKey
@Module
abstract class SubmissionTestFragmentModule {
@Binds
@IntoMap
@CWAViewModelKey(SubmissionTestFragmentViewModel::class)
abstract fun testKeyDownloadFragment(
factory: SubmissionTestFragmentViewModel.Factory
): CWAViewModelFactory<out CWAViewModel>
}
package de.rki.coronawarnapp.test.submission.ui
import androidx.lifecycle.asLiveData
import com.squareup.inject.assisted.AssistedInject
import de.rki.coronawarnapp.storage.LocalData
import de.rki.coronawarnapp.util.coroutine.DispatcherProvider
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory
import kotlinx.coroutines.flow.MutableStateFlow
import java.util.UUID
class SubmissionTestFragmentViewModel @AssistedInject constructor(
dispatcherProvider: DispatcherProvider
) : CWAViewModel(dispatcherProvider = dispatcherProvider) {
private val internalToken = MutableStateFlow(LocalData.registrationToken())
val currentTestId = internalToken.asLiveData()
fun scrambleRegistrationToken() {
LocalData.registrationToken(UUID.randomUUID().toString())
internalToken.value = LocalData.registrationToken()
}
fun deleteRegistrationToken() {
LocalData.registrationToken(null)
internalToken.value = LocalData.registrationToken()
}
@AssistedInject.Factory
interface Factory : SimpleCWAViewModelFactory<SubmissionTestFragmentViewModel>
}
......@@ -14,6 +14,8 @@ import de.rki.coronawarnapp.test.menu.ui.TestMenuFragment
import de.rki.coronawarnapp.test.menu.ui.TestMenuFragmentModule
import de.rki.coronawarnapp.test.risklevel.ui.TestRiskLevelCalculationFragment
import de.rki.coronawarnapp.test.risklevel.ui.TestRiskLevelCalculationFragmentModule
import de.rki.coronawarnapp.test.submission.ui.SubmissionTestFragment
import de.rki.coronawarnapp.test.submission.ui.SubmissionTestFragmentModule
import de.rki.coronawarnapp.test.tasks.ui.TestTaskControllerFragment
import de.rki.coronawarnapp.test.tasks.ui.TestTaskControllerFragmentModule
......@@ -40,4 +42,7 @@ abstract class MainActivityTestModule {
@ContributesAndroidInjector(modules = [KeyDownloadTestFragmentModule::class])
abstract fun keyDownload(): KeyDownloadTestFragment
@ContributesAndroidInjector(modules = [SubmissionTestFragmentModule::class])
abstract fun submissionTest(): SubmissionTestFragment
}
......@@ -11,8 +11,8 @@
<import type="de.rki.coronawarnapp.util.formatter.FormatterSubmissionHelper" />
<variable
name="submissionViewModel"
type="de.rki.coronawarnapp.ui.viewmodel.SubmissionViewModel" />
name="showRiskStatusCard"
type="Boolean" />
<variable
name="settingsViewModel"
......@@ -48,7 +48,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/spacing_normal"
android:visibility="@{FormatterSubmissionHelper.formatShowRiskStatusCard(submissionViewModel.deviceUiState)}"
gone="@{showRiskStatusCard == null || !showRiskStatusCard}"
android:focusable="true"
android:backgroundTint="@{tracingCard.getRiskInfoContainerBackgroundTint(context)}"
android:backgroundTintMode="src_over">
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="HardcodedText">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="8dp"
android:orientation="vertical"
android:paddingBottom="32dp">
<androidx.constraintlayout.widget.ConstraintLayout
style="@style/card"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/spacing_tiny"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:orientation="vertical">
<TextView
android:id="@+id/registration_token_title"
style="@style/body1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Submission registration token "
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/registration_token_current"
style="@style/body2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/spacing_tiny"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/registration_token_title"
tools:text="Current test ID: 1234567890" />
<Button
android:id="@+id/delete_token_action"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/spacing_tiny"
android:layout_weight="1"
android:text="Delete token"
app:layout_constraintEnd_toStartOf="@+id/scramble_token_action"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/registration_token_current" />
<Button
android:id="@+id/scramble_token_action"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/spacing_tiny"
android:layout_weight="1"
android:text="Random token"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/delete_token_action"
app:layout_constraintTop_toBottomOf="@+id/registration_token_current" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
\ No newline at end of file
......@@ -31,6 +31,9 @@
<action
android:id="@+id/action_test_menu_fragment_to_keyDownloadTestFragment"
app:destination="@id/test_keydownload_fragment" />
<action
android:id="@+id/action_test_menu_fragment_to_submissionTestFragment"
app:destination="@id/test_submission_fragment" />
</fragment>
<fragment
......@@ -86,5 +89,10 @@
android:name="de.rki.coronawarnapp.test.keydownload.ui.KeyDownloadTestFragment"
android:label="KeyDownloadTestFragment"
tools:layout="@layout/fragment_test_keydownload" />
<fragment
android:id="@+id/test_submission_fragment"
android:name="de.rki.coronawarnapp.test.submission.ui.SubmissionTestFragment"
android:label="SubmissionTestFragment"
tools:layout="@layout/fragment_test_submission" />
</navigation>
......@@ -11,6 +11,7 @@ import androidx.work.WorkManager
import dagger.android.AndroidInjector
import dagger.android.DispatchingAndroidInjector
import dagger.android.HasAndroidInjector
import de.rki.coronawarnapp.appconfig.ConfigChangeDetector
import de.rki.coronawarnapp.bugreporting.loghistory.LogHistoryTree
import de.rki.coronawarnapp.deadman.DeadmanNotificationScheduler
import de.rki.coronawarnapp.exception.reporting.ErrorReportReceiver
......@@ -44,6 +45,7 @@ class CoronaWarnApplication : Application(), HasAndroidInjector {
@Inject lateinit var taskController: TaskController
@Inject lateinit var foregroundState: ForegroundState
@Inject lateinit var workManager: WorkManager
@Inject lateinit var configChangeDetector: ConfigChangeDetector
@Inject lateinit var deadmanNotificationScheduler: DeadmanNotificationScheduler
@LogHistoryTree @Inject lateinit var rollingLogHistory: Timber.Tree
......@@ -79,6 +81,8 @@ class CoronaWarnApplication : Application(), HasAndroidInjector {
if (LocalData.onboardingCompletedTimestamp() != null) {
deadmanNotificationScheduler.schedulePeriodic()
}
configChangeDetector.launch()
}
private val activityLifecycleCallback = object : ActivityLifecycleCallbacks {
......
......@@ -22,7 +22,7 @@ class AppConfigProvider @Inject constructor(
loggingTag = "AppConfigProvider",
scope = scope,
coroutineContext = dispatcherProvider.IO,
sharingBehavior = SharingStarted.WhileSubscribed(replayExpirationMillis = 0)
sharingBehavior = SharingStarted.Lazily
) {
source.retrieveConfig()
}
......
package de.rki.coronawarnapp.appconfig
import androidx.annotation.VisibleForTesting
import de.rki.coronawarnapp.risk.RiskLevel
import de.rki.coronawarnapp.risk.RiskLevelData
import de.rki.coronawarnapp.risk.RiskLevelTask
import de.rki.coronawarnapp.storage.RiskLevelRepository
import de.rki.coronawarnapp.task.TaskController
import de.rki.coronawarnapp.task.common.DefaultTaskRequest
import de.rki.coronawarnapp.util.coroutine.AppScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.distinctUntilChangedBy
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import timber.log.Timber
import javax.inject.Inject
class ConfigChangeDetector @Inject constructor(
private val appConfigProvider: AppConfigProvider,
private val taskController: TaskController,
@AppScope private val appScope: CoroutineScope,
private val riskLevelData: RiskLevelData
) {
fun launch() {
Timber.v("Monitoring config changes.")
appConfigProvider.currentConfig
.distinctUntilChangedBy { it.identifier }
.onEach {
Timber.v("Running app config change checks.")
check(it.identifier)
}
.catch { Timber.e(it, "App config change checks failed.") }
.launchIn(appScope)
}
@VisibleForTesting
internal fun check(newIdentifier: String) {
if (riskLevelData.lastUsedConfigIdentifier == null) {
// No need to reset anything if we didn't calculate a risklevel yet.
Timber.d("Config changed, but no previous identifier is available.")
return
}
val oldConfigId = riskLevelData.lastUsedConfigIdentifier
if (newIdentifier != oldConfigId) {
Timber.i("New config id ($newIdentifier) differs from last one ($oldConfigId), resetting.")
RiskLevelRepositoryDeferrer.resetRiskLevel()
taskController.submit(DefaultTaskRequest(RiskLevelTask::class))
} else {
Timber.v("Config identifier ($oldConfigId) didn't change, NOOP.")
}
}
@VisibleForTesting
internal object RiskLevelRepositoryDeferrer {
fun resetRiskLevel() {
RiskLevelRepository.setRiskLevelScore(RiskLevel.UNDETERMINED)
}
}
}
......@@ -27,7 +27,6 @@ open class CwaSuccessResponseWithCodeMismatchNotSupportedError(statusCode: Int)
open class CwaInformationalNotSupportedError(statusCode: Int) : CwaWebException(statusCode)
open class CwaRedirectNotSupportedError(statusCode: Int) : CwaWebException(statusCode)
class CwaUnknownHostException : CwaWebException(901)
class BadRequestException : CwaClientError(400)
class UnauthorizedException : CwaClientError(401)
class ForbiddenException : CwaClientError(403)
......@@ -44,5 +43,6 @@ class ServiceUnavailableException : CwaServerError(503)
class GatewayTimeoutException : CwaServerError(504)
class HTTPVersionNotSupported : CwaServerError(505)
class NetworkAuthenticationRequiredException : CwaServerError(511)
class CwaUnknownHostException : CwaServerError(597)
class NetworkReadTimeoutException : CwaServerError(598)
class NetworkConnectTimeoutException : CwaServerError(599)
......@@ -26,6 +26,7 @@ import de.rki.coronawarnapp.exception.http.UnauthorizedException
import de.rki.coronawarnapp.exception.http.UnsupportedMediaTypeException
import okhttp3.Interceptor
import okhttp3.Response
import java.net.SocketTimeoutException
import java.net.UnknownHostException
import javax.net.ssl.HttpsURLConnection
......@@ -66,6 +67,8 @@ class HttpErrorParser : Interceptor {
throw CwaWebException(code)
}
}
} catch (err: SocketTimeoutException) {
throw NetworkConnectTimeoutException()
} catch (err: UnknownHostException) {
throw CwaUnknownHostException()
}
......
......@@ -2,6 +2,8 @@ package de.rki.coronawarnapp.nearby.modules.detectiontracker
import android.content.Context
import com.google.gson.Gson
import de.rki.coronawarnapp.exception.ExceptionCategory
import de.rki.coronawarnapp.exception.reporting.report
import de.rki.coronawarnapp.util.di.AppContext
import de.rki.coronawarnapp.util.serialization.BaseGson
import de.rki.coronawarnapp.util.serialization.fromJson
......@@ -44,11 +46,13 @@ class ExposureDetectionTrackerStorage @Inject constructor(
if (!storageFile.exists()) return@withLock emptyMap()
gson.fromJson<Map<String, TrackedExposureDetection>>(storageFile).also {
require(it.size >= 0)
Timber.v("Loaded detection data: %s", it)
lastCalcuationData = it
}
} catch (e: Exception) {
Timber.e(e, "Failed to load tracked detections.")
if (storageFile.delete()) Timber.w("Storage file was deleted.")
emptyMap()
}
}
......@@ -63,6 +67,7 @@ class ExposureDetectionTrackerStorage @Inject constructor(
gson.toJson(data, storageFile)
} catch (e: Exception) {
Timber.e(e, "Failed to save tracked detections.")
e.report(ExceptionCategory.INTERNAL)
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment