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

Update to 2.6.2

- Remove duplicate infos from analytics
- Fix crash when key figures are empty
parent bf115e14
......@@ -36,6 +36,7 @@ import com.lunabeestudio.analytics.proxy.AnalyticsInfosProvider
import com.lunabeestudio.analytics.proxy.AnalyticsRobertManager
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import retrofit2.HttpException
......@@ -46,6 +47,7 @@ import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
import java.util.UUID
import kotlin.random.Random
object AnalyticsManager : LifecycleObserver {
......@@ -54,6 +56,8 @@ object AnalyticsManager : LifecycleObserver {
private const val FILE_NAME_APP_ERRORS: String = "app_errors"
private const val FILE_NAME_HEALTH_EVENTS: String = "heath_events"
private const val SHARED_PREFS_NAME: String = "TacAnalytics"
private const val ANALYTICS_REPORT_MIN_DELAY: Long = 500L
private const val ANALYTICS_REPORT_MAX_DELAY: Long = 2000L
private val dateFormat: DateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.FRANCE)
......@@ -126,7 +130,8 @@ object AnalyticsManager : LifecycleObserver {
if (robertManager.configuration.isAnalyticsOn && getSharedPrefs(context).isOptIn) {
val receivedHelloMessagesCount = robertManager.getLocalProximityCount()
sendAppAnalytics(context, analyticsInfosProvider, token, receivedHelloMessagesCount)
sendHealthAnalytics(context, robertManager, analyticsInfosProvider, token, receivedHelloMessagesCount)
delay(Random.nextLong(ANALYTICS_REPORT_MIN_DELAY, ANALYTICS_REPORT_MAX_DELAY))
sendHealthAnalytics(context, robertManager, analyticsInfosProvider, token)
} else {
reset(context)
}
......@@ -138,7 +143,7 @@ object AnalyticsManager : LifecycleObserver {
token: String,
receivedHelloMessagesCount: Int
) {
val appInfos = getAppInfos(context, analyticsInfosProvider, receivedHelloMessagesCount)
val appInfos = getAppInfos(analyticsInfosProvider, receivedHelloMessagesCount)
val appEvents = getAppEvents(context)
val appErrors = getErrors(context.filesDir)
val sendAnalyticsRQ = SendAnalyticsRQ(
......@@ -176,10 +181,9 @@ object AnalyticsManager : LifecycleObserver {
context: Context,
robertManager: AnalyticsRobertManager,
analyticsInfosProvider: AnalyticsInfosProvider,
token: String,
receivedHelloMessagesCount: Int
token: String
) {
val healthInfos = getHealthInfos(context, robertManager, analyticsInfosProvider, receivedHelloMessagesCount)
val healthInfos = getHealthInfos(context, robertManager, analyticsInfosProvider)
val healthEvents = getHealthEvents(context)
val sendAnalyticsRQ = SendAnalyticsRQ(
installationUuid = UUID.randomUUID().toString(),
......@@ -269,9 +273,10 @@ object AnalyticsManager : LifecycleObserver {
}
}
private fun getAppInfos(context: Context,
private fun getAppInfos(
infosProvider: AnalyticsInfosProvider,
receivedHelloMessagesCount: Int): AppInfos {
receivedHelloMessagesCount: Int
): AppInfos {
return AppInfos(
type = 0,
os = "Android",
......@@ -280,29 +285,23 @@ object AnalyticsManager : LifecycleObserver {
appVersion = infosProvider.getAppVersion(),
appBuild = infosProvider.getAppBuild(),
receivedHelloMessagesCount = receivedHelloMessagesCount,
secondsTracingActivated = getProximityActiveDuration(context) / 1000L,
placesCount = infosProvider.getPlacesCount(),
formsCount = infosProvider.getFormsCount(),
certificatesCount = infosProvider.getCertificatesCount(),
statusSuccessCount = sharedPreferences.statusSuccessCount ?: 0,
statusSuccessCount = sharedPreferences.statusSuccessCount,
userHasAZipcode = infosProvider.userHaveAZipCode(),
)
}
private fun getHealthInfos(context: Context,
private fun getHealthInfos(
context: Context,
robertManager: AnalyticsRobertManager,
infosProvider: AnalyticsInfosProvider,
receivedHelloMessagesCount: Int): HealthInfos {
infosProvider: AnalyticsInfosProvider
): HealthInfos {
return HealthInfos(
type = 1,
os = "Android",
deviceModel = Build.MODEL,
osVersion = Build.VERSION.SDK_INT.toString(),
appVersion = infosProvider.getAppVersion(),
appBuild = infosProvider.getAppBuild(),
receivedHelloMessagesCount = receivedHelloMessagesCount,
secondsTracingActivated = getProximityActiveDuration(context) / 1000L,
placesCount = infosProvider.getPlacesCount(),
riskLevel = robertManager.atRiskStatus?.riskLevel,
dateSample = infosProvider.getDateSample()?.let { dateFormat.format(Date(it)) },
dateFirstSymptoms = infosProvider.getDateFirstSymptom()?.let { dateFormat.format(Date(it)) },
......
......@@ -10,18 +10,18 @@
package com.lunabeestudio.analytics.model
@Suppress("unused")
class AppInfos(
type: Int,
os: String,
deviceModel: String,
osVersion: String,
appVersion: String,
appBuild: Int,
receivedHelloMessagesCount: Int,
secondsTracingActivated: Long,
placesCount: Int,
val deviceModel: String,
val osVersion: String,
val appVersion: String,
val appBuild: Int,
val receivedHelloMessagesCount: Int,
val placesCount: Int,
val formsCount: Int,
val certificatesCount: Int,
val statusSuccessCount: Int,
val userHasAZipcode: Boolean,
) : Infos(type, os, deviceModel, osVersion, appVersion, appBuild, receivedHelloMessagesCount, secondsTracingActivated, placesCount)
\ No newline at end of file
) : Infos(type, os)
\ No newline at end of file
......@@ -10,18 +10,13 @@
package com.lunabeestudio.analytics.model
@Suppress("unused")
class HealthInfos(
type: Int,
os: String,
deviceModel: String,
osVersion: String,
appVersion: String,
appBuild: Int,
receivedHelloMessagesCount: Int,
secondsTracingActivated: Long,
placesCount: Int,
val secondsTracingActivated: Long,
val riskLevel: Float?,
val dateSample: String?,
val dateFirstSymptoms: String?,
val dateLastContactNotification: String?,
) : Infos(type, os, deviceModel, osVersion, appVersion, appBuild, receivedHelloMessagesCount, secondsTracingActivated, placesCount)
\ No newline at end of file
) : Infos(type, os)
\ No newline at end of file
......@@ -13,11 +13,4 @@ package com.lunabeestudio.analytics.model
open class Infos(
val type: Int,
val os: String,
val deviceModel: String,
val osVersion: String,
val appVersion: String,
val appBuild: Int,
val receivedHelloMessagesCount: Int,
val secondsTracingActivated: Long,
val placesCount: Int,
)
\ No newline at end of file
......@@ -12,7 +12,7 @@ package com.lunabeestudio.stopcovid.coreui
object ConfigConstant {
private const val BASE_URL: String = "https://app.tousanticovid.gouv.fr/"
private const val VERSION_PATH: String = "json/version-30/"
private const val VERSION_PATH: String = "json/version-31/"
private const val VERSIONED_SERVER_URL: String = BASE_URL + VERSION_PATH
const val SERVER_CERTIFICATE_SHA256: String = "sha256/ckVocY6+T4RvpXWtbqOF45qEvNls4oFWi83BryOQgOk="
......
......@@ -43,8 +43,8 @@ android {
applicationId "fr.gouv.android.stopcovid"
minSdkVersion 21
targetSdkVersion 30
versionCode 216
versionName "2.6.1"
versionCode 222
versionName "2.6.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
......
......@@ -337,7 +337,7 @@
"keyfigure.tauxoccupation.description": "This indicator reflects the occupancy rates of hospital ICUs, and is expressed as the number of patients with COVID-19 who are currently in ICU out of the total number of ICU beds available prior to the crisis.",
"keyfigure.nombrecas.label": "New cases",
"keyfigure.nombrecas.shortLabel": "New cases",
"keyfigure.nombrecas.description":"This indicator, which is only available at a national level, corresponds to the number of confirmed new cases (RT-PCR and antigen tests) over the last 24 hours. Figures reported at the start of the week will often be higher as a result of a drop in testing activity over the weekend.",
"keyfigure.nombrecas.description":"This indicator, which is only available at a national level, corresponds to the number of confirmed new cases (RT-PCR and antigen tests) over the last 24 hours.",
"keyfigure.nombrecasj3.label": "Positive cases identified D-3",
"keyfigure.nombrecasj3.shortLabel": "Positive cases identified D-3",
"keyfigure.nombrecasj3.description": "This indicator corresponds to the number of new cases (RT-PCR and antigen tests) of COVID-19, recorded by test date, and reflects the situation three days ago. This provides enough time to ensure that the data gives an accurate reflection of the epidemiological situation three days ago.",
......@@ -714,7 +714,7 @@
"home.vaccinationSection.cellSubtitle": "Check your eligibility and find a center nearby to get vaccinated.",
"vaccinationController.title": "Vaccination",
"vaccinationController.eligibility.title": "Am I eligible to get vaccinated?",
"vaccinationController.eligibility.subtitle": "Aujourd’hui, les publics prioritaires définis par les autorités sanitaires sont :\n- les personnes de 55 ans et plus, quels que soient leur lieu de vie et leur état de santé (avec ou sans comorbidités)\n- les femmes enceintes à partir du deuxième trimestre de la grossesse ;\n- les résidents en établissements (par exemple Ehpad, USLD)\n- les personnes de plus de 18 ans ayant une pathologie qui les expose à un très haut risque face à la Covid-19 ;\n- les personnes de 50 à 54 ans inclus, souffrant d’une ou plusieurs comorbidités\n- les personnes en situation de handicap hébergées en établissements\n- les résidents de 60 ans et plus dans les foyers de travailleurs migrants\n- les professionnels du secteur de la santé et du secteur médico-social appartenant aux catégories prioritaires.\n\nAppuyez sur \"En savoir plus\" pour plus de détails.",
"vaccinationController.eligibility.subtitle": "Aujourd’hui, les publics prioritaires définis par les autorités sanitaires sont :\n- les personnes de 55 ans et plus, quels que soient leur lieu de vie et leur état de santé (avec ou sans comorbidités)\n- les femmes enceintes à partir du deuxième trimestre de la grossesse\n- les résidents en établissements (par exemple Ehpad, USLD)\n- les personnes de plus de 18 ans ayant une pathologie qui les expose à un très haut risque face à la Covid-19\n- les personnes de 50 à 54 ans inclus, souffrant d’une ou plusieurs comorbidités\n- les personnes en situation de handicap hébergées en établissements\n- les résidents de 60 ans et plus dans les foyers de travailleurs migrants\n- les professionnels de santé et les professionnels du secteur médico-social (dont les ambulanciers), les aides à domicile intervenant auprès de personnes âgées et handicapées vulnérables, les sapeurs-pompiers et les vétérinaires.\n\nAppuyez sur \"En savoir plus\" pour plus de détails.",
"vaccinationController.eligibility.buttonTitle": "En savoir plus",
"vaccinationController.eligibility.url": "https://www.gouvernement.fr/info-coronavirus/vaccins#tac",
"vaccinationController.vaccinationLocation.title": "Find a center to get vaccinated",
......@@ -1065,6 +1065,7 @@
"manageDataController.analytics.title": "Statistiques et mesure d’audience",
"manageDataController.analytics.subtitle": "En conformité avec le RGPD, nous vous informons de notre capacité à collecter des données sur l’usage que vous faites de TousAntiCovid, à des fins de diagnostics, d’amélioration de performance et de l’expérience utilisateur. Sachez enfin que ces données sont conservées sur le serveur pendant 3 mois.",
"manageDataController.analytics.switch.on": "Activé",
"manageDataController.analytics.switch.off": "Désactivé"
"manageDataController.analytics.switch.off": "Désactivé",
"keyFigureDetailController.section.evolution.subtitle.nodata": "%@.\nAucune donnée",
"keyFigureDetailController.nodata": "Aucune donnée disponible pour l'indicateur \"%@\"."
}
......@@ -337,7 +337,7 @@
"keyfigure.tauxoccupation.description": "This indicator reflects the occupancy rates of hospital ICUs, and is expressed as the number of patients with COVID-19 who are currently in ICU out of the total number of ICU beds available prior to the crisis.",
"keyfigure.nombrecas.label": "New cases",
"keyfigure.nombrecas.shortLabel": "New cases",
"keyfigure.nombrecas.description":"This indicator, which is only available at a national level, corresponds to the number of confirmed new cases (RT-PCR and antigen tests) over the last 24 hours. Figures reported at the start of the week will often be higher as a result of a drop in testing activity over the weekend.",
"keyfigure.nombrecas.description":"This indicator, which is only available at a national level, corresponds to the number of confirmed new cases (RT-PCR and antigen tests) over the last 24 hours.",
"keyfigure.nombrecasj3.label": "Positive cases identified D-3",
"keyfigure.nombrecasj3.shortLabel": "Positive cases identified D-3",
"keyfigure.nombrecasj3.description": "This indicator corresponds to the number of new cases (RT-PCR and antigen tests) of COVID-19, recorded by test date, and reflects the situation three days ago. This provides enough time to ensure that the data gives an accurate reflection of the epidemiological situation three days ago.",
......@@ -714,7 +714,7 @@
"home.vaccinationSection.cellSubtitle": "Check your eligibility and find a center nearby to get vaccinated.",
"vaccinationController.title": "Vaccination",
"vaccinationController.eligibility.title": "Am I eligible to get vaccinated?",
"vaccinationController.eligibility.subtitle": "Aujourd’hui, les publics prioritaires définis par les autorités sanitaires sont :\n- les personnes de 55 ans et plus, quels que soient leur lieu de vie et leur état de santé (avec ou sans comorbidités)\n- les femmes enceintes à partir du deuxième trimestre de la grossesse ;\n- les résidents en établissements (par exemple Ehpad, USLD)\n- les personnes de plus de 18 ans ayant une pathologie qui les expose à un très haut risque face à la Covid-19 ;\n- les personnes de 50 à 54 ans inclus, souffrant d’une ou plusieurs comorbidités\n- les personnes en situation de handicap hébergées en établissements\n- les résidents de 60 ans et plus dans les foyers de travailleurs migrants\n- les professionnels du secteur de la santé et du secteur médico-social appartenant aux catégories prioritaires.\n\nAppuyez sur \"En savoir plus\" pour plus de détails.",
"vaccinationController.eligibility.subtitle": "Aujourd’hui, les publics prioritaires définis par les autorités sanitaires sont :\n- les personnes de 55 ans et plus, quels que soient leur lieu de vie et leur état de santé (avec ou sans comorbidités)\n- les femmes enceintes à partir du deuxième trimestre de la grossesse\n- les résidents en établissements (par exemple Ehpad, USLD)\n- les personnes de plus de 18 ans ayant une pathologie qui les expose à un très haut risque face à la Covid-19\n- les personnes de 50 à 54 ans inclus, souffrant d’une ou plusieurs comorbidités\n- les personnes en situation de handicap hébergées en établissements\n- les résidents de 60 ans et plus dans les foyers de travailleurs migrants\n- les professionnels de santé et les professionnels du secteur médico-social (dont les ambulanciers), les aides à domicile intervenant auprès de personnes âgées et handicapées vulnérables, les sapeurs-pompiers et les vétérinaires.\n\nAppuyez sur \"En savoir plus\" pour plus de détails.",
"vaccinationController.eligibility.buttonTitle": "En savoir plus",
"vaccinationController.eligibility.url": "https://www.gouvernement.fr/info-coronavirus/vaccins#tac",
"vaccinationController.vaccinationLocation.title": "Find a center to get vaccinated",
......@@ -1065,6 +1065,8 @@
"manageDataController.analytics.title": "Statistiques et mesure d’audience",
"manageDataController.analytics.subtitle": "En conformité avec le RGPD, nous vous informons de notre capacité à collecter des données sur l’usage que vous faites de TousAntiCovid, à des fins de diagnostics, d’amélioration de performance et de l’expérience utilisateur. Sachez enfin que ces données sont conservées sur le serveur pendant 3 mois.",
"manageDataController.analytics.switch.on": "Activé",
"manageDataController.analytics.switch.off": "Désactivé"
"manageDataController.analytics.switch.off": "Désactivé",
"keyFigureDetailController.section.evolution.subtitle.nodata": "%@.\nAucune donnée",
"keyFigureDetailController.nodata": "Aucune donnée disponible pour l'indicateur \"%@\"."
}
......@@ -337,7 +337,7 @@
"keyfigure.tauxoccupation.description": "This indicator reflects the occupancy rates of hospital ICUs, and is expressed as the number of patients with COVID-19 who are currently in ICU out of the total number of ICU beds available prior to the crisis.",
"keyfigure.nombrecas.label": "New cases",
"keyfigure.nombrecas.shortLabel": "New cases",
"keyfigure.nombrecas.description":"This indicator, which is only available at a national level, corresponds to the number of confirmed new cases (RT-PCR and antigen tests) over the last 24 hours. Figures reported at the start of the week will often be higher as a result of a drop in testing activity over the weekend.",
"keyfigure.nombrecas.description":"This indicator, which is only available at a national level, corresponds to the number of confirmed new cases (RT-PCR and antigen tests) over the last 24 hours.",
"keyfigure.nombrecasj3.label": "Positive cases identified D-3",
"keyfigure.nombrecasj3.shortLabel": "Positive cases identified D-3",
"keyfigure.nombrecasj3.description": "This indicator corresponds to the number of new cases (RT-PCR and antigen tests) of COVID-19, recorded by test date, and reflects the situation three days ago. This provides enough time to ensure that the data gives an accurate reflection of the epidemiological situation three days ago.",
......@@ -714,7 +714,7 @@
"home.vaccinationSection.cellSubtitle": "Check your eligibility and find a center nearby to get vaccinated.",
"vaccinationController.title": "Vaccination",
"vaccinationController.eligibility.title": "Am I eligible to get vaccinated?",
"vaccinationController.eligibility.subtitle": "Aujourd’hui, les publics prioritaires définis par les autorités sanitaires sont :\n- les personnes de 55 ans et plus, quels que soient leur lieu de vie et leur état de santé (avec ou sans comorbidités)\n- les femmes enceintes à partir du deuxième trimestre de la grossesse ;\n- les résidents en établissements (par exemple Ehpad, USLD)\n- les personnes de plus de 18 ans ayant une pathologie qui les expose à un très haut risque face à la Covid-19 ;\n- les personnes de 50 à 54 ans inclus, souffrant d’une ou plusieurs comorbidités\n- les personnes en situation de handicap hébergées en établissements\n- les résidents de 60 ans et plus dans les foyers de travailleurs migrants\n- les professionnels du secteur de la santé et du secteur médico-social appartenant aux catégories prioritaires.\n\nAppuyez sur \"En savoir plus\" pour plus de détails.",
"vaccinationController.eligibility.subtitle": "Aujourd’hui, les publics prioritaires définis par les autorités sanitaires sont :\n- les personnes de 55 ans et plus, quels que soient leur lieu de vie et leur état de santé (avec ou sans comorbidités)\n- les femmes enceintes à partir du deuxième trimestre de la grossesse\n- les résidents en établissements (par exemple Ehpad, USLD)\n- les personnes de plus de 18 ans ayant une pathologie qui les expose à un très haut risque face à la Covid-19\n- les personnes de 50 à 54 ans inclus, souffrant d’une ou plusieurs comorbidités\n- les personnes en situation de handicap hébergées en établissements\n- les résidents de 60 ans et plus dans les foyers de travailleurs migrants\n- les professionnels de santé et les professionnels du secteur médico-social (dont les ambulanciers), les aides à domicile intervenant auprès de personnes âgées et handicapées vulnérables, les sapeurs-pompiers et les vétérinaires.\n\nAppuyez sur \"En savoir plus\" pour plus de détails.",
"vaccinationController.eligibility.buttonTitle": "En savoir plus",
"vaccinationController.eligibility.url": "https://www.gouvernement.fr/info-coronavirus/vaccins#tac",
"vaccinationController.vaccinationLocation.title": "Find a center to get vaccinated",
......@@ -1065,6 +1065,8 @@
"manageDataController.analytics.title": "Statistiques et mesure d’audience",
"manageDataController.analytics.subtitle": "En conformité avec le RGPD, nous vous informons de notre capacité à collecter des données sur l’usage que vous faites de TousAntiCovid, à des fins de diagnostics, d’amélioration de performance et de l’expérience utilisateur. Sachez enfin que ces données sont conservées sur le serveur pendant 3 mois.",
"manageDataController.analytics.switch.on": "Activé",
"manageDataController.analytics.switch.off": "Désactivé"
"manageDataController.analytics.switch.off": "Désactivé",
"keyFigureDetailController.section.evolution.subtitle.nodata": "%@.\nAucune donnée",
"keyFigureDetailController.nodata": "Aucune donnée disponible pour l'indicateur \"%@\"."
}
......@@ -337,7 +337,7 @@
"keyfigure.tauxoccupation.description": "This indicator reflects the occupancy rates of hospital ICUs, and is expressed as the number of patients with COVID-19 who are currently in ICU out of the total number of ICU beds available prior to the crisis.",
"keyfigure.nombrecas.label": "New cases",
"keyfigure.nombrecas.shortLabel": "New cases",
"keyfigure.nombrecas.description":"This indicator, which is only available at a national level, corresponds to the number of confirmed new cases (RT-PCR and antigen tests) over the last 24 hours. Figures reported at the start of the week will often be higher as a result of a drop in testing activity over the weekend.",
"keyfigure.nombrecas.description":"This indicator, which is only available at a national level, corresponds to the number of confirmed new cases (RT-PCR and antigen tests) over the last 24 hours.",
"keyfigure.nombrecasj3.label": "Positive cases identified D-3",
"keyfigure.nombrecasj3.shortLabel": "Positive cases identified D-3",
"keyfigure.nombrecasj3.description": "This indicator corresponds to the number of new cases (RT-PCR and antigen tests) of COVID-19, recorded by test date, and reflects the situation three days ago. This provides enough time to ensure that the data gives an accurate reflection of the epidemiological situation three days ago.",
......@@ -714,7 +714,7 @@
"home.vaccinationSection.cellSubtitle": "Check your eligibility and find a center nearby to get vaccinated.",
"vaccinationController.title": "Vaccination",
"vaccinationController.eligibility.title": "Am I eligible to get vaccinated?",
"vaccinationController.eligibility.subtitle": "Aujourd’hui, les publics prioritaires définis par les autorités sanitaires sont :\n- les personnes de 55 ans et plus, quels que soient leur lieu de vie et leur état de santé (avec ou sans comorbidités)\n- les femmes enceintes à partir du deuxième trimestre de la grossesse ;\n- les résidents en établissements (par exemple Ehpad, USLD)\n- les personnes de plus de 18 ans ayant une pathologie qui les expose à un très haut risque face à la Covid-19 ;\n- les personnes de 50 à 54 ans inclus, souffrant d’une ou plusieurs comorbidités\n- les personnes en situation de handicap hébergées en établissements\n- les résidents de 60 ans et plus dans les foyers de travailleurs migrants\n- les professionnels du secteur de la santé et du secteur médico-social appartenant aux catégories prioritaires.\n\nAppuyez sur \"En savoir plus\" pour plus de détails.",
"vaccinationController.eligibility.subtitle": "Aujourd’hui, les publics prioritaires définis par les autorités sanitaires sont :\n- les personnes de 55 ans et plus, quels que soient leur lieu de vie et leur état de santé (avec ou sans comorbidités)\n- les femmes enceintes à partir du deuxième trimestre de la grossesse\n- les résidents en établissements (par exemple Ehpad, USLD)\n- les personnes de plus de 18 ans ayant une pathologie qui les expose à un très haut risque face à la Covid-19\n- les personnes de 50 à 54 ans inclus, souffrant d’une ou plusieurs comorbidités\n- les personnes en situation de handicap hébergées en établissements\n- les résidents de 60 ans et plus dans les foyers de travailleurs migrants\n- les professionnels de santé et les professionnels du secteur médico-social (dont les ambulanciers), les aides à domicile intervenant auprès de personnes âgées et handicapées vulnérables, les sapeurs-pompiers et les vétérinaires.\n\nAppuyez sur \"En savoir plus\" pour plus de détails.",
"vaccinationController.eligibility.buttonTitle": "En savoir plus",
"vaccinationController.eligibility.url": "https://www.gouvernement.fr/info-coronavirus/vaccins#tac",
"vaccinationController.vaccinationLocation.title": "Find a center to get vaccinated",
......@@ -1065,6 +1065,8 @@
"manageDataController.analytics.title": "Statistiques et mesure d’audience",
"manageDataController.analytics.subtitle": "En conformité avec le RGPD, nous vous informons de notre capacité à collecter des données sur l’usage que vous faites de TousAntiCovid, à des fins de diagnostics, d’amélioration de performance et de l’expérience utilisateur. Sachez enfin que ces données sont conservées sur le serveur pendant 3 mois.",
"manageDataController.analytics.switch.on": "Activé",
"manageDataController.analytics.switch.off": "Désactivé"
"manageDataController.analytics.switch.off": "Désactivé",
"keyFigureDetailController.section.evolution.subtitle.nodata": "%@.\nAucune donnée",
"keyFigureDetailController.nodata": "Aucune donnée disponible pour l'indicateur \"%@\"."
}
......@@ -704,7 +704,7 @@
"home.vaccinationSection.cellSubtitle": "Vérifiez votre éligibilité et trouvez un centre près de chez vous pour vous faire vacciner.",
"vaccinationController.title": "Vaccination",
"vaccinationController.eligibility.title": "Suis-je prioritaire pour me faire vacciner ?",
"vaccinationController.eligibility.subtitle": "Aujourd’hui, les publics prioritaires définis par les autorités sanitaires sont :\n- les personnes de 55 ans et plus, quels que soient leur lieu de vie et leur état de santé (avec ou sans comorbidités)\n- les femmes enceintes à partir du deuxième trimestre de la grossesse ;\n- les résidents en établissements (par exemple Ehpad, USLD)\n- les personnes de plus de 18 ans ayant une pathologie qui les expose à un très haut risque face à la Covid-19 ;\n- les personnes de 50 à 54 ans inclus, souffrant d’une ou plusieurs comorbidités\n- les personnes en situation de handicap hébergées en établissements\n- les résidents de 60 ans et plus dans les foyers de travailleurs migrants\n- les professionnels du secteur de la santé et du secteur médico-social appartenant aux catégories prioritaires.\n\nAppuyez sur \"En savoir plus\" pour plus de détails.",
"vaccinationController.eligibility.subtitle": "Aujourd’hui, les publics prioritaires définis par les autorités sanitaires sont :\n- les personnes de 55 ans et plus, quels que soient leur lieu de vie et leur état de santé (avec ou sans comorbidités)\n- les femmes enceintes à partir du deuxième trimestre de la grossesse\n- les résidents en établissements (par exemple Ehpad, USLD)\n- les personnes de plus de 18 ans ayant une pathologie qui les expose à un très haut risque face à la Covid-19\n- les personnes de 50 à 54 ans inclus, souffrant d’une ou plusieurs comorbidités\n- les personnes en situation de handicap hébergées en établissements\n- les résidents de 60 ans et plus dans les foyers de travailleurs migrants\n- les professionnels de santé et les professionnels du secteur médico-social (dont les ambulanciers), les aides à domicile intervenant auprès de personnes âgées et handicapées vulnérables, les sapeurs-pompiers et les vétérinaires.\n\nAppuyez sur \"En savoir plus\" pour plus de détails.",
"vaccinationController.eligibility.buttonTitle": "En savoir plus",
"vaccinationController.eligibility.url": "https://www.gouvernement.fr/info-coronavirus/vaccins#tac",
"vaccinationController.vaccinationLocation.title": "Trouver un centre pour me faire vacciner",
......@@ -1054,6 +1054,8 @@
"manageDataController.analytics.title": "Statistiques et mesure d’audience",
"manageDataController.analytics.subtitle": "En conformité avec le RGPD, nous vous informons de notre capacité à collecter des données sur l’usage que vous faites de TousAntiCovid, à des fins de diagnostics, d’amélioration de performance et de l’expérience utilisateur. Sachez enfin que ces données sont conservées sur le serveur pendant 3 mois.",
"manageDataController.analytics.switch.on": "Activé",
"manageDataController.analytics.switch.off": "Désactivé"
"manageDataController.analytics.switch.off": "Désactivé",
"keyFigureDetailController.section.evolution.subtitle.nodata": "%@.\nAucune donnée",
"keyFigureDetailController.nodata": "Aucune donnée disponible pour l'indicateur \"%@\"."
}
......@@ -337,7 +337,7 @@
"keyfigure.tauxoccupation.description": "This indicator reflects the occupancy rates of hospital ICUs, and is expressed as the number of patients with COVID-19 who are currently in ICU out of the total number of ICU beds available prior to the crisis.",
"keyfigure.nombrecas.label": "New cases",
"keyfigure.nombrecas.shortLabel": "New cases",
"keyfigure.nombrecas.description":"This indicator, which is only available at a national level, corresponds to the number of confirmed new cases (RT-PCR and antigen tests) over the last 24 hours. Figures reported at the start of the week will often be higher as a result of a drop in testing activity over the weekend.",
"keyfigure.nombrecas.description":"This indicator, which is only available at a national level, corresponds to the number of confirmed new cases (RT-PCR and antigen tests) over the last 24 hours.",
"keyfigure.nombrecasj3.label": "Positive cases identified D-3",
"keyfigure.nombrecasj3.shortLabel": "Positive cases identified D-3",
"keyfigure.nombrecasj3.description": "This indicator corresponds to the number of new cases (RT-PCR and antigen tests) of COVID-19, recorded by test date, and reflects the situation three days ago. This provides enough time to ensure that the data gives an accurate reflection of the epidemiological situation three days ago.",
......@@ -714,7 +714,7 @@
"home.vaccinationSection.cellSubtitle": "Check your eligibility and find a center nearby to get vaccinated.",
"vaccinationController.title": "Vaccination",
"vaccinationController.eligibility.title": "Am I eligible to get vaccinated?",
"vaccinationController.eligibility.subtitle": "Aujourd’hui, les publics prioritaires définis par les autorités sanitaires sont :\n- les personnes de 55 ans et plus, quels que soient leur lieu de vie et leur état de santé (avec ou sans comorbidités)\n- les femmes enceintes à partir du deuxième trimestre de la grossesse ;\n- les résidents en établissements (par exemple Ehpad, USLD)\n- les personnes de plus de 18 ans ayant une pathologie qui les expose à un très haut risque face à la Covid-19 ;\n- les personnes de 50 à 54 ans inclus, souffrant d’une ou plusieurs comorbidités\n- les personnes en situation de handicap hébergées en établissements\n- les résidents de 60 ans et plus dans les foyers de travailleurs migrants\n- les professionnels du secteur de la santé et du secteur médico-social appartenant aux catégories prioritaires.\n\nAppuyez sur \"En savoir plus\" pour plus de détails.",
"vaccinationController.eligibility.subtitle": "Aujourd’hui, les publics prioritaires définis par les autorités sanitaires sont :\n- les personnes de 55 ans et plus, quels que soient leur lieu de vie et leur état de santé (avec ou sans comorbidités)\n- les femmes enceintes à partir du deuxième trimestre de la grossesse\n- les résidents en établissements (par exemple Ehpad, USLD)\n- les personnes de plus de 18 ans ayant une pathologie qui les expose à un très haut risque face à la Covid-19\n- les personnes de 50 à 54 ans inclus, souffrant d’une ou plusieurs comorbidités\n- les personnes en situation de handicap hébergées en établissements\n- les résidents de 60 ans et plus dans les foyers de travailleurs migrants\n- les professionnels de santé et les professionnels du secteur médico-social (dont les ambulanciers), les aides à domicile intervenant auprès de personnes âgées et handicapées vulnérables, les sapeurs-pompiers et les vétérinaires.\n\nAppuyez sur \"En savoir plus\" pour plus de détails.",
"vaccinationController.eligibility.buttonTitle": "En savoir plus",
"vaccinationController.eligibility.url": "https://www.gouvernement.fr/info-coronavirus/vaccins#tac",
"vaccinationController.vaccinationLocation.title": "Find a center to get vaccinated",
......@@ -1065,6 +1065,8 @@
"manageDataController.analytics.title": "Statistiques et mesure d’audience",
"manageDataController.analytics.subtitle": "En conformité avec le RGPD, nous vous informons de notre capacité à collecter des données sur l’usage que vous faites de TousAntiCovid, à des fins de diagnostics, d’amélioration de performance et de l’expérience utilisateur. Sachez enfin que ces données sont conservées sur le serveur pendant 3 mois.",
"manageDataController.analytics.switch.on": "Activé",
"manageDataController.analytics.switch.off": "Désactivé"
"manageDataController.analytics.switch.off": "Désactivé",
"keyFigureDetailController.section.evolution.subtitle.nodata": "%@.\nAucune donnée",
"keyFigureDetailController.nodata": "Aucune donnée disponible pour l'indicateur \"%@\"."
}
......@@ -337,7 +337,7 @@
"keyfigure.tauxoccupation.description": "This indicator reflects the occupancy rates of hospital ICUs, and is expressed as the number of patients with COVID-19 who are currently in ICU out of the total number of ICU beds available prior to the crisis.",
"keyfigure.nombrecas.label": "New cases",
"keyfigure.nombrecas.shortLabel": "New cases",
"keyfigure.nombrecas.description":"This indicator, which is only available at a national level, corresponds to the number of confirmed new cases (RT-PCR and antigen tests) over the last 24 hours. Figures reported at the start of the week will often be higher as a result of a drop in testing activity over the weekend.",
"keyfigure.nombrecas.description":"This indicator, which is only available at a national level, corresponds to the number of confirmed new cases (RT-PCR and antigen tests) over the last 24 hours.",
"keyfigure.nombrecasj3.label": "Positive cases identified D-3",
"keyfigure.nombrecasj3.shortLabel": "Positive cases identified D-3",
"keyfigure.nombrecasj3.description": "This indicator corresponds to the number of new cases (RT-PCR and antigen tests) of COVID-19, recorded by test date, and reflects the situation three days ago. This provides enough time to ensure that the data gives an accurate reflection of the epidemiological situation three days ago.",
......@@ -714,7 +714,7 @@
"home.vaccinationSection.cellSubtitle": "Check your eligibility and find a center nearby to get vaccinated.",
"vaccinationController.title": "Vaccination",
"vaccinationController.eligibility.title": "Am I eligible to get vaccinated?",
"vaccinationController.eligibility.subtitle": "Aujourd’hui, les publics prioritaires définis par les autorités sanitaires sont :\n- les personnes de 55 ans et plus, quels que soient leur lieu de vie et leur état de santé (avec ou sans comorbidités)\n- les femmes enceintes à partir du deuxième trimestre de la grossesse ;\n- les résidents en établissements (par exemple Ehpad, USLD)\n- les personnes de plus de 18 ans ayant une pathologie qui les expose à un très haut risque face à la Covid-19 ;\n- les personnes de 50 à 54 ans inclus, souffrant d’une ou plusieurs comorbidités\n- les personnes en situation de handicap hébergées en établissements\n- les résidents de 60 ans et plus dans les foyers de travailleurs migrants\n- les professionnels du secteur de la santé et du secteur médico-social appartenant aux catégories prioritaires.\n\nAppuyez sur \"En savoir plus\" pour plus de détails.",
"vaccinationController.eligibility.subtitle": "Aujourd’hui, les publics prioritaires définis par les autorités sanitaires sont :\n- les personnes de 55 ans et plus, quels que soient leur lieu de vie et leur état de santé (avec ou sans comorbidités)\n- les femmes enceintes à partir du deuxième trimestre de la grossesse\n- les résidents en établissements (par exemple Ehpad, USLD)\n- les personnes de plus de 18 ans ayant une pathologie qui les expose à un très haut risque face à la Covid-19\n- les personnes de 50 à 54 ans inclus, souffrant d’une ou plusieurs comorbidités\n- les personnes en situation de handicap hébergées en établissements\n- les résidents de 60 ans et plus dans les foyers de travailleurs migrants\n- les professionnels de santé et les professionnels du secteur médico-social (dont les ambulanciers), les aides à domicile intervenant auprès de personnes âgées et handicapées vulnérables, les sapeurs-pompiers et les vétérinaires.\n\nAppuyez sur \"En savoir plus\" pour plus de détails.",
"vaccinationController.eligibility.buttonTitle": "En savoir plus",
"vaccinationController.eligibility.url": "https://www.gouvernement.fr/info-coronavirus/vaccins#tac",
"vaccinationController.vaccinationLocation.title": "Find a center to get vaccinated",
......@@ -1065,6 +1065,8 @@
"manageDataController.analytics.title": "Statistiques et mesure d’audience",
"manageDataController.analytics.subtitle": "En conformité avec le RGPD, nous vous informons de notre capacité à collecter des données sur l’usage que vous faites de TousAntiCovid, à des fins de diagnostics, d’amélioration de performance et de l’expérience utilisateur. Sachez enfin que ces données sont conservées sur le serveur pendant 3 mois.",
"manageDataController.analytics.switch.on": "Activé",
"manageDataController.analytics.switch.off": "Désactivé"
"manageDataController.analytics.switch.off": "Désactivé",
"keyFigureDetailController.section.evolution.subtitle.nodata": "%@.\nAucune donnée",
"keyFigureDetailController.nodata": "Aucune donnée disponible pour l'indicateur \"%@\"."
}
......@@ -71,21 +71,6 @@ class AttestationsFragment : QRCodeListFragment() {
}
identifier = label.hashCode().toLong()
}
items += linkCardItem {
label = strings["attestationsController.termsOfUse"]
iconRes = R.drawable.ic_cgu
onClickListener = View.OnClickListener {
MaterialAlertDialogBuilder(requireContext())
.setTitle(strings["attestationsController.termsOfUse.alert.title"])
.setMessage(strings["attestationsController.termsOfUse.alert.message"])
.setPositiveButton(strings["common.readMore"]) { _, _ ->
strings["attestationsController.termsOfUse.url"]?.openInExternalBrowser(requireContext())
}
.setNegativeButton(strings["common.ok"], null)
.show()
}
identifier = label.hashCode().toLong()
}
items += spaceItem {
spaceRes = R.dimen.spacing_large
......@@ -141,6 +126,27 @@ class AttestationsFragment : QRCodeListFragment() {
}
}
items += linkItem {
text = strings["attestationsController.termsOfUse"]
forceShowArrow = true
onClickListener = View.OnClickListener {
MaterialAlertDialogBuilder(requireContext())
.setTitle(strings["attestationsController.termsOfUse.alert.title"])
.setMessage(strings["attestationsController.termsOfUse.alert.message"])
.setPositiveButton(strings["common.readMore"]) { _, _ ->
strings["attestationsController.termsOfUse.url"]?.openInExternalBrowser(requireContext())
}
.setNegativeButton(strings["common.ok"], null)
.show()
}
identifier = "attestationsController.termsOfUse".hashCode().toLong()
}
items += spaceItem {
spaceRes = R.dimen.spacing_small
identifier = items.size.toLong()
}
items += captionItem {
text = strings["attestationController.footer"]
textAppearance = R.style.TextAppearance_StopCovid_Caption_Small_Grey
......
......@@ -10,7 +10,6 @@
package com.lunabeestudio.stopcovid.fragment
import android.graphics.Color
import android.os.Bundle
import android.view.View
import androidx.lifecycle.lifecycleScope
......@@ -22,6 +21,7 @@ import com.lunabeestudio.stopcovid.coreui.extension.appCompatActivity
import com.lunabeestudio.stopcovid.coreui.extension.findNavControllerOrNull
import com.lunabeestudio.stopcovid.coreui.extension.isNightMode
import com.lunabeestudio.stopcovid.coreui.extension.viewLifecycleOwnerOrNull
import com.lunabeestudio.stopcovid.coreui.fastitem.captionItem
import com.lunabeestudio.stopcovid.coreui.fastitem.cardWithActionItem
import com.lunabeestudio.stopcovid.coreui.fastitem.spaceItem
import com.lunabeestudio.stopcovid.databinding.ItemKeyFigureChartCardBinding
......@@ -78,6 +78,9 @@ class KeyFigureDetailsFragment : KeyFigureGenericFragment() {
if (keyFigure == null) {
return emptyList()
}
if (keyFigure?.series?.isEmpty() == true) {
return getNoDataItems()
}
val items = ArrayList<GenericItem>()
......@@ -147,7 +150,8 @@ class KeyFigureDetailsFragment : KeyFigureGenericFragment() {
chartData = arrayOf(
localData(figure)
).filterNotNull().toTypedArray()
chartExplanationLabel = chartExplanationLabel(figure, chartData.plus(globalData(figure, true)))
chartExplanationLabel = chartExplanationLabel(figure,
chartData.plus(listOfNotNull(globalData(figure, true))))
shareContentDescription = strings["accessibility.hint.keyFigure.chart.share"]
onShareCard = { binding ->
shareChart(binding)
......@@ -163,7 +167,7 @@ class KeyFigureDetailsFragment : KeyFigureGenericFragment() {
items += keyFigureCardChartItem {
chartData = arrayOf(
globalData(figure, false)
)
).filterNotNull().toTypedArray()
chartExplanationLabel = chartExplanationLabel(figure, chartData)
shareContentDescription = strings["accessibility.hint.keyFigure.chart.share"]
onShareCard = { binding ->
......@@ -219,6 +223,21 @@ class KeyFigureDetailsFragment : KeyFigureGenericFragment() {
return items
}
private fun getNoDataItems(): List<GenericItem> {
val items = ArrayList<GenericItem>()
items += spaceItem {
spaceRes = R.dimen.spacing_large
identifier = items.count().toLong()
}
items += captionItem {
text = stringsFormat("keyFigureDetailController.nodata", strings[keyFigure?.labelStringKey])
identifier = text.hashCode().toLong()
}
return items
}
private fun shareChart(binding: ItemKeyFigureChartCardBinding) {
viewLifecycleOwnerOrNull()?.lifecycleScope?.launch {
val uri = getShareCaptureUri(binding, Constants.Chart.SHARE_CHART_FILENAME)
......@@ -233,17 +252,20 @@ class KeyFigureDetailsFragment : KeyFigureGenericFragment() {
@OptIn(ExperimentalTime::class)
private fun chartExplanationLabel(figure: KeyFigure, chartData: Array<ChartData>): String? {
return when {
chartData.isNotEmpty() && chartData[0].entries.isEmpty() -> stringsFormat(
"keyFigureDetailController.section.evolution.subtitle.nodata",
strings["${figure.labelKey}.label"])
chartData.size > 1 -> stringsFormat(
"keyFigureDetailController.section.evolution.subtitle2Charts",
strings["${figure.labelKey}.label"],
chartData[0].entries.last().x.toLong().seconds.getRelativeDateShortString(requireContext()),
chartData[0].entries.lastOrNull()?.x?.toLong()?.seconds?.getRelativeDateShortString(requireContext()) ?: "",
chartData[0].currentValueToDisplay?.formatNumberIfNeeded(numberFormat),
chartData[1].currentValueToDisplay?.formatNumberIfNeeded(numberFormat)
)
chartData.isNotEmpty() -> stringsFormat(
"keyFigureDetailController.section.evolution.subtitle",
strings["${figure.labelKey}.label"],
chartData[0].entries.last().x.toLong().seconds.getRelativeDateShortString(requireContext()),
chartData[0].entries.lastOrNull()?.x?.toLong()?.seconds?.getRelativeDateShortString(requireContext()) ?: "",
chartData[0].currentValueToDisplay?.formatNumberIfNeeded(numberFormat)
)
else -> null
......@@ -254,29 +276,33 @@ class KeyFigureDetailsFragment : KeyFigureGenericFragment() {
val departmentKeyFigure = figure.getKeyFigureForPostalCode(sharedPrefs.chosenPostalCode)
return departmentKeyFigure?.let {
ChartData(
description = figure.getKeyFigureForPostalCode(sharedPrefs.chosenPostalCode)?.dptLabel,
currentValueToDisplay = departmentKeyFigure.valueToDisplay,
entries = departmentKeyFigure.series
.sortedBy { it.date }
.map { Entry(it.date.toFloat(), it.value.toFloat()) },
color = strings[figure.colorStringKey(requireContext().isNightMode())].safeParseColor()
)
departmentKeyFigure.series?.let { series ->
ChartData(
description = figure.getKeyFigureForPostalCode(sharedPrefs.chosenPostalCode)?.dptLabel,
currentValueToDisplay = departmentKeyFigure.valueToDisplay,
entries = series
.sortedBy { it.date }
.map { Entry(it.date.toFloat(), it.value.toFloat()) },
color = strings[figure.colorStringKey(requireContext().isNightMode())].safeParseColor()
)
}
}
}
private fun globalData(figure: KeyFigure, isSecondary: Boolean) = ChartData(
description = strings["common.country.france"],
currentValueToDisplay = figure.valueGlobalToDisplay,
entries = figure.series
.sortedBy { it.date }
.map { Entry(it.date.toFloat(), it.value.toFloat()) },
color = if (isSecondary) {
strings[figure.colorStringKey(requireContext().isNightMode())].safeParseColor().brighterColor()
} else {
strings[figure.colorStringKey(requireContext().isNightMode())].safeParseColor()
}
)
private fun globalData(figure: KeyFigure, isSecondary: Boolean) = figure.series?.let { series ->
ChartData(
description = strings["common.country.france"],
currentValueToDisplay = figure.valueGlobalToDisplay,
entries = series
.sortedBy { it.date }
.map { Entry(it.date.toFloat(), it.value.toFloat()) },