Commit d41433d0 authored by stopcovid@lunabee.com's avatar stopcovid@lunabee.com
Browse files

Update to 2.2.7

- Maintenance add support for App Gallery
- Revamp change postale code
- Get positive isolation days from config
- Fix audio captcha not working in command mode
- Add warning and error logs in prod
- Fix too much notification
- Bar graph and average series
parent 25fa78e3
......@@ -13,6 +13,7 @@ package com.lunabeestudio.stopcovid.coreui.extension
import android.content.Intent
import android.net.Uri
import android.provider.Settings
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.lifecycle.LifecycleOwner
import androidx.navigation.NavController
......@@ -45,4 +46,7 @@ fun Fragment.viewLifecycleOwnerOrNull(): LifecycleOwner? =
} catch (e: IllegalStateException) {
Timber.e(e, "Failed to get lifecycle owner")
null
}
\ No newline at end of file
}
val Fragment.appCompatActivity: AppCompatActivity?
get() = activity as? AppCompatActivity
\ No newline at end of file
......@@ -88,6 +88,8 @@ internal class ApiConfiguration(
val isolationDuration: Long,
@SerializedName("app.postIsolation.duration")
val postIsolationDuration: Long,
@SerializedName("app.isolation.durationCovid")
val covidIsolationDuration: Long,
@SerializedName("app.venuesSalt")
val venuesSalt: Int,
@SerializedName("app.allowNoAdvertisingDevice")
......@@ -143,6 +145,7 @@ internal fun ApiConfiguration.toDomain(gson: Gson) = Configuration(
positiveSampleSpan = positiveSampleSpan,
isolationDuration = isolationDuration,
postIsolationDuration = postIsolationDuration,
covidIsolationDuration = covidIsolationDuration,
venuesSalt = venuesSalt,
allowNoAdvertisingDevice = allowNoAdvertisingDevice,
unsupportedDevices = gson.fromJson(
......
......@@ -77,6 +77,10 @@
<item name="android:textAllCaps">false</item>
</style>
<style name="Theme.StopCovid.Link.Normal">
<item name="android:textStyle">normal</item>
</style>
<style name="Theme.StopCovid.Link.Inverse">
<item name="android:textColor">?colorOnPrimary</item>
</style>
......
......@@ -47,6 +47,7 @@ class Configuration(
val positiveSampleSpan: Int,
val isolationDuration: Long,
val postIsolationDuration: Long,
val covidIsolationDuration: Long,
val venuesSalt: Int,
val allowNoAdvertisingDevice: Boolean,
val unsupportedDevices: List<String>?,
......
......@@ -43,6 +43,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import timber.log.Timber
import java.util.UUID
import java.util.concurrent.atomic.AtomicInteger
import kotlin.time.ExperimentalTime
import kotlin.time.seconds
......@@ -56,6 +57,7 @@ abstract class RobertProximityService : ProximityNotificationService() {
// Clear errors if the service is working as expected
protected var noNewErrorJob: Job? = null
private val nonCriticalErrorInARow = AtomicInteger(0)
// Help to distinguish between between error at the beginning of the service and after some time
protected var creationDate: Long = System.currentTimeMillis()
......@@ -215,6 +217,8 @@ abstract class RobertProximityService : ProximityNotificationService() {
val shouldRestartProximityService: Boolean =
robertManager.shouldReloadBleSettings
|| (RESTART_SERVICE_ON_EBID_CHANGE && validUntilTimeMs - System.currentTimeMillis() < 0L)
|| nonCriticalErrorInARow.get() > 0
Timber.v("shouldRestartProximityService = $shouldRestartProximityService; nonCriticalErrorInARow = $nonCriticalErrorInARow")
startWaitForErrorOrClear()
if (shouldRestartProximityService) {
restart()
......@@ -253,6 +257,8 @@ abstract class RobertProximityService : ProximityNotificationService() {
if (isActive) {
// No new error detected, we can clear the errors
clearErrorNotification()
nonCriticalErrorInARow.set(0)
Timber.v("Clear nonCriticalErrorInARow")
}
}
}
......@@ -293,12 +299,19 @@ abstract class RobertProximityService : ProximityNotificationService() {
}
}
protected fun shouldShowError(): Boolean {
val shouldShowError = nonCriticalErrorInARow.incrementAndGet() >= NON_CRITICAL_ERROR_BEFORE_NOTIFICATION
Timber.v("Incrementing nonCriticalErrorInARow = $nonCriticalErrorInARow; shouldShowError = $shouldShowError")
return shouldShowError
}
companion object {
private const val HELLO_REFRESH_MAX_DELAY_MS: Long = 30 * 1000
private const val CLEAR_ERROR_DELAY_MS: Long = 1 * 1000
private const val CLEAR_ERROR_DELAY_MS: Long = 3 * 1000
private const val RESTART_SERVICE_ON_EBID_CHANGE: Boolean = true
private const val FALLBACK_TX: Double = -6.52
private const val FALLBACK_RX: Double = -19.71
private const val NON_CRITICAL_ERROR_BEFORE_NOTIFICATION: Int = 5
}
}
......@@ -14,6 +14,7 @@ import androidx.lifecycle.LiveData
import com.lunabeestudio.domain.model.Configuration
import com.lunabeestudio.domain.model.HelloBuilder
import com.lunabeestudio.domain.model.LocalProximity
import com.lunabeestudio.domain.model.ServerStatusUpdate
import com.lunabeestudio.robert.manager.LocalProximityFilter
import com.lunabeestudio.robert.model.AtRiskStatus
import com.lunabeestudio.robert.model.RobertResult
......@@ -102,5 +103,7 @@ interface RobertManager {
suspend fun quitStopCovid(application: RobertApplication): RobertResult
suspend fun getSSU(prefix: Byte): RobertResultData<ServerStatusUpdate>
fun refreshAtRisk()
}
......@@ -471,7 +471,7 @@ class RobertManagerImpl(
localProximityRepository.save(*localProximity)
}
private suspend fun getSSU(prefix: Byte): RobertResultData<ServerStatusUpdate> {
override suspend fun getSSU(prefix: Byte): RobertResultData<ServerStatusUpdate> {
val ephemeralBluetoothIdentifier = ephemeralBluetoothIdentifierRepository.getForTime()
?: ephemeralBluetoothIdentifierRepository.getAll().lastOrNull()
......
......@@ -43,8 +43,8 @@ android {
applicationId "fr.gouv.android.stopcovid"
minSdkVersion 21
targetSdkVersion 30
versionCode 164
versionName "2.2.6"
versionCode 172
versionName "2.2.7"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
......@@ -59,7 +59,9 @@ android {
buildConfigField 'String', 'VACCINATION_CENTER_PATH', '"/infos/dep/"'
buildConfigField 'String', 'VACCINATION_CENTER_FILENAME', '"centres-vaccination.json"'
buildConfigField 'String', 'VACCINATION_CENTER_LAST_UPDATE_FILENAME', '"lastUpdate.json"'
buildConfigField 'String', 'APP_STORE_URL', '"https://play.google.com/store/apps/details?id=fr.gouv.android.stopcovid"'
buildConfigField 'String', 'PLAY_STORE_URL', '"market://details?id=fr.gouv.android.stopcovid"'
buildConfigField 'String', 'APP_GALLERY_URL', '"appmarket://details?id=fr.gouv.android.stopcovid"'
buildConfigField 'String', 'BONJOUR_WEBSITE_URL', '"https://bonjour.tousanticovid.gouv.fr"'
}
lintOptions {
......
......@@ -10,6 +10,7 @@ import org.junit.Before
import org.junit.Test
import java.security.KeyStore
import java.util.concurrent.TimeUnit
import kotlin.time.ExperimentalTime
class IsolationManagerTest {
......@@ -57,24 +58,30 @@ class IsolationManagerTest {
@Test
fun initCaseWithWarning() {
notifyWarning(7)
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INITIAL_CASE_AT_RISK_OR_SICK)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INITIAL_CASE_AT_RISK_OR_SICK
)
cancelNotifyWarning()
}
@Test
fun initCaseWithAtRisk() {
notifyRisk()
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INITIAL_CASE_AT_RISK_OR_SICK)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INITIAL_CASE_AT_RISK_OR_SICK
)
cancelNotifyRisk()
}
@Test
fun initCaseWithReport() {
report(1, true, 2)
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INITIAL_CASE_AT_RISK_OR_SICK)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INITIAL_CASE_AT_RISK_OR_SICK
)
cancelReport()
}
......@@ -84,8 +91,10 @@ class IsolationManagerTest {
assert(isolationManager.currentFormStateValue == IsolationFormStateEnum.ALL_GOOD) {
"current form state should be all good"
}
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.ALL_GOOD)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.ALL_GOOD
)
assert(isolationManager.currentIsolationEndDate == null) {
"current form state should be null"
}
......@@ -94,95 +103,145 @@ class IsolationManagerTest {
@Test
fun symptomsCase() {
isolationManager.updateState(IsolationFormStateEnum.SYMPTOMS)
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.SYMPTOMS)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.SYMPTOMS
)
isolationManager.setNegativeTest()
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.SYMPTOMS_TESTED)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.SYMPTOMS_TESTED
)
}
@Test
fun contactCaseUnknownIndexTested() {
contactCase()
isolationManager.setIsKnownIndexAtHome(false)
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.CONTACT_CASE_UNKNOWN_INDEX)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.CONTACT_CASE_UNKNOWN_INDEX
)
isolationManager.setNegativeTest()
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.CONTACT_CASE_POST_ISOLATION_PERIOD)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.CONTACT_CASE_POST_ISOLATION_PERIOD
)
}
@Test
fun contactCaseKnownIndexTested() {
contactCase()
isolationManager.setIsKnownIndexAtHome(true)
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.CONTACT_CASE_KNOWN_INDEX_NOT_TESTED)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.CONTACT_CASE_KNOWN_INDEX_NOT_TESTED
)
isolationManager.setNegativeTest()
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INDETERMINATE)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INDETERMINATE
)
isolationManager.setKnowsIndexSymptomsEndDate(false)
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.CONTACT_CASE_KNOWN_INDEX_TESTED_UNKNOWN_DATE)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.CONTACT_CASE_KNOWN_INDEX_TESTED_UNKNOWN_DATE
)
isolationManager.setKnowsIndexSymptomsEndDate(true)
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INDETERMINATE)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INDETERMINATE
)
setIndexEndSymptomDate()
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.CONTACT_CASE_KNOWN_INDEX_TESTED_KNOWN_DATE)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.CONTACT_CASE_KNOWN_INDEX_TESTED_KNOWN_DATE
)
setIndexEndSymptomDate(8)
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.CONTACT_CASE_POST_ISOLATION_PERIOD)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.CONTACT_CASE_POST_ISOLATION_PERIOD
)
setIndexEndSymptomDate(8 + 8)
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INITIAL_CASE_SAFE)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INITIAL_CASE_SAFE
)
}
@OptIn(ExperimentalTime::class)
@Test
fun positiveCaseNoSymptoms() {
positiveCase()
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INDETERMINATE)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INDETERMINATE
)
setPositiveTestingDate()
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INDETERMINATE)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INDETERMINATE
)
isolationManager.setIsHavingSymptoms(false)
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.POSITIVE_CASE_NO_SYMPTOMS)
setPositiveTestingDate(8)
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.POSITIVE_CASE_POST_ISOLATION_PERIOD)
setPositiveTestingDate(8 + 8)
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INITIAL_CASE_SAFE)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.POSITIVE_CASE_NO_SYMPTOMS
)
setPositiveTestingDate(11)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.POSITIVE_CASE_POST_ISOLATION_PERIOD
)
setPositiveTestingDate(11 + 8)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INITIAL_CASE_SAFE
)
}
@OptIn(ExperimentalTime::class)
@Test
fun positiveCaseWithSymptoms() {
positiveCase()
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INDETERMINATE)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INDETERMINATE
)
setPositiveTestingDate()
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INDETERMINATE)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INDETERMINATE
)
isolationManager.setIsHavingSymptoms(true)
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INDETERMINATE)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INDETERMINATE
)
setSymptomsStartDate()
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.POSITIVE_CASE_SYMPTOMS_DURING_ISOLATION)
setSymptomsStartDate(8)
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.POSITIVE_CASE_SYMPTOMS_AFTER_ISOLATION)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.POSITIVE_CASE_SYMPTOMS_DURING_ISOLATION
)
setSymptomsStartDate(11)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.POSITIVE_CASE_SYMPTOMS_AFTER_ISOLATION
)
isolationManager.setStillHavingFever(true)
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.POSITIVE_CASE_SYMPTOMS_AFTER_ISOLATION_STILL_HAVING_FEVER)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.POSITIVE_CASE_SYMPTOMS_AFTER_ISOLATION_STILL_HAVING_FEVER
)
isolationManager.setStillHavingFever(false)
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.POSITIVE_CASE_POST_ISOLATION_PERIOD)
setSymptomsStartDate(8 + 8)
assertState(isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INITIAL_CASE_SAFE)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.POSITIVE_CASE_POST_ISOLATION_PERIOD
)
setSymptomsStartDate(11 + 8)
assertState(
isolationManager.currentRecommendationState,
IsolationRecommendationStateEnum.INITIAL_CASE_SAFE
)
}
private fun assertState(has: IsolationRecommendationStateEnum, shouldHave: IsolationRecommendationStateEnum) {
......
......@@ -6,7 +6,11 @@
},
{
"name": "version",
"value": 26
"value": 29
},
{
"name": "versionCalibrationBle",
"value": 2
},
{
"name": "app.apiVersion",
......@@ -40,6 +44,10 @@
"name": "app.postIsolation.duration",
"value": 691200
},
{
"name": "app.isolation.durationCovid",
"value": 864000
},
{
"name": "app.displayRecordVenues",
"value": false
......@@ -146,7 +154,7 @@
},
{
"name": "app.allowNoAdvertisingDevice",
"value": false
"value": true
},
{
"name": "app.unsupportedDevices",
......
......@@ -475,7 +475,7 @@
"attestationsController.attestationWebSite": "موقع تحميل الإفادة",
"attestationsController.termsOfUse.alert.title": "شروط الاستعمال",
"attestationsController.termsOfUse.alert.message": "لا تخضع المعلومات التي يتم إدخالها في برنامج إصدار الإفادة لأي معالجة من طرف مسؤول تطبيق TousAntiCovid.",
"attestationsController.termsOfUse.url": "https://bonjour.tousanticovid.gouv.fr/privacy.html",
"attestationsController.termsOfUse.url": "https://bonjour.tousanticovid.gouv.fr/privacy-en.html#camera",
"newAttestationController.title": "إفادة جديدة",
"newAttestationController.generate": "إصدار الإفادة",
"newAttestationController.saveMyData": "حفظ بياناتي",
......@@ -731,7 +731,7 @@
"keyFigureDetailController.section.evolution.subtitle": "%@.\nDernière valeur du %@ : %@",
"keyFigureDetailController.section.evolution.subtitle2Charts": "%@.\nDernière valeur du %@ : %@ (France : %@)",
"home.activationExplanation.title": "Attention",
"home.activationExplanation.message": "Votre téléphone ne supportant pas l'advertising, TousAntiCovid va redémarrer le Bluetooth de votre téléphone régulièrement pour fonctionner",
"home.activationExplanation.message": "Votre téléphone ne supportant pas complètement le Bluetooth Low Energy (BLE), TousAntiCovid va redémarrer le Bluetooth de votre téléphone assez fréquemment pour fonctionner correctement.",
"accessibility.hint.keyFigure.chart.share": "Partager le graphique du chiffre clé",
"keyfigure.nombrevaccinations.learnMore":"Le nombre d’injections réalisées depuis le début de la campagne de vaccination est dorénavant dénombré par Vaccin Covid (au 26 janvier, 1 136 906 injections réalisées, dont 6 153 deuxièmes injections).\n\nAu 26 janvier, les données issues des Agences Régionales de Santé (ARS) faisaient état de 1 184 510 injections réalisées depuis le début de la campagne de vaccination. Cet écart constaté de 53 757 injections correspond aux injections effectuées mais non encore enregistrées dans Vaccin Covid, et qui seront progressivement rattrapées.",
......@@ -760,6 +760,8 @@
"error.cryptoIssue.explanation.register": "M'enregistrer",
"error.cryptoIssue.explanation.goToStore": "Aller sur le store",
"proximityController.error.noAdvertising": "Votre téléphone ne possédant pas le Bluetooth advertising, il n'est pas compatible avec l’alerte des personnes contacts via Bluetooth malheureusement.",
"common.privacyPolicy": "https://bonjour.tousanticovid.gouv.fr/privacy.html"
"common.privacyPolicy": "https://bonjour.tousanticovid.gouv.fr/privacy-en.html#camera",
"common.updatePostalCode":"Code postal: %@",
"common.updatePostalCode.end":"Changer"
}
......@@ -475,7 +475,7 @@
"attestationsController.attestationWebSite": "Website-Bescheinigung",
"attestationsController.termsOfUse.alert.title": "Nutzungsbedingungen",
"attestationsController.termsOfUse.alert.message": "Die in diesem Generator für die Erstellung von Bescheinigungen zur Vorlage bei einer Ausgangssperre eingegebenen Informationen werden von den Verantwortlichen der Applikation „TousAntiCovid‟ nicht weiter verarbeitet.",
"attestationsController.termsOfUse.url": "https://bonjour.tousanticovid.gouv.fr/privacy.html",
"attestationsController.termsOfUse.url": "https://bonjour.tousanticovid.gouv.fr/privacy-en.html#camera",
"newAttestationController.title": "Neue Bescheinigung",
"newAttestationController.generate": "Erstellen",
"newAttestationController.saveMyData": "Meine Daten speichern",
......@@ -731,7 +731,7 @@
"keyFigureDetailController.section.evolution.subtitle": "%@.\nDernière valeur du %@ : %@",
"keyFigureDetailController.section.evolution.subtitle2Charts": "%@.\nDernière valeur du %@ : %@ (France : %@)",
"home.activationExplanation.title": "Attention",
"home.activationExplanation.message": "Votre téléphone ne supportant pas l'advertising, TousAntiCovid va redémarrer le Bluetooth de votre téléphone régulièrement pour fonctionner",
"home.activationExplanation.message": "Votre téléphone ne supportant pas complètement le Bluetooth Low Energy (BLE), TousAntiCovid va redémarrer le Bluetooth de votre téléphone assez fréquemment pour fonctionner correctement.",
"accessibility.hint.keyFigure.chart.share": "Partager le graphique du chiffre clé",
"keyfigure.nombrevaccinations.learnMore":"Le nombre d’injections réalisées depuis le début de la campagne de vaccination est dorénavant dénombré par Vaccin Covid (au 26 janvier, 1 136 906 injections réalisées, dont 6 153 deuxièmes injections).\n\nAu 26 janvier, les données issues des Agences Régionales de Santé (ARS) faisaient état de 1 184 510 injections réalisées depuis le début de la campagne de vaccination. Cet écart constaté de 53 757 injections correspond aux injections effectuées mais non encore enregistrées dans Vaccin Covid, et qui seront progressivement rattrapées.",
......@@ -760,5 +760,7 @@
"error.cryptoIssue.explanation.register": "M'enregistrer",
"error.cryptoIssue.explanation.goToStore": "Aller sur le store",
"proximityController.error.noAdvertising": "Votre téléphone ne possédant pas le Bluetooth advertising, il n'est pas compatible avec l’alerte des personnes contacts via Bluetooth malheureusement.",
"common.privacyPolicy": "https://bonjour.tousanticovid.gouv.fr/privacy.html"
"common.privacyPolicy": "https://bonjour.tousanticovid.gouv.fr/privacy-en.html#camera",
"common.updatePostalCode":"Code postal: %@",
"common.updatePostalCode.end":"Changer"
}
......@@ -120,7 +120,7 @@
"common.yes": "Yes",
"common.no": "No",
"common.tryAgain": "Try again",
"common.needCameraAccessToScan": "The app needs to access the camera in order to scan the QR Code",
"common.needCameraAccessToScan": "The app needs to access the camera in order to scan the QR Code. You can also read our privacy policy regarding this camera permission.",
"common.needLocalisationAccessToScan": "The app needs access to your location in order to be able to scan neighbouring devices",
"common.settings": "Settings",
"common.permissionsNeeded": "Important message",
......@@ -550,8 +550,8 @@
"home.activation.sick.alert.message": "The alert for exposure to COVID-19 cannot be activated for 2 months after you declare yourself positive for COVID-19.\n\nFor 2 months after testing positive for COVID-19, you will not be considered as being \"at-risk of infection\".",
"common.error.secretKey": "Database encryption failure. Please try again or restart your phone.",
"home.venuesSection.title": "Locations",
"home.venuesSection.recordCell.title": "Scan a location QR code",
"home.venuesSection.recordCell.subtitle": "Record a history of all the locations you have been to",
"home.venuesSection.recordCell.title": "Scan a venue QR code",
"home.venuesSection.recordCell.subtitle": "Be alerted in case of exposure in a venue (currently being deployed)",
"home.venuesSection.privateCell.title": "Are you organising a private event?",
"home.venuesSection.privateCell.subtitle": "Protect your guests by creating your own code",
"home.moreSection.venuesHistory": "Location history",
......@@ -730,7 +730,7 @@
"keyFigureDetailController.section.evolution.subtitle": "%@.\nDernière valeur du %@ : %@",
"keyFigureDetailController.section.evolution.subtitle2Charts": "%@.\nDernière valeur du %@ : %@ (France : %@)",
"home.activationExplanation.title": "Attention",
"home.activationExplanation.message": "Votre téléphone ne supportant pas l'advertising, TousAntiCovid va redémarrer le Bluetooth de votre téléphone régulièrement pour fonctionner",
"home.activationExplanation.message": "Votre téléphone ne supportant pas complètement le Bluetooth Low Energy (BLE), TousAntiCovid va redémarrer le Bluetooth de votre téléphone assez fréquemment pour fonctionner correctement.",
"accessibility.hint.keyFigure.chart.share": "Partager le graphique du chiffre clé",
"keyfigure.nombrevaccinations.learnMore":"Le nombre d’injections réalisées depuis le début de la campagne de vaccination est dorénavant dénombré par Vaccin Covid (au 26 janvier, 1 136 906 injections réalisées, dont 6 153 deuxièmes injections).\n\nAu 26 janvier, les données issues des Agences Régionales de Santé (ARS) faisaient état de 1 184 510 injections réalisées depuis le début de la campagne de vaccination. Cet écart constaté de 53 757 injections correspond aux injections effectuées mais non encore enregistrées dans Vaccin Covid, et qui seront progressivement rattrapées.",
......@@ -759,6 +759,8 @@
"error.cryptoIssue.explanation.register": "M'enregistrer",
"error.cryptoIssue.explanation.goToStore": "Aller sur le store",
"proximityController.error.noAdvertising": "Votre téléphone ne possédant pas le Bluetooth advertising, il n'est pas compatible avec l’alerte des personnes contacts via Bluetooth malheureusement.",
"common.privacyPolicy": "https://bonjour.tousanticovid.gouv.fr/privacy.html"
"common.privacyPolicy": "https://bonjour.tousanticovid.gouv.fr/privacy-en.html#camera",
"common.updatePostalCode":"Code postal: %@",
"common.updatePostalCode.end":"Changer"
}
......@@ -475,7 +475,7 @@
"attestationsController.attestationWebSite": "\nSitio web “Declaración”",
"attestationsController.termsOfUse.alert.title": "Condiciones de uso",
"attestationsController.termsOfUse.alert.message": "Los datos introducidos en este generador de declaración responsable de desplazamiento no recibirán ningún tratamiento por parte de los administradores de la aplicación “TousAntiCovid”.",
"attestationsController.termsOfUse.url": "https://bonjour.tousanticovid.gouv.fr/privacy.html",
"attestationsController.termsOfUse.url": "https://bonjour.tousanticovid.gouv.fr/privacy-en.html#camera",
"newAttestationController.title": "Nueva declaración responsable",
"newAttestationController.generate": "Generar",
"newAttestationController.saveMyData": "Guardar mis datos",
......@@ -730,7 +730,7 @@
"keyFigureDetailController.section.evolution.subtitle": "%@.\nDernière valeur du %@ : %@",
"keyFigureDetailController.section.evolution.subtitle2Charts": "%@.\nDernière valeur du %@ : %@ (France : %@)",
"home.activationExplanation.title": "Attention",
"home.activationExplanation.message": "Votre téléphone ne supportant pas l'advertising, TousAntiCovid va redémarrer le Bluetooth de votre téléphone régulièrement pour fonctionner",
"home.activationExplanation.message": "Votre téléphone ne supportant pas complètement le Bluetooth Low Energy (BLE), TousAntiCovid va redémarrer le Bluetooth de votre téléphone assez fréquemment pour fonctionner correctement.",
"accessibility.hint.keyFigure.chart.share": "Partager le graphique du chiffre clé",
"keyfigure.nombrevaccinations.learnMore":"Le nombre d’injections réalisées depuis le début de la campagne de vaccination est dorénavant dénombré par Vaccin Covid (au 26 janvier, 1 136 906 injections réalisées, dont 6 153 deuxièmes injections).\n\nAu 26 janvier, les données issues des Agences Régionales de Santé (ARS) faisaient état de 1 184 510 injections réalisées depuis le début de la campagne de vaccination. Cet écart constaté de 53 757 injections correspond aux injections effectuées mais non encore enregistrées dans Vaccin Covid, et qui seront progressivement rattrapées.",
......@@ -759,6 +759,8 @@
"error.cryptoIssue.explanation.register": "M'enregistrer",
"error.cryptoIssue.explanation.goToStore": "Aller sur le store",
"proximityController.error.noAdvertising": "Votre téléphone ne possédant pas le Bluetooth advertising, il n'est pas compatible avec l’alerte des personnes contacts via Bluetooth malheureusement.",
"common.privacyPolicy": "https://bonjour.tousanticovid.gouv.fr/privacy.html"
"common.privacyPolicy": "https://bonjour.tousanticovid.gouv.fr/privacy-en.html#camera",
"common.updatePostalCode":"Code postal: %@",
"common.updatePostalCode.end":"Changer"
}
......@@ -730,7 +730,7 @@
"keyFigureDetailController.section.evolution.subtitle": "%@.\nDernière valeur du %@ : %@",
"keyFigureDetailController.section.evolution.subtitle2Charts": "%@.\nDernière valeur du %@ : %@ (France : %@)",
"home.activationExplanation.title": "Attention",
"home.activationExplanation.message": "Votre téléphone ne supportant pas l'advertising, TousAntiCovid va redémarrer le Bluetooth de votre téléphone régulièrement pour fonctionner",
"home.activationExplanation.message": "Votre téléphone ne supportant pas complètement le Bluetooth Low Energy (BLE), TousAntiCovid va redémarrer le Bluetooth de votre téléphone assez fréquemment pour fonctionner correctement.",
"accessibility.hint.keyFigure.chart.share": "Partager le graphique du chiffre clé",
"keyfigure.nombrevaccinations.learnMore":"Le nombre d’injections réalisées depuis le début de la campagne de vaccination est dorénavant dénombré par Vaccin Covid (au 26 janvier, 1 136 906 injections réalisées, dont 6 153 deuxièmes injections).\n\nAu 26 janvier, les données issues des Agences Régionales de Santé (ARS) faisaient é