diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/TestForAPIFragment.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/TestForAPIFragment.kt index 748a74ba2e2526c8dac164ee15ce902c5c929618..5c20d3a4671bf218c084817bb904ab240d9b13b1 100644 --- a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/TestForAPIFragment.kt +++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/TestForAPIFragment.kt @@ -30,6 +30,7 @@ import com.google.zxing.BarcodeFormat import com.google.zxing.integration.android.IntentIntegrator import com.google.zxing.integration.android.IntentResult import com.google.zxing.qrcode.QRCodeWriter +import de.rki.coronawarnapp.CoronaWarnApplication import de.rki.coronawarnapp.R import de.rki.coronawarnapp.databinding.FragmentTestForAPIBinding import de.rki.coronawarnapp.exception.ExceptionCategory @@ -53,6 +54,7 @@ import de.rki.coronawarnapp.ui.viewmodel.TracingViewModel import de.rki.coronawarnapp.util.KeyFileHelper import kotlinx.android.synthetic.deviceForTesters.fragment_test_for_a_p_i.* import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.joda.time.DateTime @@ -246,6 +248,51 @@ class TestForAPIFragment : Fragment(), InternalExposureNotificationPermissionHel showToast(TimeVariables.getActiveTracingDaysInRetentionPeriod().toString()) } } + + binding.testLogfileToggle.isChecked = CoronaWarnApplication.fileLogger?.isLogging ?: false + binding.testLogfileToggle.setOnClickListener { buttonView -> + CoronaWarnApplication.fileLogger?.let { + if (binding.testLogfileToggle.isChecked) { + it.start() + } else { + it.stop() + } + } + } + + binding.testLogfileShare.setOnClickListener { + CoronaWarnApplication.fileLogger?.let { + lifecycleScope.launch { + val targetPath = withContext(Dispatchers.IO) { + async { + if (!it.logFile.exists()) return@async null + + val externalPath = File( + requireContext().getExternalFilesDir(null), + "LogFile-${System.currentTimeMillis()}.log" + ) + + it.logFile.copyTo(externalPath) + + return@async externalPath + } + }.await() + if (targetPath != null) { + Toast.makeText( + requireActivity(), + "Logfile copied to $targetPath", + Toast.LENGTH_SHORT + ).show() + } else { + Toast.makeText( + requireActivity(), + "No log file available", + Toast.LENGTH_SHORT + ).show() + } + } + } + } } override fun onResume() { diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/TestRiskLevelCalculationFragment.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/TestRiskLevelCalculationFragment.kt index d5de4bcac8c8d9235e7c7d46b3d2dc7404aba6fb..6172b4f2fbfbe2571a64909528b7fd75e7c91064 100644 --- a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/TestRiskLevelCalculationFragment.kt +++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/TestRiskLevelCalculationFragment.kt @@ -155,7 +155,7 @@ class TestRiskLevelCalculationFragment : Fragment() { try { RetrieveDiagnosisKeysTransaction.start() calculateRiskLevel() - } catch (e: TransactionException) { + } catch (e: Exception) { e.report(ExceptionCategory.INTERNAL) } } diff --git a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_for_a_p_i.xml b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_for_a_p_i.xml index a90a271a9127bf29b0fffd2ed1ddf66677aa90a5..f8b9d4a5dfa12a8090744d093d356ec1b4605c59 100644 --- a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_for_a_p_i.xml +++ b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_for_a_p_i.xml @@ -1,5 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> -<layout xmlns:android="http://schemas.android.com/apk/res/android"> +<layout xmlns:tools="http://schemas.android.com/tools" + tools:ignore="HardcodedText" + xmlns:android="http://schemas.android.com/apk/res/android"> <data> @@ -30,6 +32,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" /> + <Switch android:id="@+id/test_api_switch_last_three_hours_from_server" style="@style/body1" @@ -46,6 +49,27 @@ android:text="@string/test_api_switch_background_notifications" android:theme="@style/switchBase" /> + <LinearLayout + android:layout_width="match_parent" + android:orientation="horizontal" + android:layout_height="wrap_content"> + + <Switch + android:id="@+id/test_logfile_toggle" + style="@style/body1" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Logfile enabled" + android:theme="@style/switchBase" /> + + <Button + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@+id/test_logfile_share" + android:text="Share log" /> + + </LinearLayout> + <TextView android:id="@+id/label_exposure_summary" style="@style/headline6" diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/CoronaWarnApplication.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/CoronaWarnApplication.kt index 9369e2914894cdf8b15bc3ac7f84691c90165bbe..7e3f60900750e5188b2ca9ba11499cf908b68242 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/CoronaWarnApplication.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/CoronaWarnApplication.kt @@ -27,6 +27,7 @@ import de.rki.coronawarnapp.storage.LocalData import de.rki.coronawarnapp.transaction.RetrieveDiagnosisKeysTransaction import de.rki.coronawarnapp.util.CWADebug import de.rki.coronawarnapp.util.ConnectivityHelper +import de.rki.coronawarnapp.util.debug.FileLogger import de.rki.coronawarnapp.util.di.AppInjector import de.rki.coronawarnapp.util.di.ApplicationComponent import de.rki.coronawarnapp.worker.BackgroundWorkHelper @@ -56,6 +57,7 @@ class CoronaWarnApplication : Application(), LifecycleObserver, instance.applicationContext const val TEN_MINUTE_TIMEOUT_IN_MS = 10 * 60 * 1000L + var fileLogger: FileLogger? = null } private lateinit var errorReceiver: ErrorReportReceiver @@ -88,6 +90,9 @@ class CoronaWarnApplication : Application(), LifecycleObserver, if (BuildConfig.DEBUG) { Timber.plant(Timber.DebugTree()) } + if ((BuildConfig.FLAVOR == "deviceForTesters" || BuildConfig.DEBUG)) { + fileLogger = FileLogger(this) + } // notification to test the WakeUpService from Google when the app // was force stopped @@ -99,27 +104,9 @@ class CoronaWarnApplication : Application(), LifecycleObserver, ProcessLifecycleOwner.get().lifecycleScope.launch { // we want a wakelock as the OS does not handle this for us like in the background // job execution - val wakeLock: PowerManager.WakeLock = - (getSystemService(Context.POWER_SERVICE) as PowerManager).run { - newWakeLock( - PowerManager.PARTIAL_WAKE_LOCK, - TAG + "-WAKE-" + UUID.randomUUID().toString() - ).apply { - acquire(TEN_MINUTE_TIMEOUT_IN_MS) - } - } - + val wakeLock = createWakeLock() // we keep a wifi lock to wake up the wifi connection in case the device is dozing - val wifiLock: WifiManager.WifiLock = - (getSystemService(Context.WIFI_SERVICE) as WifiManager).run { - createWifiLock( - WifiManager.WIFI_MODE_FULL_HIGH_PERF, - TAG + "-WIFI-" + UUID.randomUUID().toString() - ).apply { - acquire() - } - } - + val wifiLock = createWifiLock() try { BackgroundWorkHelper.sendDebugNotification( "Automatic mode is on", "Check if we have downloaded keys already today" @@ -146,6 +133,28 @@ class CoronaWarnApplication : Application(), LifecycleObserver, } } + private fun createWakeLock(): PowerManager.WakeLock = + (getSystemService(Context.POWER_SERVICE) as PowerManager) + .run { + newWakeLock( + PowerManager.PARTIAL_WAKE_LOCK, + TAG + "-WAKE-" + UUID.randomUUID().toString() + ).apply { + acquire(TEN_MINUTE_TIMEOUT_IN_MS) + } + } + + private fun createWifiLock(): WifiManager.WifiLock = + (getSystemService(Context.WIFI_SERVICE) as WifiManager) + .run { + createWifiLock( + WifiManager.WIFI_MODE_FULL_HIGH_PERF, + TAG + "-WIFI-" + UUID.randomUUID().toString() + ).apply { + acquire() + } + } + /** * Callback when the app is open but backgrounded */ diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/GoogleQuotaCalculator.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/GoogleQuotaCalculator.kt index e7aace190ed9a6217487d3f76b6356c07c6aa267..e686eec758b341013155ff014eec6f094323b62c 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/GoogleQuotaCalculator.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/GoogleQuotaCalculator.kt @@ -6,6 +6,7 @@ import org.joda.time.DateTime import org.joda.time.DateTimeZone import org.joda.time.Duration import org.joda.time.Instant +import timber.log.Timber /** * This Calculator class takes multiple parameters to check if the Google API @@ -28,34 +29,58 @@ class GoogleQuotaCalculator( override var hasExceededQuota: Boolean = false override fun calculateQuota(): Boolean { - if (Instant.now().isAfter(LocalData.nextTimeRateLimitingUnlocks)) { + val oldQuota = LocalData.googleAPIProvideDiagnosisKeysCallCount + var currentQuota = oldQuota + + val now = Instant.now() + val nextUnlock = LocalData.nextTimeRateLimitingUnlocks + + Timber.v( + "calculateQuota() start! (currentQuota=%s, timeNow=%s, timeReset=%s)", + oldQuota, now, nextUnlock + ) + if (now.isAfter(nextUnlock)) { LocalData.nextTimeRateLimitingUnlocks = DateTime .now(quotaTimeZone) .withChronology(quotaChronology) .plus(quotaResetPeriod) .withTimeAtStartOfDay() .toInstant() - LocalData.googleAPIProvideDiagnosisKeysCallCount = 0 + Timber.d("calculateQuota() quota reset to 0.") + currentQuota = 0 + } else { + Timber.v("calculateQuota() can't be reset yet.") } - if (LocalData.googleAPIProvideDiagnosisKeysCallCount <= quotaLimit) { - LocalData.googleAPIProvideDiagnosisKeysCallCount += incrementByAmount + if (currentQuota <= quotaLimit) { + currentQuota += incrementByAmount } - hasExceededQuota = LocalData.googleAPIProvideDiagnosisKeysCallCount > quotaLimit + if (currentQuota != oldQuota) { + LocalData.googleAPIProvideDiagnosisKeysCallCount = currentQuota + } - return hasExceededQuota + return (currentQuota > quotaLimit).also { + hasExceededQuota = it + Timber.v( + "calculateQuota() done! -> oldQuota=%d, currentQuotaHm=%d, quotaLimit=%d, EXCEEDED=%b", + oldQuota, currentQuota, quotaLimit, it + ) + } } override fun resetProgressTowardsQuota(newProgress: Int) { if (newProgress > quotaLimit) { - throw IllegalArgumentException("cannot reset progress to a value higher than the quota limit") + Timber.w("cannot reset progress to a value higher than the quota limit") + return } if (newProgress % incrementByAmount != 0) { - throw IllegalArgumentException("supplied progress is no multiple of $incrementByAmount") + Timber.e("supplied progress is no multiple of $incrementByAmount") + return } LocalData.googleAPIProvideDiagnosisKeysCallCount = newProgress hasExceededQuota = false + Timber.d("resetProgressTowardsQuota(newProgress=%d) done", newProgress) } override fun getProgressTowardsQuota(): Int = LocalData.googleAPIProvideDiagnosisKeysCallCount diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/debug/FileLogger.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/debug/FileLogger.kt new file mode 100644 index 0000000000000000000000000000000000000000..eb3b29093e4a6c772d65dd7167ecbeda941588e0 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/debug/FileLogger.kt @@ -0,0 +1,40 @@ +package de.rki.coronawarnapp.util.debug + +import android.content.Context +import timber.log.Timber +import java.io.File + +class FileLogger constructor(private val context: Context) { + + val logFile = File(context.cacheDir, "FileLoggerTree.log") + val triggerFile = File(context.filesDir, "FileLoggerTree.trigger") + private var loggerTree: FileLoggerTree? = null + + val isLogging: Boolean + get() = loggerTree != null + + init { + if (triggerFile.exists()) { + start() + } + } + + fun start() { + if (loggerTree != null) return + + loggerTree = FileLoggerTree(logFile).also { + Timber.plant(it) + it.start() + triggerFile.createNewFile() + } + } + + fun stop() { + loggerTree?.let { + it.stop() + logFile.delete() + triggerFile.delete() + loggerTree = null + } + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/debug/FileLoggerTree.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/debug/FileLoggerTree.kt new file mode 100644 index 0000000000000000000000000000000000000000..84bd21ad68562197d35c5e136283ccd22ef73f7f --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/debug/FileLoggerTree.kt @@ -0,0 +1,86 @@ +package de.rki.coronawarnapp.util.debug + +import android.annotation.SuppressLint +import android.util.Log +import timber.log.Timber +import java.io.File +import java.io.FileOutputStream +import java.io.IOException +import java.io.OutputStreamWriter + +@SuppressLint("LogNotTimber") +class FileLoggerTree(private val logFile: File) : Timber.DebugTree() { + private var logWriter: OutputStreamWriter? = null + + @SuppressLint("SetWorldReadable") + @Synchronized + fun start() { + if (logWriter != null) return + + logFile.parentFile.mkdirs() + if (logFile.createNewFile()) { + Log.i(TAG, "File logger writing to " + logFile.path) + } + if (logFile.setReadable(true, false)) { + Log.i(TAG, "Debug run log read permission set") + } + + try { + logWriter = OutputStreamWriter(FileOutputStream(logFile, true)) + logWriter!!.write("=== BEGIN ===\n") + logWriter!!.write("Logfile: $logFile\n") + logWriter!!.flush() + Log.i(TAG, "File logger started.") + } catch (e: IOException) { + e.printStackTrace() + + logFile.delete() + if (logWriter != null) logWriter!!.close() + } + } + + @Synchronized + fun stop() { + logWriter?.let { + logWriter = null + try { + it.write("=== END ===\n") + it.close() + } catch (ignore: IOException) { + } + Log.i(TAG, "File logger stopped.") + } + } + + override fun log(priority: Int, tag: String?, message: String, t: Throwable?) { + logWriter?.let { + try { + it.write("${System.currentTimeMillis()} ${priorityToString(priority)}/$tag: $message\n") + it.flush() + } catch (e: IOException) { + Timber.tag(TAG).e(e) + try { + it.close() + } catch (ignore: Exception) { + } + logWriter = null + } + } + } + + override fun toString(): String { + return "FileLoggerTree(file=$logFile)" + } + + companion object { + private const val TAG = "FileLoggerTree" + private fun priorityToString(priority: Int): String = when (priority) { + Log.ERROR -> "E" + Log.WARN -> "W" + Log.INFO -> "I" + Log.DEBUG -> "D" + Log.VERBOSE -> "V" + else -> priority.toString() + } + } +} diff --git a/Corona-Warn-App/src/main/res/navigation/nav_graph.xml b/Corona-Warn-App/src/main/res/navigation/nav_graph.xml index 3b45032bbf05060f911a72a8e04f8293928a6f6d..a79c1468ea8408fb94e8ade6046afebceba1c4f6 100644 --- a/Corona-Warn-App/src/main/res/navigation/nav_graph.xml +++ b/Corona-Warn-App/src/main/res/navigation/nav_graph.xml @@ -236,6 +236,11 @@ android:name="de.rki.coronawarnapp.ui.submission.SubmissionTanFragment" android:label="fragment_submission_tan" tools:layout="@layout/fragment_submission_tan"> + <action + android:id="@+id/action_submissionTanFragment_to_submissionDispatcherFragment" + app:destination="@id/submissionDispatcherFragment" + app:popUpTo="@id/submissionDispatcherFragment" + app:popUpToInclusive="true" /> <action android:id="@+id/action_submissionTanFragment_to_submissionResultFragment" app:destination="@id/submissionResultFragment" 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 1cea318c8050ccf66aef881f190c159ee1ba8cca..7b72be394abafefafa075c96922714666b6d64bc 100644 --- a/Corona-Warn-App/src/main/res/values-en/strings.xml +++ b/Corona-Warn-App/src/main/res/values-en/strings.xml @@ -276,7 +276,7 @@ <!-- XHED: App overview subtitle for glossary contact --> <string name="main_overview_subtitle_glossary_contact">"Exposures"</string> <!-- YTXT: App overview body for glossary contact --> - <string name="main_overview_body_glossary_contact">"Encounters over an extended period and in close proximity to a person diagnosed with COVID-19."</string> + <string name="main_overview_body_glossary_contact">"Encounters over a longer duration and close proximity to people diagnosed with COVID-19."</string> <!-- XHED: App overview subtitle for glossary notifications --> <string name="main_overview_subtitle_glossary_notification">"Exposure Notification"</string> <!-- YTXT: App overview body for glossary notifications --> 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 a38d1fc6e6e39a509c0ffce0a13855905460cd66..e3608014234833462fc5e739bbf57decc10ed196 100644 --- a/Corona-Warn-App/src/main/res/values-ro/strings.xml +++ b/Corona-Warn-App/src/main/res/values-ro/strings.xml @@ -276,7 +276,7 @@ <!-- XHED: App overview subtitle for glossary contact --> <string name="main_overview_subtitle_glossary_contact">"Expuneri"</string> <!-- YTXT: App overview body for glossary contact --> - <string name="main_overview_body_glossary_contact">"Întâlniri de o durată lungă și în strânsă proximitate cu o persoană diagnosticată cu COVID-19."</string> + <string name="main_overview_body_glossary_contact">"Întâlniri de o durată mai lungă și în strânsă proximitate cu persoane diagnosticate cu COVID-19."</string> <!-- XHED: App overview subtitle for glossary notifications --> <string name="main_overview_subtitle_glossary_notification">"Notificarea de expunere"</string> <!-- YTXT: App overview body for glossary notifications --> @@ -441,7 +441,7 @@ <!-- YMSI: onboarding(tracing) - dialog about background jobs --> <string name="onboarding_background_fetch_dialog_body">"Ați dezactivat actualizările în fundal pentru aplicația Corona-Warn. Activați actualizările în fundal pentru a utiliza înregistrarea automată în jurnal a expunerilor. Dacă nu activați actualizările în fundal, puteți porni doar manual din aplicație înregistrarea în jurnal a expunerilor. Puteți activa actualizările în fundal pentru aplicație din setările dispozitivului dvs."</string> <!-- XBUT: onboarding(tracing) - dialog about background jobs, open device settings --> - <string name="onboarding_background_fetch_dialog_button_positive">"Deschideți setările dispozitivului"</string> + <string name="onboarding_background_fetch_dialog_button_positive">"Deschideți Setările dispozitivului"</string> <!-- XBUT: onboarding(tracing) - dialog about background jobs, continue in app --> <string name="onboarding_background_fetch_dialog_button_negative">"Porniți manual înregistrarea în jurnal a expunerilor"</string> <!-- XACT: onboarding(tracing) - dialog about energy optimized header text --> @@ -465,7 +465,7 @@ <!-- XTXT: onboarding(tracing) - location explanation for bluetooth body text --> <string name="onboarding_tracing_location_body">"Locația dvs. nu poate fi accesată. Google și/sau Android necesită acces la locația dispozitivului dvs. pentru a utiliza Bluetooth-ul."</string> <!-- XBUT: onboarding(tracing) - button enable tracing --> - <string name="onboarding_tracing_location_button">"Deschideți setările dispozitivului"</string> + <string name="onboarding_tracing_location_button">"Deschideți Setările dispozitivului"</string> <!-- XACT: Onboarding (test) page title --> <string name="onboarding_test_accessibility_title">"Pagina de înregistrare 4 din 5: Dacă sunteți diagnosticat cu COVID-19…"</string> <!-- XHED: onboarding(test) - about positive tests --> @@ -535,21 +535,21 @@ <!--XHED : settings(tracing) - headline on card about the current status and what to do --> <string name="settings_tracing_status_bluetooth_headline">"Activați Bluetooth-ul"</string> <!-- XTXT: settings(tracing) - explains user what to do on card if bluetooth is disabled --> - <string name="settings_tracing_status_bluetooth_body">"Bluetooth-ul trebuie să fie activat pentru ca înregistrarea în jurnal a expunerilor să funcționeze. Activați Bluetooth-ul în setările dispozitivului."</string> + <string name="settings_tracing_status_bluetooth_body">"Bluetooth-ul trebuie să fie pornit pentru ca înregistrarea în jurnal a expunerilor să funcționeze. Porniți Bluetooth-ul în setările dispozitivului."</string> <!-- XBUT: settings(tracing) - go to operating system settings button on card --> - <string name="settings_tracing_status_bluetooth_button">"Deschideți setările dispozitivului"</string> + <string name="settings_tracing_status_bluetooth_button">"Deschideți Setările dispozitivului"</string> <!--XHED : settings(tracing) - headline on card about the current status and what to do --> <string name="settings_tracing_status_location_headline">"Permiteți accesul la locație"</string> <!-- XTXT: settings(tracing) - explains user what to do on card if location is disabled --> <string name="settings_tracing_status_location_body">"Locația dvs. nu poate fi accesată. Google și/sau Android necesită acces la locația dispozitivului dvs. pentru a utiliza Bluetooth-ul."</string> <!-- XBUT: settings(tracing) - go to operating system settings button on card - location --> - <string name="settings_tracing_status_location_button">"Deschideți setările dispozitivului"</string> + <string name="settings_tracing_status_location_button">"Deschideți Setările dispozitivului"</string> <!--XHED : settings(tracing) - headline on card about the current status and what to do --> <string name="settings_tracing_status_connection_headline">"Deschideți conexiunea la internet"</string> <!-- XTXT: settings(tracing) - explains user what to do on card if connection is disabled --> <string name="settings_tracing_status_connection_body">"Înregistrarea în jurnal a expunerilor necesită conexiunea la internet pentru a calcula expunerile. Porniți rețeaua Wi-Fi sau datele mobile din setările dispozitivului dvs."</string> <!-- XBUT: settings(tracing) - go to operating system settings button on card --> - <string name="settings_tracing_status_connection_button">"Deschideți setările dispozitivului"</string> + <string name="settings_tracing_status_connection_button">"Deschideți Setările dispozitivului"</string> <!-- XTXT: settings(tracing) - explains the circle progress indicator to the right with the current value --> <plurals name="settings_tracing_status_body_active"> <item quantity="one">"Înregistrarea în jurnal a expunerilor a fost activă o zi.\nO verificare a expunerii poate fi de încredere doar dacă înregistrarea în jurnal a expunerilor este activată permanent."</item> @@ -591,7 +591,7 @@ <!-- XTXT: settings(notification) - next to a switch --> <string name="settings_notifications_subtitle_update_test">"Starea testului COVID-19"</string> <!-- XBUT: settings(notification) - go to operating settings --> - <string name="settings_notifications_button_open_settings">"Deschideți setările dispozitivului"</string> + <string name="settings_notifications_button_open_settings">"Deschideți Setările dispozitivului"</string> <!-- XACT: main (overview) - illustraction description, explanation image, displays notificatin status, active --> <string name="settings_notifications_illustration_description_active">"O femeie primește o notificare de la Corona-Warn-App."</string> <!-- XACT: main (overview) - illustraction description, explanation image, displays notificatin status, inactive --> @@ -635,7 +635,7 @@ <!-- XTXT: settings(background priority) - explains user what to do on card if background priority is enabled --> <string name="settings_background_priority_card_body">"Dacă doriți să dezactivați activitatea în fundal cu prioritate, vă rugăm să faceți acest lucru din setările dispozitivului."</string> <!-- XBUT: settings(background priority) - go to operating system settings button on card --> - <string name="settings_background_priority_card_button">"Deschideți setările dispozitivului"</string> + <string name="settings_background_priority_card_button">"Deschideți Setările dispozitivului"</string> <!-- XHED : settings(background priority) - headline on card about the current status and what to do --> <string name="settings_background_priority_card_headline">"Dezactivați activitatea în fundal cu prioritate"</string> diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index b168dfbe7b2f4e09f4c4a125a840057e2b981e37..cbbf2355601dd9a69b9381672f3953fd5a05e618 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -278,7 +278,7 @@ <!-- XHED: App overview subtitle for glossary contact --> <string name="main_overview_subtitle_glossary_contact">"Exposures"</string> <!-- YTXT: App overview body for glossary contact --> - <string name="main_overview_body_glossary_contact">"Encounters over an extended period and in close proximity to a person diagnosed with COVID-19."</string> + <string name="main_overview_body_glossary_contact">"Encounters over a longer duration and close proximity to people diagnosed with COVID-19."</string> <!-- XHED: App overview subtitle for glossary notifications --> <string name="main_overview_subtitle_glossary_notification">"Exposure Notification"</string> <!-- YTXT: App overview body for glossary notifications --> diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/GoogleQuotaCalculatorTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/GoogleQuotaCalculatorTest.kt index 995ed675179badf7985d26df0104a4593f192d00..693e3187134d8ab3cf386ff3db761d9ff57da2b9 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/GoogleQuotaCalculatorTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/GoogleQuotaCalculatorTest.kt @@ -148,9 +148,7 @@ internal class GoogleQuotaCalculatorTest : BaseTest() { } } - assertThrows<IllegalArgumentException> { - classUnderTest.resetProgressTowardsQuota(defaultIncrementByAmountInTest + 1) - } + classUnderTest.resetProgressTowardsQuota(defaultIncrementByAmountInTest + 1) } @Test @@ -207,9 +205,7 @@ internal class GoogleQuotaCalculatorTest : BaseTest() { } val newProgressAfterReset = defaultQuotaLimitInTest + 1 - assertThrows<IllegalArgumentException> { - classUnderTest.resetProgressTowardsQuota(newProgressAfterReset) - } + classUnderTest.resetProgressTowardsQuota(newProgressAfterReset) assertEquals(true, classUnderTest.hasExceededQuota) assertEquals( (progressBeforeReset