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

Update to 3.3.5

- Send health analytics only if event
- Migrate deprecated functions
- New server url with DCN
- Allow to skip battery step
- Hide key figures without label
- DCC badges
- DCC fullscreen border mode
parent 5049f6c5
......@@ -192,35 +192,39 @@ object AnalyticsManager : LifecycleObserver {
analyticsInfosProvider: AnalyticsInfosProvider,
token: String
) {
val healthInfos = getHealthInfos(context, robertManager, analyticsInfosProvider)
val healthEvents = getHealthEvents(context)
val sendAnalyticsRQ = SendHealthAnalyticsRQ(
installationUuid = UUID.randomUUID().toString(),
infos = healthInfos,
events = healthEvents.toAPI(),
errors = emptyList()
)
withContext(Dispatchers.IO) {
val result = AnalyticsServerManager.sendAnalytics(
context,
analyticsInfosProvider.getBaseUrl(),
analyticsInfosProvider.getApiVersion(),
token,
sendAnalyticsRQ,
if (healthEvents.isNotEmpty()) {
val healthInfos = getHealthInfos(context, robertManager, analyticsInfosProvider)
val sendAnalyticsRQ = SendHealthAnalyticsRQ(
installationUuid = UUID.randomUUID().toString(),
infos = healthInfos,
events = healthEvents.toAPI(),
errors = emptyList()
)
when (result) {
is AnalyticsResult.Success -> {
withContext(Dispatchers.Main) {
resetHealthEvents(context)
withContext(Dispatchers.IO) {
val result = AnalyticsServerManager.sendAnalytics(
context,
analyticsInfosProvider.getBaseUrl(),
analyticsInfosProvider.getApiVersion(),
token,
sendAnalyticsRQ,
)
when (result) {
is AnalyticsResult.Success -> {
withContext(Dispatchers.Main) {
resetHealthEvents(context)
}
}
}
is AnalyticsResult.Failure -> {
Timber.e(result.error)
if ((result.error as? HttpException)?.code() == 413) {
resetHealthEvents(context)
is AnalyticsResult.Failure -> {
Timber.e(result.error)
if ((result.error as? HttpException)?.code() == 413) {
resetHealthEvents(context)
}
}
}
}
} else {
Timber.d("No heath event to report")
}
}
......
......@@ -125,7 +125,7 @@ internal class BleProximityNotificationWithoutAdvertiser(
minStatCount = 40,
errorRateThreshold = 0.55F,
minScanErrorCount = 2,
maxTimeSinceLastStatus = 15 * 60 * 1000
maxTimeSinceLastStatus = 15L * 60L * 1000L
)
private val timeouts: Timeouts = when {
......
......@@ -11,12 +11,13 @@
package com.lunabeestudio.stopcovid.coreui
object ConfigConstant {
private const val BASE_URL: String = "https://app.tousanticovid.gouv.fr/"
private const val BASE_URL: String = "https://app-static.tousanticovid.gouv.fr/"
private const val VERSION_PATH: String = "json/version-34/"
private const val VERSIONED_SERVER_URL: String = BASE_URL + VERSION_PATH
const val SERVER_CERTIFICATE_SHA256: String = "sha256/ckVocY6+T4RvpXWtbqOF45qEvNls4oFWi83BryOQgOk="
object Maintenance {
private const val BASE_URL: String = "https://app.tousanticovid.gouv.fr/"
private const val FOLDER: String = "maintenance/"
private const val FILENAME: String = "info-maintenance-v2.json"
const val URL: String = BASE_URL + FOLDER + FILENAME
......
......@@ -11,9 +11,6 @@
package com.lunabeestudio.stopcovid.coreui
object UiConstants {
enum class Activity {
BATTERY, BLUETOOTH
}
enum class Permissions {
CAMERA, LOCATION
......
......@@ -31,7 +31,7 @@ import java.util.concurrent.TimeUnit
@Suppress("BlockingMethodInNonBlockingContext")
suspend fun String.saveTo(context: Context, file: File): Boolean {
return withContext(Dispatchers.IO) {
val cacheConfig = CacheConfig(File(context.cacheDir, "http_cache"), 30 * 1024 * 1024)
val cacheConfig = CacheConfig(File(context.cacheDir, "http_cache"), 30L * 1024L * 1024L)
val okHttpClient = OkHttpClient.getDefaultOKHttpClient(context, this@saveTo, ConfigConstant.SERVER_CERTIFICATE_SHA256, cacheConfig)
val request: Request = Request.Builder().apply {
cacheControl(CacheControl.Builder().maxAge(10, TimeUnit.MINUTES).build())
......@@ -58,7 +58,7 @@ suspend fun String.saveTo(context: Context, file: File): Boolean {
@Suppress("BlockingMethodInNonBlockingContext")
suspend fun String.saveTo(context: Context, atomicFile: AtomicFile, validData: suspend (data: ByteArray) -> Boolean): Boolean {
return withContext(Dispatchers.IO) {
val cacheConfig = CacheConfig(File(context.cacheDir, "http_cache"), 30 * 1024 * 1024)
val cacheConfig = CacheConfig(File(context.cacheDir, "http_cache"), 30L * 1024L * 1024L)
val okHttpClient = OkHttpClient.getDefaultOKHttpClient(context, this@saveTo, ConfigConstant.SERVER_CERTIFICATE_SHA256, cacheConfig)
val request: Request = Request.Builder().apply {
cacheControl(CacheControl.Builder().maxAge(10, TimeUnit.MINUTES).build())
......
......@@ -13,7 +13,9 @@ package com.lunabeestudio.stopcovid.coreui.extension
import android.util.TypedValue
import android.view.View
import androidx.core.content.ContextCompat
import androidx.core.graphics.Insets
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import com.google.android.material.appbar.AppBarLayout
......@@ -25,13 +27,22 @@ import com.lunabeestudio.stopcovid.coreui.R
*/
fun View.applyAndConsumeWindowInsetBottom() {
ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->
view.updatePadding(bottom = insets.systemWindowInsetBottom)
insets.replaceSystemWindowInsets(
insets.systemWindowInsetLeft,
insets.systemWindowInsetTop,
insets.stableInsetRight,
0
view.updatePadding(
bottom = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom.takeIf { it != 0 }
?: insets.getInsets(WindowInsetsCompat.Type.systemBars()).bottom
)
WindowInsetsCompat.Builder(insets)
.setInsets(
WindowInsetsCompat.Type.systemBars(),
Insets.of(
insets.getInsets(WindowInsetsCompat.Type.systemBars()).left,
insets.getInsets(WindowInsetsCompat.Type.systemBars()).top,
insets.getInsets(WindowInsetsCompat.Type.systemBars()).right,
0
)
)
.build()
}
}
......@@ -95,4 +106,4 @@ fun View.setOnClickListenerOrHideRipple(onClickListener: View.OnClickListener?)
background = null
}
setOnClickListener(onClickListener)
}
\ No newline at end of file
}
......@@ -25,4 +25,34 @@
<item name="widgetBackgroundColor">@color/color_indigo</item>
</style>
<style name="Theme.Base.StopCovid.ForceLight" parent="Theme.MaterialComponents.Light.NoActionBar" >
<item name="android:windowBackground">?colorSurface</item>
<item name="android:windowSoftInputMode">adjustResize</item>
<item name="colorPrimary">@color/color_indigo</item>
<item name="colorPrimaryVariant">?colorPrimary</item>
<item name="colorPrimaryDark">?colorPrimary</item>
<item name="colorOnPrimary">@color/color_on_primary</item>
<item name="colorSecondary">?colorPrimary</item>
<item name="colorSecondaryVariant">?colorSecondary</item>
<item name="colorOnSecondary">?colorOnPrimary</item>
<item name="colorAccent">?colorPrimary</item>
<item name="colorControlNormal">?colorPrimary</item>
<item name="appBarLayoutStyle">@style/Widget.MaterialComponents.AppBarLayout.Surface</item>
<item name="toolbarStyle">@style/Widget.StopCovid.Toolbar.Surface</item>
<item name="actionMenuTextColor">?colorControlNormal</item>
<item name="snackbarTextViewStyle">@style/Widget.StopCovid.Snackbar.TextView</item>
<item name="android:windowTranslucentNavigation">true</item>
<item name="shapeAppearanceMediumComponent">@style/ShapeAppearance.StopCovid.MediumComponent</item>
<item name="shapeAppearanceSmallComponent">@style/ShapeAppearance.StopCovid.SmallComponent</item>
<item name="materialCardViewStyle">@style/Widget.App.CardView</item>
<item name="bottomSheetDialogTheme">@style/ThemeOverlay.StopCovid.BottomSheetDialog</item>
<item name="dividerColor">@color/color_mercury</item>
</style>
</resources>
......@@ -7,7 +7,7 @@
~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~ Created by Lunabee Studio / Date - 2020/13/05 - for the TOUS-ANTI-COVID project
-->
<resources xmlns:tools="http://schemas.android.com/tools">
<resources>
<style name="Theme.Base.StopCovid" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<item name="android:windowBackground">?colorSurface</item>
......@@ -40,8 +40,6 @@
</style>
<style name="Theme.Base.StopCovid.ForceLight" parent="Theme.MaterialComponents.Light" />
<!-- Base application theme. -->
<style name="Theme.StopCovid" parent="Theme.Base.StopCovid" />
......@@ -67,6 +65,6 @@
<item name="widgetBackgroundColor">@android:color/white</item>
</style>
<style name="Theme.Base.StopCovid.ForceLight" />
</resources>
......@@ -14,7 +14,6 @@ import android.annotation.SuppressLint
import android.content.Context
import android.content.SharedPreferences
import android.os.Build
import android.security.KeyPairGeneratorSpec
import android.security.keystore.KeyGenParameterSpec
import android.security.keystore.KeyProperties
import android.util.Base64
......@@ -208,7 +207,7 @@ class LocalCryptoManager(private val appContext: Context) {
val end: Date = calendar.time
@Suppress("DEPRECATION")
generator.initialize(
KeyPairGeneratorSpec.Builder(context)
android.security.KeyPairGeneratorSpec.Builder(context)
.setAlgorithmParameterSpec(RSAKeyGenParameterSpec(2048, RSAKeyGenParameterSpec.F4))
.setAlias(RSA_WRAP_LOCAL_PROTECTION_KEY_ALIAS)
.setSubject(X500Principal("CN=stopcovid-robert-android"))
......@@ -295,8 +294,7 @@ class LocalCryptoManager(private val appContext: Context) {
val iv = ByteArray(ivLen)
inputStream.read(iv)
val cipher = Cipher.getInstance(AES_GCM_CIPHER_TYPE)
val spec: AlgorithmParameterSpec
spec = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val spec: AlgorithmParameterSpec = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
GCMParameterSpec(AES_GCM_KEY_SIZE_IN_BITS, iv)
} else {
IvParameterSpec(iv)
......
......@@ -68,6 +68,7 @@ object RetrofitClient {
val certificates: HandshakeCertificates = HandshakeCertificates.Builder()
.addTrustedCertificate(certificateFromString(context, "certigna_services"))
.addTrustedCertificate(certificateFromString(context, "r3"))
.addTrustedCertificate(certificateFromString(context, "l1k"))
.build()
sslSocketFactory(certificates.sslSocketFactory(), certificates.trustManager)
}
......
......@@ -23,7 +23,7 @@ class CleaDataSource(
private val cleaStatusFallbackBaseUrl: String,
) : RemoteCleaDataSource {
private val cacheConfig = CacheConfig(File(context.cacheDir, "http_cache"), 30 * 1024 * 1024)
private val cacheConfig = CacheConfig(File(context.cacheDir, "http_cache"), 30L * 1024L * 1024L)
private var filesDir = context.filesDir
......
-----BEGIN CERTIFICATE-----
MIIFDjCCA/agAwIBAgIMDulMwwAAAABR03eFMA0GCSqGSIb3DQEBCwUAMIG+MQsw
CQYDVQQGEwJVUzEWMBQGA1UEChMNRW50cnVzdCwgSW5jLjEoMCYGA1UECxMfU2Vl
IHd3dy5lbnRydXN0Lm5ldC9sZWdhbC10ZXJtczE5MDcGA1UECxMwKGMpIDIwMDkg
RW50cnVzdCwgSW5jLiAtIGZvciBhdXRob3JpemVkIHVzZSBvbmx5MTIwMAYDVQQD
EylFbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjAeFw0x
NTEwMDUxOTEzNTZaFw0zMDEyMDUxOTQzNTZaMIG6MQswCQYDVQQGEwJVUzEWMBQG
A1UEChMNRW50cnVzdCwgSW5jLjEoMCYGA1UECxMfU2VlIHd3dy5lbnRydXN0Lm5l
dC9sZWdhbC10ZXJtczE5MDcGA1UECxMwKGMpIDIwMTIgRW50cnVzdCwgSW5jLiAt
IGZvciBhdXRob3JpemVkIHVzZSBvbmx5MS4wLAYDVQQDEyVFbnRydXN0IENlcnRp
ZmljYXRpb24gQXV0aG9yaXR5IC0gTDFLMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEA2j+W0E25L0Tn2zlem1DuXKVh2kFnUwmqAJqOV38pa9vH4SEkqjrQ
jUcj0u1yFvCRIdJdt7hLqIOPt5EyaM/OJZMssn2XyP7BtBe6CZ4DkJN7fEmDImiK
m95HwzGYei59QAvS7z7Tsoyqj0ip/wDoKVgG97aTWpRzJiatWA7lQrjV6nN5ZGhT
JbiEz5R6rgZFDKNrTdDGvuoYpDbwkrK6HIiPOlJ/915tgxyd8B/lw9bdpXiSPbBt
LOrJz5RBGXFEaLpHPATpXbo+8DX3Fbae8i4VHj9HyMg4p3NFXU2wO7GOFyk36t0F
ASK7lDYqjVs1/lMZLwhGwSqzGmIdTivZGwIDAQABo4IBDDCCAQgwDgYDVR0PAQH/
BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwMwYIKwYBBQUHAQEEJzAlMCMGCCsG
AQUFBzABhhdodHRwOi8vb2NzcC5lbnRydXN0Lm5ldDAwBgNVHR8EKTAnMCWgI6Ah
hh9odHRwOi8vY3JsLmVudHJ1c3QubmV0L2cyY2EuY3JsMDsGA1UdIAQ0MDIwMAYE
VR0gADAoMCYGCCsGAQUFBwIBFhpodHRwOi8vd3d3LmVudHJ1c3QubmV0L3JwYTAd
BgNVHQ4EFgQUgqJwdN28Uz/Pe9T3zX+nYMYKTL8wHwYDVR0jBBgwFoAUanImetAe
733nO2lR1GyNn5ASZqswDQYJKoZIhvcNAQELBQADggEBADnVjpiDYcgsY9NwHRkw
y/YJrMxp1cncN0HyMg/vdMNY9ngnCTQIlZIv19+4o/0OgemknNM/TWgrFTEKFcxS
BJPok1DD2bHi4Wi3Ogl08TRYCj93mEC45mj/XeTIRsXsgdfJghhcg85x2Ly/rJkC
k9uUmITSnKa1/ly78EqvIazCP0kkZ9Yujs+szGQVGHLlbHfTUqi53Y2sAEo1GdRv
c6N172tkw+CNgxKhiucOhk3YtCAbvmqljEtoZuMrx1gL+1YQ1JH7HdMxWBCMRON1
exCdtTix9qrKgWRs6PLigVWXUX/hwidQosk8WwBD9lu51aX8/wdQQGcHsFXwt35u
Lcw=
-----END CERTIFICATE-----
\ No newline at end of file
......@@ -11,18 +11,25 @@
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">api.tousanticovid.gouv.fr</domain>
<domain includeSubdomains="true">app.tousanticovid.gouv.fr</domain>
<domain includeSubdomains="true">app-static.tousanticovid.gouv.fr</domain>
<domain includeSubdomains="true">analytics-api.tousanticovid.gouv.fr</domain>
<domain includeSubdomains="true">signal-api.tousanticovid.gouv.fr</domain>
<domain includeSubdomains="true">signal-static.tousanticovid.gouv.fr</domain>
<trust-anchors>
<certificates src="@raw/certigna_services" />
</trust-anchors>
</domain-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">s3.fr-par.scw.cloud</domain>
<domain includeSubdomains="true">signal-static.oos.cloudgouv-eu-west-1.outscale.com</domain>
<domain includeSubdomains="true">portail.tacv.myservices-ingroupe.com</domain>
<trust-anchors>
<certificates src="@raw/r3" />
</trust-anchors>
</domain-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">signal-static.oos.cloudgouv-eu-west-1.outscale.com</domain>
<trust-anchors>
<certificates src="@raw/l1k" />
</trust-anchors>
</domain-config>
</network-security-config>
\ No newline at end of file
......@@ -3,4 +3,10 @@
<!-- Generated by `./gradlew refreshVersions` to avoid errors when using _ as a version. -->
<issue id="GradlePluginVersion" severity="ignore" />
<issue id="GradleDependency" severity="ignore" />
<issue id="IconLocation" severity="ignore" />
<issue id="InvalidPackage" severity="ignore" />
<issue id="ObsoleteLintCustomCheck" severity="ignore" />
<issue id="UseCompoundDrawables" severity="ignore" />
<issue id="VectorPath" severity="ignore" />
<issue id="VectorRaster" severity="ignore" />
</lint>
\ No newline at end of file
......@@ -45,23 +45,12 @@ android {
applicationId "fr.gouv.android.stopcovid"
minSdkVersion 21
targetSdkVersion 30
versionCode 298
versionName "3.3.4"
versionCode 304
versionName "3.3.5"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
lintOptions {
disable "GradleDependency",
"IidCompatibilityCheckFailure",
"InvalidPackage",
"ObsoleteLintCustomCheck",
"UnsafeExperimentalUsageError",
"UnsafeExperimentalUsageWarning",
"VectorPath",
"VectorRaster"
}
testOptions {
animationsDisabled true
}
......
......@@ -2,11 +2,11 @@
"config": [
{
"name": "lastUpdate",
"value": "28 June 2021"
"value": "9 Jul 2021"
},
{
"name": "version",
"value": 70
"value": 75
},
{
"name": "versionCalibrationBle",
......@@ -34,7 +34,7 @@
},
{
"name" : "app.cleaUrls",
"value" : ["https://s3.fr-par.scw.cloud/clea-batch/", "https://signal-static.oos.cloudgouv-eu-west-1.outscale.com/", "https://signal-static.oos.cloudgouv-eu-west-1.outscale.com/"]
"value" : ["https://s3.fr-par.scw.cloud/clea-batch/", "https://signal-static.oos.cloudgouv-eu-west-1.outscale.com/", "https://signal-static.tousanticovid.gouv.fr/"]
},
{
"name" : "app.ameliUrl",
......@@ -101,7 +101,8 @@
"AHP1": "-----BEGIN PUBLIC KEY-----MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPnxJntwNwme9uHSasmGFFwdC0FWNEpucgzhjr+/AZ6UuTm3kL3ogEUAwKU0tShEVmZNK4/lM05h+0ZvtboJM/A==-----END PUBLIC KEY-----",
"AHP2": "-----BEGIN PUBLIC KEY-----MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEOYUgmx8pKu0UbyqQ/kt4+PXSpUprkO2YLHmzzoN66XjDW0AnSzXorFPe556p73Vawqaoy3qQKDIDB62IBYWBuA==-----END PUBLIC KEY-----",
"AV01": "-----BEGIN PUBLIC KEY-----MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1T9uG2bEP7uWND6RT/lJs2y787BkEJoRMMLXvqPKFFC3ckqFAPnFjbiv/odlWH04a1P9CvaCRxG31FMEOFZyXA==-----END PUBLIC KEY-----",
"AV02": "-----BEGIN PUBLIC KEY-----MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3jL6zQ0aQj9eJHUw4VDHB9sMoviLVIlADnoBwC43Md8p9w655z2bDhYEEajQ2amQzt+eU7HdWrvqY23Do91Izg==-----END PUBLIC KEY-----"
"AV02": "-----BEGIN PUBLIC KEY-----MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3jL6zQ0aQj9eJHUw4VDHB9sMoviLVIlADnoBwC43Md8p9w655z2bDhYEEajQ2amQzt+eU7HdWrvqY23Do91Izg==-----END PUBLIC KEY-----",
"ING1": "-----BEGIN PUBLIC KEY-----MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaMOVmK4FAlYeU8tUGpQgtpuLgwSn/arX/4ltKt/wYCole7rB4ECRLtSH4domHU/Z1cjUmVfyGH6NcboWrys9ww==-----END PUBLIC KEY-----"
}
}
]
......@@ -244,7 +245,7 @@
},
{
"name": "app.displayCertificateConversion",
"value": false
"value": true
},
{
"name": "app.certificateConversionUrl",
......@@ -263,6 +264,10 @@
}
]
},
{
"name": "app.wallet.confettiBirthRate",
"value": 150.0
},
{
"name": "app.wallet.certificateConversionSidepOnlyCode",
"value": ["945584"]
......
......@@ -24,10 +24,14 @@
},
{
"section": "✈️ Travel",
"description" : "Re-open EU provides information on the various measures in place, including on quarantine and testing requirements for travellers, the EU Digital COVID certificate to help you exercise your right to free movement, and mobile coronavirus contact tracing and warning apps. The information is updated frequently and available in 24 languages. This should help you plan your travel in Europe, while staying safe and healthy.",
"description" : "Re-open EU provides information on the various measures in place in Europe. This should help you plan your travel in Europe, while staying safe and healthy.\n\nDiplomatie.gouv.fr gives you information for each country, in particular if you want to come to France.",
"links": [
{
"label": "Go to Re-open EU",
"label": "Go to Diplomatie.gouv.fr 🇫🇷",
"url": "https://www.diplomatie.gouv.fr/en/"
},
{
"label": "Go to Re-open EU 🇪🇺",
"url": "https://reopen.europa.eu/en/from-to/FRA/"
}
]
......
......@@ -24,10 +24,14 @@
},
{
"section": "✈️ Voyager",
"description" : "\"Re-open EU\" (rouvrir l'Europe) fournit des informations sur les différentes mesures en place, notamment sur les exigences en matière de quarantaine et de tests pour les voyageurs, le certificat COVID numérique de l’UE pour vous aider à exercer votre droit à la libre circulation, et les applications mobiles de traçage et d’avertissement des contacts coronavirus. L'information est mise à jour fréquemment. Cela devrait vous aider à planifier votre voyage en Europe, tout en restant en sécurité et en santé.",
"description" : "\"Re-open EU\" (rouvrir l'Europe) fournit des informations sur les différentes mesures en place en Europe. Cela devrait vous aider à planifier votre voyage en Europe, tout en restant en sécurité et en santé.\n\nDiplomatie.gouv.fr vous donne également les informations par pays, si vous souhaitez voyager à l'étranger ou venir en France.",
"links": [
{
"label": "Aller sur Re-open EU",
"label": "Aller sur Diplomatie.gouv.fr 🇫🇷",
"url": "https://www.diplomatie.gouv.fr/fr/"
},
{
"label": "Aller sur Re-open EU 🇪🇺",
"url": "https://reopen.europa.eu/fr/from-to/FRA/"
}
]
......
......@@ -50,56 +50,9 @@
}
]
},
{
"riskLevel" : 1.0,
"description" : "Activité de contact Robert sans risque, avec notif",
"labels" :
{
"homeTitle" : "risk1.home.title",
"homeSub" : "risk1.home.sub",
"detailTitle" : "risk1.details.title",
"detailSubtitle" : "risk1.details.sub",
"widgetShort" : "risk1.home.title",
"widgetLong" : "risk1.details.title",
"notifTitle" : "risk1.notif.title",
"notifBody" : "risk1.notif.sub"
},
"color" : {"from" : "#6D7195", "to" : "#484D7A"},
"sections" : [
{
"section": "risk1.section1.title",
"description" : "risk1.section1.body"
},
{
"section": "risk.section.measures.title",
"description" : "risk.section.measures.body",
"link":
{
"label": "risk.section.measures.button",
"action": "GESTURES",
"type": "ctrl"
}
},
{
"section": "risk.section.mcc.title",
"description" : "risk.section.mcc.body",
"link" :
{
"label": "risk.section.mcc.button",
"action": "risk.section.mcc.url",
"type": "web"
}
},
{
"section": "risk.section.limit.title",
"description" : "risk.section.limit.body"
}
]
},
{
"riskLevel" : 2.0,
"description" : "TAC-W lieu modéré",
"description" : "TAC-S lieu modéré",
"labels" : {
"homeTitle" : "risk2.home.title",
"homeSub" : "risk2.home.sub",
......@@ -150,7 +103,7 @@
},
{
"riskLevel" : 3.0,
"description" : "TAC W risque élevé",
"description" : "TAC-S risque élevé",
"labels" : {
"homeTitle" : "risk3.home.title",
"homeSub" : "risk3.home.sub",
......
This source diff could not be displayed because it is too large. You can view the blob instead.
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