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

Update to 3.7.7

- Migration from ECDH to EC
- Remove unused captchaApiKey
- Serialisation of refresh config calls
parent 037b6b2e
......@@ -12,7 +12,6 @@ package com.lunabeestudio.stopcovid.coreui
enum class EnvConstant {
Prod {
override val captchaApiKey: String = "6LettPsUAAAAAHYaFdRBOilHUgmTMSIPKNZN4D7l"
override val baseUrl: String = "https://api.tousanticovid.gouv.fr"
override val cleaStatusBaseUrl: String = "https://s3.fr-par.scw.cloud/clea-batch/"
override val cleaReportBaseUrl: String = "https://signal-api.tousanticovid.gouv.fr/"
......@@ -25,7 +24,6 @@ enum class EnvConstant {
override val conversionBaseUrl: String = "https://portail.tacv.myservices-ingroupe.com"
};
abstract val captchaApiKey: String
abstract val baseUrl: String
abstract val cleaStatusBaseUrl: String
abstract val cleaReportBaseUrl: String
......
......@@ -33,6 +33,7 @@ import javax.crypto.spec.SecretKeySpec
object CryptoUtils {
private const val HASH_HMACSHA256 = "HmacSHA256"
private const val NAMED_CURVE_SPEC = "secp256r1"
private const val ALGORITHM_EC = "EC"
private const val ALGORITHM_ECDH = "ECDH"
private const val ALGORITHM_AES = "AES"
......@@ -44,7 +45,7 @@ object CryptoUtils {
internal fun generateKey(privateKey: PrivateKey, encodedPublicKey: String): ByteArray {
val bouncyCastleProvider = BouncyCastleProvider()
val keyFactory = KeyFactory.getInstance(ALGORITHM_ECDH, bouncyCastleProvider)
val keyFactory = KeyFactory.getInstance(ALGORITHM_EC, bouncyCastleProvider)
val publicKey = keyFactory.generatePublic(X509EncodedKeySpec(Base64.decode(encodedPublicKey, Base64.NO_WRAP)))
val keyAgreement = KeyAgreement.getInstance(ALGORITHM_ECDH)
......@@ -107,7 +108,7 @@ object CryptoUtils {
internal fun generateEcdhKeyPair(): KeyPair {
val ecSpec: ECParameterSpec = ECNamedCurveTable.getParameterSpec(NAMED_CURVE_SPEC)
val bouncyCastleProvider = BouncyCastleProvider()
val keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM_ECDH, bouncyCastleProvider)
val keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM_EC, bouncyCastleProvider)
keyPairGenerator.initialize(ecSpec, SecureRandom())
return keyPairGenerator.genKeyPair()
}
......
......@@ -36,7 +36,7 @@ class BouncyCastleCryptoDataSource : SharedCryptoDataSource {
override fun createECDHKeyPair(): KeyPair {
val ecSpec: ECParameterSpec = ECNamedCurveTable.getParameterSpec(NAMED_CURVE_SPEC)
val bouncyCastleProvider = BouncyCastleProvider()
val keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM_ECDH, bouncyCastleProvider)
val keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM_EC, bouncyCastleProvider)
keyPairGenerator.initialize(ecSpec, SecureRandom())
return keyPairGenerator.generateKeyPair()
}
......@@ -47,7 +47,7 @@ class BouncyCastleCryptoDataSource : SharedCryptoDataSource {
derivationDataArray: List<ByteArray>,
): List<ByteArray> {
val bouncyCastleProvider = BouncyCastleProvider()
val keyFactory = KeyFactory.getInstance(ALGORITHM_ECDH, bouncyCastleProvider)
val keyFactory = KeyFactory.getInstance(ALGORITHM_EC, bouncyCastleProvider)
val serverPublicKey = keyFactory.generatePublic(X509EncodedKeySpec(rawServerPublicKey))
val localPrivateKey = keyFactory.generatePrivate(PKCS8EncodedKeySpec(rawLocalPrivateKey))
......@@ -107,6 +107,7 @@ class BouncyCastleCryptoDataSource : SharedCryptoDataSource {
companion object {
private const val HASH_HMACSHA256 = "HmacSHA256"
private const val NAMED_CURVE_SPEC = "secp256r1"
private const val ALGORITHM_EC = "EC"
private const val ALGORITHM_ECDH = "ECDH"
private const val ALGORITHM_AES = "AES"
......
......@@ -46,8 +46,8 @@ android {
applicationId "fr.gouv.android.stopcovid"
minSdkVersion 21
targetSdkVersion 30
versionCode 360
versionName "3.7.6"
versionCode 362
versionName "3.7.7"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
......
[
"7459877044d92cea191246d36b84de1c357dc583d7b499be16eb291a4eb317f1",
"829d46117e8008cd7ded8e568c9ab3cb7a2426acb8fa48d49fa59954e3c11e26",
"b3c08d702e1a580db02ab3cffdf4177e32f634bc40a3dc8423dadf99c1db74d6"
"b3c08d702e1a580db02ab3cffdf4177e32f634bc40a3dc8423dadf99c1db74d6",
"dac376c09c5786a749c05cf5c8228a9297fa536cfe1b03ec6126fae6c28dcc04"
]
\ No newline at end of file
{
"Qw0ebn8uT4I=":[
"MIIBuTCCAV+gAwIBAgIUQh9NvF/N7YLywPQu2hMDH7diJDswCgYIKoZIzj0EAwIwMjELMAkGA1UEBhMCRlIxEzARBgNVBAgMClNvbWUtU3RhdGUxDjAMBgNVBAoMBUlucmlhMB4XDTIxMDkxNzA4NDc0MVoXDTIyMDkxNzA4NDc0MVowMjELMAkGA1UEBhMCRlIxEzARBgNVBAgMClNvbWUtU3RhdGUxDjAMBgNVBAoMBUlucmlhMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEUOXG+vMbzpzkd0rmpI8erYChwTWSPcnAEo93BiH28hAQ+WyuhmClWS6q6FM5t9DM97M+njCQaqriBQ3ktH0eVKNTMFEwHQYDVR0OBBYEFJTXu8S7on3rCKCQM4X8rFJbhzfbMB8GA1UdIwQYMBaAFJTXu8S7on3rCKCQM4X8rFJbhzfbMA8GA1UdEwEB/wQFMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgS5ehGSZaxyOiWd5QFJrEibYVExjVxzrtgQ1gOF0pTJ0CIQCnHnf0ppeEhX5KjhMB8rKzzR/Xdu5lU+JrrF+tLZL7EA=="
],
"fGLuvg6n5wk=":[
"MIIEGzCCAgOgAwIBAgIUNWO7+/2lmGQGT1cep5petfsOFocwDQYJKoZIhvcNAQELBQAwMjELMAkGA1UEBhMCRlIxDTALBgNVBAoMBEdvdXYxFDASBgNVBAMMC0NTQ0EtRlJBTkNFMB4XDTIxMDYxNDIyMDAwMFoXDTIzMDYxNDIyMDAwMFowRTELMAkGA1UEBhMCRlIxDTALBgNVBAoMBENOQU0xEjAQBgNVBAsMCTE4MDAzNTAyNDETMBEGA1UEAwwKRFNDX0ZSXzAxOTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCJiBWroM8AeX/1cn0Nyk300qLpMAD1UoB2Vq7a3No+BbgFKcPzm0ZwPaQYzfx3VHNc3JfUjv77AhJx5F4cY8+GjgeAwgd0wHQYDVR0OBBYEFF6mKwOiAheaIxTCkdVKd8zgd7urMB8GA1UdIwQYMBaAFL6KLtbJ+SBOOicDCJdN7P3ZfcXmMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMC0GA1UdHwQmMCQwIqAgoB6GHGh0dHA6Ly9hbnRzLmdvdXYuZnIvY3NjYV9jcmwwGAYDVR0gBBEwDzANBgsqgXoBgUgfAwkBATA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAKGGGh0dHBzOi8vYW50LmdvdXYuZnIvY3NjYTANBgkqhkiG9w0BAQsFAAOCAgEAu8BaLZXFj9/e2/a59mBrOhY2m5SpcAoayxF3zOkIOt7LNX0QqHuomOyGLHMnAhNALgS2vhDXD0hhs96ZcKaystlMePpYsVRyaYa53GwMrGHiLwFxH5qQNClCcktAP++wCcdQXzTyZOn9/GNdmquW1PNMLPCEfqlnzWawdpITr+CYMXa9R5BEMmdX19F41HcoPRn9/X2uHW/ONmBywTwJ3s0U8F5HF21buZtxVDvX4ey+qINBru4MiGwgRCsklS9kDbl3ODUox0lwhs2VgQzqjALF4xYgsdN2LJezrwAiL8GMRAenmX9eDdgzMGnjKFT6yW8BCrPsyUnM15RAou3BrwIp6oxXHnR8wbeKG7pzZZY1J4zk4yYyihwxguWbUZGksJsNAQoNdNHBZtc8a7Oj5onLyUIetd7ELXxdk8uy7WVFeye5V8qJRhWrFyhWWFscQeY8GktefXiGEh6fxGfRU5R5b0PznxfMiA3olad3s17dr+jzqCM/hcY2FmUTjYrSrAyrhHdmCYIJ3US71If74UeMs6NZnQRRiu3tbAX+TiDOHsEHEIOHldbyQqFfclyiC26fHTqcNfIAxXPmPDQ1jpEmhRjFDlOWHoSnzsGZi/wa1kmSb6+2uHgUP/C/O2oi+yAk8GpwpEi8Sgv+HH/p7z0ympQK8IUOG/4K3/urdto="
],
......
......@@ -121,8 +121,20 @@
"value":false
},
{
"name":"app.activityPass.minRemainingHoursToRegenerate",
"value":4.0
"name": "app.activtyPass.autoRenewable",
"value": false
},
{
"name": "app.activityPass.skipNegTestHours",
"value": 48
},
{
"name": "app.activityPass.generationServerPublicKey",
"value": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEbW1CsREnlCkmZIzpX/D3jBB5ok5shbIYSHCpE/1Q0QqY2JmfpS2qlPLYJcu7Ouc7YNRXT+c3uTtv1Drokzf+oA=="
},
{
"name": "app.activityPass.renewThreshold",
"value": 3
},
{
"name":"app.wallet.maxCertBeforeWarning",
......@@ -570,4 +582,4 @@
]
}
]
}
\ No newline at end of file
}
......@@ -105,7 +105,7 @@
"notification.channel.atRisk.title":"Risk of exposure to COVID-19",
"manageDataController.title":"Settings",
"manageDataController.eraseLocalHistory.title":"My \"Bluetooth contacts\" data",
"manageDataController.eraseLocalHistory.subtitle":"This will delete all of the information on \"Bluetooth contacts \" stored on your phone.",
"manageDataController.eraseLocalHistory.subtitle":"This action will delete all of the information on \"Bluetooth contacts \" stored on your phone.",
"manageDataController.eraseLocalHistory.button":"Delete on my phone",
"manageDataController.eraseLocalHistory.success":"Data successfully deleted",
"manageDataController.eraseLocalHistory.confirmationDialog.title":"Confirmation",
......@@ -580,9 +580,9 @@
"home.vaccinationSection.cellSubtitle":"Tap to find a center nearby to get vaccinated.",
"vaccinationController.title":"Vaccination",
"vaccinationController.eligibility.title":"When is my vaccination schedule complete?",
"vaccinationController.eligibility.subtitle":"- 7 days after the last injection for double injection vaccines (Pfizer, Moderna, AstraZeneca), including if you received 1 single injection after being infected with Covid-19\n\n- 28 days after the injection for vaccines with a single injection (Johnson & Johnson)",
"vaccinationController.eligibility.buttonTitle":"More on vaccination",
"vaccinationController.eligibility.url":"https://solidarites-sante.gouv.fr/grands-dossiers/vaccin-covid-19/je-suis-un-particulier/",
"vaccinationController.eligibility.subtitle":"- 7 days after the last injection for double injection vaccines (Pfizer, Moderna, AstraZeneca), including if you received 1 single injection after being infected with Covid-19\n\n- 28 days after the injection for vaccines with a single injection (Johnson & Johnson).\n\n👉 Am I eligible for the 3rd dose?\n\nPeople eligible for a vaccination booster are the following:\n- People 65 years and over\n- Ehpad residents\n- People with comorbidities increasing the risk of severe forms of Covid-19\n- People with severe immunosuppression\n- People vaccinated with the Janssen vaccine.",
"vaccinationController.eligibility.buttonTitle":"Learn more about the booster dose",
"vaccinationController.eligibility.url":"https://mesconseilscovid.sante.gouv.fr/je-veux-me-faire-vacciner.html#devrai-je-recevoir-une-dose-de-rappel-dite-3-e-dose",
"vaccinationController.vaccinationLocation.buttonTitle":"Open Santé.fr",
"vaccinationController.vaccinationLocation.url":"https://www.sante.fr/cf/centres-vaccination-covid.html?source=TousAntiCovid",
"contactUs.url":"https://bonjour.tousanticovid.gouv.fr/contact.html",
......@@ -1135,27 +1135,22 @@
"vaccineCompletionController.footer.notifyAndFavorite": "By tapping this button, you will receive a notification on %@, and this certificate will be added as a favorite ❤️ in your TousAntiCovid wallet.",
"activityPass.fullscreen.title": "Pass Activité",
"activityPass.fullscreen.explanation": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n\nUt enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"activityPass.fullscreen.explanation": "À partir de ce certificat, vous pouvez générer un certificat à destination des activités sur le territoire français 🇫🇷.\n\nCe certificat permet de limiter les données du certificat au strict minimum.\n\nAttention, vous avez besoin d’internet pour générer ce certificat. Si vous êtes dans l’incapacité de le générer, le certificat dans l'onglet “Frontière” fonctionnera également.",
"activityPass.fullscreen.readMore": "Learn more",
"activityPass.fullscreen.readMore.url": "",
"activityPass.fullscreen.unavailable.alert.title": "Unavailable",
"activityPass.fullscreen.unavailable.alert.message": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"activityPass.fullscreen.notYet.alert.title": "Not yet",
"activityPass.fullscreen.notYet.alert.message": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"activityPass.fullscreen.unavailable.alert.message": "Votre connexion ou le service de génération de Pass Activité ne sont pas disponibles.\n\nVous pouvez utiliser le certificat dans l'onglet \"Frontière\".",
"activityPass.fullscreen.button.generate": "Create a Pass Activité",
"europeanCertificate.fullscreen.type.activityPass": "Pass Activité",
"activityPass.fullscreen.switch.autoRenewal": "Auto renew",
"activityPass.fullscreen.switch.autoRenewal.footer": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"activityPass.fullscreen.validFor": "Valid for %@",
"activityPass.fullscreen.validFor": "Renewed in %@",
"activityPass.fullscreen.validFor.timeFormat": "%dh%dmin",
"activityPass.fullscreen.validFor.timeFormat.hoursMinutes": "%dh%dmin",
"activityPass.fullscreen.validFor.timeFormat.minutes": "%dmin",
"activityPass.fullscreen.validFor.timeFormat.lessThanAMinute": "< 1min",
"activityPass.fullscreen.validFor.timeFormat.lessThanAMinute": "less than a minute",
"activityPassParametersController.title": "Pass Activité",
"activityPassParametersController.switch.notifyMe": "Notify me",
"activityPassParametersController.button.readCGU": "Read the T&C",
"activityPassParametersController.doYouConfirm" : "Do you confirm the creation of a Pass Activité?",
"activityPassParametersController.explanations" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n\nUt enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"activityPassParametersController.explanations" : "Concernant les traitements de données, veuillez vous référer aux conditions générales d'utilisation (CGU).\n\nVotre pass activité se renouvellera toutes les 48h automatiquement, sans intervention de votre part. En cas d'indisponibilité, utilisez le QR Code dans l'onglet \"Frontière\".",
"walletQuantityWarningController.title": "WARNING",
"walletQuantityWarningController.explanation": "The use of TousAntiCovid Wallet is unusual. You have exceeded 15 certificates.\n\n👉 If you are a professional, it is forbidden to use TousAntiCovid to check health passes, under penalty of prosecution (up to 3 years in prison and 45,000 euros fine).\n\nYou must use TousAntiCovid Verif available on the Stores.\n\n👉 If you are an individual, it is recommended to delete some of your certificates which are no longer useful (for example old negative tests).",
......@@ -1180,6 +1175,42 @@
"wallet.autotest.warning": "⚠️ The supervised self-tests are only valid on French territory as part of the \"activity pass\".",
"wallet.expired.pillTitle": "Expired",
"keyFigureChartController.zoomOut": "Zoom out",
"vaccineCompletionController.noWait.explanation.body": "⚠️ En cas de problème pendant la vérification, veuillez présenter le certificat %@ doses."
"vaccineCompletionController.noWait.explanation.body": "⚠️ If there is any problem during verification, please present the certificate with %@ doses.",
"rating.alert.title" : "Do you like TousAntiCovid?",
"rating.alert.message" : "You can review the app on the Store",
"widget.dcc.activityPass": "Pass Activité 🇫🇷.\nRenew: %@ à %@",
"manageDataController.activityPass.button": "Pass Activité",
"manageDataController.walletDataAndActivityPass.title":"My certificates",
"manageDataController.walletDataAndActivityPass.subtitle":"This will erase all your test and vaccination certificates from your phone. You can also activate / deactivate the automatic generation of Pass Activité for your eligible certificates.",
"activityPass.fullscreen.renew.alert.title": "Activation",
"activityPass.fullscreen.renew.alert.message": "You can activate the automatic generation of the Pass Activité for all your other valid certificates.\n\nYou can also deactivate this configuration in the application settings.",
"common.activate": "Activate",
"common.show": "Display",
"activityPass.fullscreen.notValid.message": "This certificate is not eligible for the Pass Activité 48h.",
"activityPass.fullscreen.notAvailable.message": "Your Pass Activité for this certificate will be available from %@",
"activityPass.fullscreen.notAvailable.footer.notify": "By taping this button, you will receive a notification on %@",
"activityPass.fullscreen.notAvailable.button.notify.title": "Notify me",
"android.db.error": "Unable to decrypt the content of the database. Please restart your phone.\n\nIf the problem persists, you can help the technical team to fix the problem by contacting the support team through the app settings.",
"android.migration.error": "Migration of old data could not be completed.\n\nIf the problem persists, you can help the technical team to fix the problem by contacting the support team through the app settings.",
"manageDataController.logs.subject": "Partage des fichiers de logs TAC",
"manageDataController.logs.clip": "Fichiers de logs",
"manageDataController.logs.email": "contact@tousanticovid.gouv.fr",
"widget.dcc.full.activityPass":"Tap to generate your Pass Activité",
"widget.dcc.upToDate":"Widget up to date!",
"activityPassParametersController.cguUrl": "https://bonjour.tousanticovid.gouv.fr/privacy.html#activitypass",
"robertStatus.error.alert.title": "Please read",
"robertStatus.error.alert.message": "For security reasons, after being inactive for several days, you will have to register again in the application",
"robertStatus.error.alert.action": "Register",
"robertStatus.error.alert.later": "Later",
"activityPass.fullscreen.upToDate": "Widget up to date!",
"activityPass.fullscreen.serverUnavailable.message": "Your internet connection or the Pass Activité generation service are not available.\n\nThe generation will be done automatically when the service is available, or you can try again now.\n\n👉 You can use the certificate in the \"Border\" section for pass verification.",
"activityPass.fullscreen.alreadyGenerating.alert.title": "On-going",
"activityPass.fullscreen.alreadyGenerating.alert.message": "The generation of your Pass Activité is already on-going. Thanks for your patience.",
"activityPass.notification.title": "Pass Activité is now available",
"activityPass.notification.message": "Your Pass Activité is now available in TousAntiCovid!"
}
......@@ -288,7 +288,7 @@
"keyFiguresController.section.app":"Appli TousAntiCovid",
"common.thousandsSeparator":" ",
"common.justNow":"À l'instant",
"keyfigure.dailyUpdates":"Mis à jour quotidiennement",
"keyfigure.dailyUpdates":"Mis à jour quotidiennement (sauf WE)",
"home.moreSection.curfewCertificate":"Attestation de déplacement",
"home.moreSection.curfewCertificate.url":"https://media.interieur.gouv.fr/attestation-deplacement-derogatoire-covid-19/",
"home.infoSection.newPostalCode":"Situation sanitaire locale",
......@@ -545,9 +545,9 @@
"home.vaccinationSection.cellSubtitle":"Appuyez pour trouver un centre près de chez vous pour vous faire vacciner.",
"vaccinationController.title":"Vaccination",
"vaccinationController.eligibility.title":"À partir de quand mon schéma vaccinal est-il complet ?",
"vaccinationController.eligibility.subtitle":"- 7 jours après la dernière injection pour les vaccins à double injection (Pfizer, Moderna, AstraZeneca), y compris si vous avez reçu 1 seule injection après avoir été infecté par la Covid-19\n\n- 28 jours après l'injection pour les vaccins avec une seule injection (Johnson & Johnson)",
"vaccinationController.eligibility.buttonTitle":"En savoir plus sur la vaccination",
"vaccinationController.eligibility.url":"https://solidarites-sante.gouv.fr/grands-dossiers/vaccin-covid-19/je-suis-un-particulier/",
"vaccinationController.eligibility.subtitle":"- 7 jours après la dernière injection pour les vaccins à double injection (Pfizer, Moderna, AstraZeneca), y compris si vous avez reçu 1 seule injection après avoir été infecté par la Covid-19\n\n- 28 jours après l'injection pour les vaccins avec une seule injection (Johnson & Johnson)\n\n👉 Suis-je éligible à la 3e dose ?\n\nLes personnes éligibles à un rappel vaccinal sont les suivantes :\n- Les 65 ans et plus\n- Les résidents des Ehpad\n- Les personnes avec des comorbidités augmentant le risque de formes graves de Covid-19\n- Les personnes sévèrement immunodéprimées\n- Les personnes vaccinées avec le vaccin Janssen.",
"vaccinationController.eligibility.buttonTitle":"En savoir plus sur la dose de rappel",
"vaccinationController.eligibility.url":"https://mesconseilscovid.sante.gouv.fr/je-veux-me-faire-vacciner.html#devrai-je-recevoir-une-dose-de-rappel-dite-3-e-dose",
"vaccinationController.vaccinationLocation.buttonTitle":"Aller sur Santé.fr",
"vaccinationController.vaccinationLocation.url":"https://www.sante.fr/cf/centres-vaccination-covid.html?source=TousAntiCovid",
"contactUs.url":"https://bonjour.tousanticovid.gouv.fr/contact.html",
......@@ -555,7 +555,7 @@
"keyfigure.nombrevaccinationscomplet.colorCode.dark":"#00B92E",
"keyfigure.nombrevaccinationscomplet.label":"Total vaccinations terminées",
"keyfigure.nombrevaccinationscomplet.shortLabel":"Vaccinations terminées",
"keyfigure.nombrevaccinationscomplet.description":"Cet indicateur représente le nombre total de personnes totalement vaccinées (personnes ayant reçu toutes leurs doses).\nLes données sont consolidées le lendemain de leur remontée pour tenir compte des dernières données de vaccination de la veille au soir.",
"keyfigure.nombrevaccinationscomplet.description":"⚠️ Suite à un problème technique sur les données de vaccination, toutes les données ne peuvent être mises à jour. Le problème est en cours de résolution.\n\nCet indicateur représente le nombre total de personnes totalement vaccinées (personnes ayant reçu toutes leurs doses).\nLes données sont consolidées le lendemain de leur remontée pour tenir compte des dernières données de vaccination de la veille au soir.",
"enterCodeController.alert.expiredCode.title":"Expiré",
"enterCodeController.alert.expiredCode.message":"Votre présence dans ce lieu date de plus de 15 jours. Il n'est donc plus utile d'un point de vue sanitaire de l'ajouter à votre historique.",
"keyFigureDetailController.section.evolution.title":"Evolution",
......@@ -768,7 +768,7 @@
"walletController.documents.vaccin":"Attestation de vaccin",
"walletController.documents.test":"Résultat de test",
"walletController.whenToUse.title":"Pass sanitaire : quand et comment ?",
"walletController.whenToUse.subtitle":"Selon le décret du 7 août 2021, les certificats de test ou de vaccination devront être présentés en France pour les lieux et activités soumis au pass sanitaire sur le territoire français.\n\n⚠️ Tout usage détourné du certificat relève d’une pratique délictueuse, de faux ou d’usage de faux, sanctionnée par le code pénal (45 000 euros et 3 ans de prison).\n\nDans le cadre du pass sanitaire conditionnant l'accès à ces lieux et activités en France 🇫🇷, il est accepté :\n\n👉 un certificat de vaccination complet (toutes les doses nécessaires) et réalisé il y a plus de 1 semaine pour tous les vaccins, sauf Janssen/Johnson & Johnson pour lequel c’est 4 semaines.\n\n👉 un certificat de test RT-PCR ou antigénique négatif de moins de 72h (à partir du 9 août 2021)\n\n👉 un certificat de test RT-PCR ou antigénique positif, datant d'au moins 11 jours et de moins de 6 mois.\n\nPour les voyages et les conditions de validité du pass sanitaire par pays, plus d'information sur le lien suivant 👇",
"walletController.whenToUse.subtitle":"Selon le décret du 7 août 2021, les certificats de test ou de vaccination devront être présentés en France pour les lieux et activités soumis au pass sanitaire sur le territoire français.\n\n⚠️ Tout usage détourné du certificat relève d’une pratique délictueuse, de faux ou d’usage de faux, sanctionnée par le code pénal (45 000 euros et 3 ans de prison).\n\nDans le cadre du pass sanitaire conditionnant l'accès à ces lieux et activités en France 🇫🇷, il est accepté :\n\n👉 un certificat de vaccination complet (toutes les doses nécessaires) et réalisé il y a plus de 1 semaine pour tous les vaccins, sauf Janssen/Johnson & Johnson pour lequel c’est 4 semaines.\n\n👉 un certificat de test RT-PCR ou antigénique négatif de moins de 72h.\n\n👉 un certificat de test RT-PCR ou antigénique positif, datant d'au moins 11 jours et de moins de 6 mois.\n\nPour les voyages et les conditions de validité du pass sanitaire par pays, plus d'information sur le lien suivant 👇",
"walletController.whenToUse.button":"Infos voyages",
"walletController.whenToUse.url":"https://bonjour.tousanticovid.gouv.fr/voyager.html",
"walletController.phone.title":"Besoin d'aide ?",
......@@ -916,7 +916,7 @@
"keyfigure.couvcompletvaccination.label":"Couverture vaccinale",
"keyfigure.couvcompletvaccination.shortLabel":"Couverture vaccinale",
"keyfigure.couvcompletvaccination.description":"Cet indicateur reflète la part de la population vaccinée de plus de 12 ans avec un schéma complet (l'ensemble des doses nécessaires).\n\n👉 Changement le 24 juillet : cet indicateur porte désormais sur la population vaccinée de plus de 12 ans.",
"keyfigure.couvcompletvaccination.description":"⚠️ Suite à un problème technique sur les données de vaccination, toutes les données ne peuvent être mises à jour. Le problème est en cours de résolution.\n\nCet indicateur reflète la part de la population vaccinée de plus de 12 ans avec un schéma complet (l'ensemble des doses nécessaires).\n\n👉 Changement le 24 juillet : cet indicateur porte désormais sur la population vaccinée de plus de 12 ans.",
"keyfigure.couvcompletvaccination.colorCode.light":"#18B1BF",
"keyfigure.couvcompletvaccination.colorCode.dark":"#72E1EB",
"common.skip":"Passer",
......@@ -970,7 +970,7 @@
"keyfigure.nombrevaccinations.colorCode.dark":"#0B84FF",
"keyfigure.nombrevaccinations.label":"Total primo vaccinations",
"keyfigure.nombrevaccinations.shortLabel":"Primo vaccinations",
"keyfigure.nombrevaccinations.description":"Cet indicateur représente le nombre total de personnes primo vaccinées.\nLes données sont consolidées le lendemain de leur remontée pour tenir compte des dernières données de vaccination de la veille au soir.",
"keyfigure.nombrevaccinations.description":"⚠️ Suite à un problème technique sur les données de vaccination, toutes les données ne peuvent être mises à jour. Le problème est en cours de résolution.\n\nCet indicateur représente le nombre total de personnes primo vaccinées.\nLes données sont consolidées le lendemain de leur remontée pour tenir compte des dernières données de vaccination de la veille au soir.",
"keyfigure.nombrevaccinations.learnMore":"Le nombre cumulé de personnes vaccinées en France est obtenu via l’outil \"Vaccin Covid\" dans lequel le nombre de personnes vaccinées est enregistré directement.\n\nLes données sont ensuite consolidées par Santé publique France puis publiées sur data.gouv.\n\nLes données sont disponibles au niveau régional et national de manière quotidienne, ⚠️ sauf pour les week-ends dont les données sont rapportées le lundi.",
"positiveTestStepsController.title": "Positif Covid",
......@@ -1110,30 +1110,25 @@
"vaccineCompletionController.footer.notifyAndFavorite": "En appuyant sur ce bouton, vous recevrez une notification le %@, et ce certificat sera ajouté en favori ❤️ dans votre carnet.",
"activityPass.fullscreen.title": "Pass Activité",
"activityPass.fullscreen.explanation": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n\nUt enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"activityPass.fullscreen.explanation": "À partir de ce certificat, vous pouvez générer un certificat à destination des activités sur le territoire français 🇫🇷.\n\nCe certificat permet de limiter les données du certificat au strict minimum.\n\nAttention, vous avez besoin d’internet pour générer ce certificat. Si vous êtes dans l’incapacité de le générer, le certificat dans l'onglet “Frontière” fonctionnera également.",
"activityPass.fullscreen.readMore": "En savoir plus",
"activityPass.fullscreen.readMore.url": "",
"activityPass.fullscreen.unavailable.alert.title": "Indisponible",
"activityPass.fullscreen.unavailable.alert.message": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"activityPass.fullscreen.notYet.alert.title": "Pas encore",
"activityPass.fullscreen.notYet.alert.message": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"activityPass.fullscreen.unavailable.alert.message": "Votre connexion ou le service de génération de Pass Activité ne sont pas disponibles.\n\nVous pouvez utiliser le certificat dans l'onglet \"Frontière\".",
"activityPass.fullscreen.button.generate": "Générer un Pass Activité",
"europeanCertificate.fullscreen.type.activityPass": "Pass Activité",
"activityPass.fullscreen.switch.autoRenewal": "Renouvellement auto",
"activityPass.fullscreen.switch.autoRenewal.footer": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"activityPass.fullscreen.validFor": "Valable encore %@",
"activityPass.fullscreen.validFor": "Renouvellement dans %@",
"activityPass.fullscreen.validFor.timeFormat": "%dh%dmin",
"activityPass.fullscreen.validFor.timeFormat.hoursMinutes": "%dh%dmin",
"activityPass.fullscreen.validFor.timeFormat.minutes": "%dmin",
"activityPass.fullscreen.validFor.timeFormat.lessThanAMinute": "< 1min",
"activityPass.fullscreen.validFor.timeFormat.lessThanAMinute": "moins d'une minute",
"activityPassParametersController.title": "Pass Activité",
"activityPassParametersController.switch.notifyMe": "Me notifier",
"activityPassParametersController.button.readCGU": "Lire les CGU",
"activityPassParametersController.doYouConfirm" : "Confirmez-vous la création du Pass Activité ?",
"activityPassParametersController.explanations" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n\nUt enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"activityPassParametersController.explanations" : "Concernant les traitements de données, veuillez vous référer aux conditions générales d'utilisation (CGU).\n\nVotre pass activité se renouvellera toutes les 48h automatiquement, sans intervention de votre part. En cas d'indisponibilité, utilisez le QR Code dans l'onglet \"Frontière\".",
"walletQuantityWarningController.title": "ATTENTION",
"walletQuantityWarningController.explanation": "L'usage de TousAntiCovid Carnet est inhabituel. Vous avez dépassé les 15 certificats.\n\n👉 Si vous êtes un professionnel, il est interdit d'utiliser TousAntiCovid pour vérifier les Pass Sanitaires, sous peine de poursuites (jusqu’à 3 ans de prison et 45 000 euros d'amende).\n\nVous devez utiliser TousAntiCovid Verif disponible sur les Stores.\n\n👉 Si vous êtes un particulier, il est recommandé de supprimer certains de vos certificats qui ne sont plus utiles (par exemple des anciens tests négatifs).",
"walletQuantityWarningController.explanation": "L'usage de TousAntiCovid Carnet est inhabituel. Vous avez dépassé les 15 certificats.\n\n👉 Si vous êtes un professionnel, il est interdit d'utiliser TousAntiCovid pour vérifier les Pass Sanitaires, sous peine de poursuites (jusqu’à 3 ans de prison et 45 000 euros d'amende).\n\nVous devez utiliser TousAntiCovid Verif disponible sur les Stores.\n\n👉 Si vous êtes un particulier, il est recommandé de supprimer certains de vos certificats qui ne sont plus utiles (par exemple des anciens tests négatifs), pour repasser sous le seuil des 15 certificats.",
"walletQuantityWarningController.continue": "Continuer",
"walletQuantityWarningController.continueAlert.title": "Êtes-vous sûr ?",
"walletQuantityWarningController.continueAlert.message": "Malgré les risques encourus, êtes-vous sûr de souhaiter importer ce certificat ?",
......@@ -1155,6 +1150,42 @@
"wallet.autotest.warning": "⚠️ Les autotests supervisés ne sont valables que sur le territoire français dans le cadre du \"pass activité\".",
"wallet.expired.pillTitle": "Expiré",
"keyFigureChartController.zoomOut": "Dézoomer",
"vaccineCompletionController.noWait.explanation.body": "⚠️ En cas de problème pendant la vérification, veuillez présenter le certificat %@ doses."
"vaccineCompletionController.noWait.explanation.body": "⚠️ En cas de problème pendant la vérification, veuillez présenter le certificat %@ doses.",
"rating.alert.title" : "Vous aimez TousAntiCovid ?",
"rating.alert.message" : "Donnez-nous votre avis sur le Store.",
"widget.dcc.activityPass": "Pass Activité 🇫🇷.\nRenouvellement : %@ à %@",
"manageDataController.activityPass.button": "Pass Activité",
"manageDataController.walletDataAndActivityPass.title":"Mes certificats",
"manageDataController.walletDataAndActivityPass.subtitle":"Cette opération effacera tous vos certificats de test et de vaccination de votre téléphone. Vous pouvez également activer/désactiver la génération automatiques des Pass Activité pour vos certificats éligibles.",
"activityPass.fullscreen.renew.alert.title": "Activation",
"activityPass.fullscreen.renew.alert.message": "Vous pouvez activer la génération automatique du Pass Activité pour tous vos autres certificats valides.\n\nVous pourrez désactiver cette configuration également dans les paramètres de l'application.",
"common.activate": "Activer",
"common.show": "Afficher",
"activityPass.fullscreen.notValid.message": "Ce certificat n'est pas éligible au Pass Activité 48h.",
"activityPass.fullscreen.notAvailable.message": "Votre Pass Activité pour ce certificat sera disponible à partir du %@",
"activityPass.fullscreen.notAvailable.footer.notify": "En appuyant sur ce bouton, vous recevrez une notification le %@",
"activityPass.fullscreen.notAvailable.button.notify.title": "Me notifier",
"android.db.error": "Impossible de déchiffrer le contenu de la base de données. Veuillez redémarrer votre téléphone.\n\nSi le problème persiste, vous pouvez aider l'équipe technique à corriger le problème en contactant le support via les paramètres.",
"android.migration.error": "La migration des anciennes données n'a pas pu s'effectuer.\n\nVous pouvez aider l'équipe technique à corriger le problème en contactant le support via les paramètres de l'appli (en bas de l'éccran d'accueil).",
"manageDataController.logs.subject": "Partage des fichiers de logs de l'appli",
"manageDataController.logs.clip": "Fichiers de logs",
"manageDataController.logs.email": "contact@tousanticovid.gouv.fr",
"widget.dcc.full.activityPass":"Appuyez pour générer un Pass Activité",
"widget.dcc.upToDate":"Widget à jour !",
"activityPassParametersController.cguUrl": "https://bonjour.tousanticovid.gouv.fr/privacy.html#activitypass",
"robertStatus.error.alert.title": "À lire",
"robertStatus.error.alert.message": "Pour des raisons de sécurité, après une inactivité de plusieurs jours, vous allez devoir vous enregistrer à nouveau dans l'application",
"robertStatus.error.alert.action": "S'enregistrer",
"robertStatus.error.alert.later": "Plus tard",
"activityPass.fullscreen.upToDate": "Widget à jour !",
"activityPass.fullscreen.serverUnavailable.message": "Votre connexion ou le service de génération de Pass Activité ne sont pas disponibles.\n\nLa génération se fera automatiquement quand le service sera disponible, sans action de votre part.\n\n👉 Vous pouvez utiliser le certificat dans l’onglet \"Frontière\" pour les vérification de pass.",
"activityPass.fullscreen.alreadyGenerating.alert.title": "En cours",
"activityPass.fullscreen.alreadyGenerating.alert.message": "La génération de votre Pass Activité est déjà en cours. Merci de votre patience.",
"activityPass.notification.title": "Votre Pass Activité",
"activityPass.notification.message": "Votre Pass Activité est désormais disponible dans TousAntiCovid !"
}
......@@ -71,7 +71,6 @@ import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
......@@ -265,56 +264,30 @@ class StopCovid : Application(), LifecycleObserver, RobertApplication, Localized
@OptIn(ExperimentalTime::class)
private fun refreshData() {
appCoroutineScope.launch(Dispatchers.IO) {
coroutineScope {
launch {
if (firstResume) {
delay(Duration.seconds(1)) // Add some delay to let the main activity start
}
AppMaintenanceManager.checkForMaintenanceUpgrade(this@StopCovid, injectionContainer.serverManager.okHttpClient)
firstResume = false
}
launch {
injectionContainer.moreKeyFiguresManager.onAppForeground(this@StopCovid)
}
launch {
injectionContainer.linksManager.onAppForeground(this@StopCovid)
}
launch {
injectionContainer.privacyManager.onAppForeground(this@StopCovid)
}
launch {
injectionContainer.stringsManager.onAppForeground(this@StopCovid)
}
launch {
injectionContainer.infoCenterManager.refreshIfNeeded(this@StopCovid)
}
launch {
injectionContainer.keyFiguresManager.onAppForeground(this@StopCovid)
}
launch {
injectionContainer.risksLevelManager.onAppForeground(this@StopCovid)
}
launch {
injectionContainer.blacklistDCCManager.onAppForeground(this@StopCovid)
}
launch {
injectionContainer.blacklist2DDOCManager.onAppForeground(this@StopCovid)
}
launch {
injectionContainer.formManager.onAppForeground(this@StopCovid)
}
launch {
injectionContainer.vaccinationCenterManager.onAppForeground(this@StopCovid, sharedPrefs)
}
launch {
injectionContainer.certificatesDocumentsManager.onAppForeground(this@StopCovid)
}
launch {
injectionContainer.dccCertificatesManager.onAppForeground(this@StopCovid)
}
launch {
robertManager.refreshConfig(this@StopCovid)
}
if (firstResume) {
delay(Duration.seconds(1)) // Add some delay to let the main activity start
}
firstResume = false
AppMaintenanceManager.checkForMaintenanceUpgrade(this@StopCovid, injectionContainer.serverManager.okHttpClient)
injectionContainer.moreKeyFiguresManager.onAppForeground(this@StopCovid)
injectionContainer.linksManager.onAppForeground(this@StopCovid)
injectionContainer.privacyManager.onAppForeground(this@StopCovid)
injectionContainer.stringsManager.onAppForeground(this@StopCovid)
injectionContainer.infoCenterManager.refreshIfNeeded(this@StopCovid)
injectionContainer.keyFiguresManager.onAppForeground(this@StopCovid)
injectionContainer.risksLevelManager.onAppForeground(this@StopCovid)
injectionContainer.blacklistDCCManager.onAppForeground(this@StopCovid)
injectionContainer.blacklist2DDOCManager.onAppForeground(this@StopCovid)
injectionContainer.formManager.onAppForeground(this@StopCovid)
injectionContainer.vaccinationCenterManager.onAppForeground(this@StopCovid, sharedPrefs)
injectionContainer.certificatesDocumentsManager.onAppForeground(this@StopCovid)
injectionContainer.dccCertificatesManager.onAppForeground(this@StopCovid)
try {
robertManager.refreshConfig(this@StopCovid)
} catch (e: Exception) {
Timber.e(e)
}
injectionContainer.serverManager.okHttpClient.connectionPool.evictAll()
......
......@@ -19,6 +19,7 @@ plugin.android=7.0.2
## # available=7.1.0-alpha09
## # available=7.1.0-alpha10
## # available=7.1.0-alpha11
## # available=7.1.0-alpha12
version.androidx.annotation=1.2.0
## # available=1.3.0-alpha01
......@@ -33,6 +34,7 @@ version.androidx.constraintlayout=2.1.0
version.androidx.core=1.6.0
## # available=1.7.0-alpha01
## # available=1.7.0-alpha02
## # available=1.7.0-beta01
version.androidx.documentfile=1.0.1
## # available=1.1.0-alpha01
......@@ -45,6 +47,7 @@ version.androidx.lifecycle=2.3.1
## # available=2.4.0-alpha01
## # available=2.4.0-alpha02
## # available=2.4.0-alpha03
## # available=2.4.0-beta01
version.androidx.navigation=2.3.5
## # available=2.4.0-alpha01
......@@ -55,10 +58,12 @@ version.androidx.navigation=2.3.5
## # available=2.4.0-alpha06
## # available=2.4.0-alpha07
## # available=2.4.0-alpha08
## # available=2.4.0-alpha09
version.androidx.preference=1.1.1
version.androidx.recyclerview=1.2.1
## # available=1.3.0-alpha01
version.androidx.swiperefreshlayout=1.1.0
## # available=1.2.0-alpha01
......@@ -100,9 +105,7 @@ version.com.google.code.gson..gson=2.8.8
version.com.google.protobuf..protobuf-gradle-plugin=0.8.17
version.com.google.protobuf..protobuf-javalite=3.17.3
## # available=3.18.0-rc-1
## # available=3.18.0-rc-2
version.com.google.protobuf..protobuf-javalite=3.18.0
## # available=4.0.0-rc-1
## # available=4.0.0-rc-2
......@@ -136,7 +139,7 @@ version.junit=5.7.2
version.junit.junit=4.13.2
version.kotlin=1.5.30
version.kotlin=1.5.31
version.kotlinx.coroutines=1.5.2
......@@ -180,6 +183,7 @@ version.androidx.fragment=1.3.6
## # available=1.4.0-alpha06
## # available=1.4.0-alpha07
## # available=1.4.0-alpha08
## # available=1.4.0-alpha09
version.com.github.chrisbanes..photoview=2.2.0
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment