Mentions légales du service

Skip to content
Snippets Groups Projects
Verified Commit 70e7131b authored by Stopcovid Lunabee's avatar Stopcovid Lunabee
Browse files

Update to 4.2.14

Fix lint & format
Fix news
Fix charts
parent 5bd85d28
No related branches found
No related tags found
No related merge requests found
Showing
with 210 additions and 224 deletions
......@@ -13,15 +13,13 @@ apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'com.google.protobuf'
apply from: '../android.gradle'
android {
compileSdkVersion 31
buildToolsVersion '31.0.0'
compileSdkVersion 32
buildToolsVersion '32.0.0'
defaultConfig {
minSdkVersion 21
targetSdkVersion 31
targetSdkVersion 32
}
def props = new Properties()
......@@ -49,6 +47,10 @@ android {
compileOptions {
coreLibraryDesugaringEnabled = true
}
lintOptions {
lintConfig file("${project.rootDir}/lint.xml")
}
}
dependencies {
......
......@@ -10,15 +10,13 @@
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply from: '../android.gradle'
android {
compileSdkVersion 31
buildToolsVersion '31.0.0'
compileSdkVersion 32
buildToolsVersion '32.0.0'
defaultConfig {
minSdkVersion 21
targetSdkVersion 31
targetSdkVersion 32
buildConfigField 'String', 'BLE_VERSION', '"2.3.0"'
}
......@@ -34,11 +32,16 @@ android {
includeAndroidResources = true
}
}
lintOptions {
lintConfig file("${project.rootDir}/lint.xml")
}
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:_"
implementation 'androidx.annotation:annotation:_'
api 'no.nordicsemi.android.support.v18:scanner:_'
implementation 'com.jakewharton.timber:timber:_'
......
......@@ -8,6 +8,8 @@
* Created by Orange / Date - 2020/04/27 - for the TOUS-ANTI-COVID project
*/
@file:SuppressLint("MissingPermission")
package com.orange.proximitynotification
import android.annotation.SuppressLint
......
......@@ -8,6 +8,8 @@
* Created by Orange / Date - 2020/04/27 - for the TOUS-ANTI-COVID project
*/
@file:SuppressLint("MissingPermission")
package com.orange.proximitynotification.ble
import android.annotation.SuppressLint
......@@ -15,6 +17,7 @@ import android.bluetooth.BluetoothAdapter
import android.content.Context
import android.os.Build
import android.os.PowerManager
import androidx.annotation.ChecksSdkIntAtLeast
import com.orange.proximitynotification.ProximityNotificationCallback
import com.orange.proximitynotification.ProximityNotificationError
import com.orange.proximitynotification.ProximityPayload
......@@ -54,6 +57,7 @@ private data class BleScannerException(
override val cause: Throwable? = null
) : Exception()
@ChecksSdkIntAtLeast(api = Build.VERSION_CODES.N)
private fun isAndroidGreaterOrEqual7() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
private fun isAndroidLessThan7() = Build.VERSION.SDK_INT < Build.VERSION_CODES.N
......@@ -251,6 +255,7 @@ internal class BleProximityNotificationWithoutAdvertiser(
/**
* Advertise as much devices as possible during [Timeouts.advertiseProcess]
*/
@Suppress("LoopWithTooManyJumpStatements")
private suspend fun advertiseDevices(
coroutineScope: CoroutineScope,
devices: List<BleScannedDevice>
......
......@@ -31,7 +31,7 @@ import java.util.UUID
* @param maxDelayBetweenExchange Maximum delay (in s) between successful exchanges for a same device
* @param maxSuccessiveFailure Maximum successive failure for a same device
* */
@Suppress("ArrayInDataClass", "MagicNumber")
@Suppress("ArrayInDataClass", "MagicNumber", "ConstructorParameterNaming")
data class BleSettings(
val serviceUuid: UUID,
val servicePayloadCharacteristicUuid: UUID,
......
......@@ -10,6 +10,7 @@
package com.orange.proximitynotification.ble.advertiser
import android.annotation.SuppressLint
import android.bluetooth.le.AdvertiseCallback
import android.bluetooth.le.AdvertiseData
import android.bluetooth.le.AdvertiseSettings
......@@ -19,6 +20,7 @@ import com.orange.proximitynotification.ProximityNotificationEventId
import com.orange.proximitynotification.ProximityNotificationLogger
import com.orange.proximitynotification.ble.BleSettings
@SuppressLint("MissingPermission")
class BleAdvertiserImpl(
override val settings: BleSettings,
private val bluetoothAdvertiser: BluetoothLeAdvertiser
......
......@@ -8,8 +8,11 @@
* Created by Orange / Date - 2020/05/16 - for the TOUS-ANTI-COVID project
*/
@file:SuppressLint("MissingPermission")
package com.orange.proximitynotification.ble.gatt
import android.annotation.SuppressLint
import android.bluetooth.BluetoothDevice
import android.bluetooth.BluetoothDevice.TRANSPORT_LE
import android.bluetooth.BluetoothGatt
......
......@@ -8,8 +8,11 @@
* Created by Orange / Date - 2020/04/27 - for the TOUS-ANTI-COVID project
*/
@file:SuppressLint("MissingPermission")
package com.orange.proximitynotification.ble.gatt
import android.annotation.SuppressLint
import android.bluetooth.BluetoothDevice
import android.bluetooth.BluetoothGatt
import android.bluetooth.BluetoothGattCharacteristic
......@@ -228,6 +231,7 @@ internal class BleGattManagerImpl(
}
}
@Suppress("ThrowsCount")
private suspend fun <T> withConnectedClient(
device: BluetoothDevice,
action: suspend (BleGattClient) -> T
......
......@@ -17,6 +17,7 @@ import kotlin.experimental.and
internal fun ScanRecord.hasServiceUuid(serviceUuid: ParcelUuid): Boolean =
serviceUuids?.contains(serviceUuid) == true || serviceData?.get(serviceUuid) != null
@Suppress("ReturnCount")
internal fun ScanRecord.matchesManufacturerDataMask(manufacturerId: Int, mask: ByteArray): Boolean {
val manufacturerData = getManufacturerSpecificData(manufacturerId)
......
......@@ -117,6 +117,7 @@ class ProximityFilter(private val config: Config) {
RISKS
}
@Suppress("ReturnCount")
fun filter(
timestampedRssis: List<TimestampedRssi>,
epochStart: Date,
......
......@@ -11,11 +11,9 @@
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply from: '../android.gradle'
android {
compileSdkVersion 31
buildToolsVersion '31.0.0'
compileSdkVersion 32
buildToolsVersion '32.0.0'
buildTypes {
debug {
......@@ -29,14 +27,18 @@ android {
}
defaultConfig {
minSdkVersion 21
targetSdkVersion 31
targetSdkVersion 32
vectorDrawables.useSupportLibrary = true
}
kotlinOptions.freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn"
buildFeatures.viewBinding = true
buildFeatures.viewBinding true
lintOptions {
lintConfig file("${project.rootDir}/lint.xml")
}
}
dependencies {
......
......@@ -179,98 +179,84 @@ internal class ApiConfiguration(
val smartwalletEngine: String,
@SerializedName("app.blacklistFreqInMinutes")
val blacklistFreqInMinutes: Int,
@SerializedName("app.displaySickLeave")
val displaySickLeave: Boolean,
)
internal fun ApiConfiguration.toDomain(gson: Gson) = Configuration(
version = version,
versionCalibrationBle = versionCalibrationBle,
apiVersion = apiVersion,
cleaReportApiVersion = cleaReportApiVersion,
cleaStatusApiVersion = cleaStatusApiVersion,
displayAttestation = displayAttestation,
displayVaccination = displayVaccination,
dataRetentionPeriod = dataRetentionPeriod,
quarantinePeriod = quarantinePeriod,
checkStatusFrequencyHour = checkStatusFrequencyHour,
minStatusRetryDuration = minStatusRetryDuration,
randomStatusHour = randomStatusHour,
preSymptomsSpan = preSymptomsSpan,
minHourContactNotif = minHourContactNotif,
maxHourContactNotif = maxHourContactNotif,
displayDepartmentLevel = displayDepartmentLevel,
dontUseScannerHardwareBatching = gson.fromJson(
internal fun ApiConfiguration.toDomain(gson: Gson): Configuration {
val dontUseScannerHardwareBatchingList = gson.fromJson<List<String>?>(
dontUseScannerHardwareBatching,
object : TypeToken<List<String>?>() {}.type
),
filterConfig = filterConfig,
filterMode = filterMode,
serviceUUID = serviceUUID,
characteristicUUID = characteristicUUID,
backgroundServiceManufacturerData = backgroundServiceManufacturerData,
qrCodeDeletionHours = qrCodeDeletionHours,
qrCodeExpiredHours = qrCodeExpiredHours,
qrCodeFormattedString = qrCodeFormattedString,
qrCodeFormattedStringDisplayed = qrCodeFormattedStringDisplayed,
qrCodeFooterString = qrCodeFooterString,
venuesTimestampRoundingInterval = venuesTimestampRoundingInterval,
proximityReactivationReminderHours = gson.fromJson(proximityReactivationReminderHours, object : TypeToken<List<Int>>() {}.type),
venuesRetentionPeriod = venuesRetentionPeriod,
privateEventVenueType = privateEventVenueType,
displayRecordVenues = displayRecordVenues,
displayPrivateEvent = displayPrivateEvent,
displayIsolation = displayIsolation,
isolationMinRiskLevel = isolationMinRiskLevel,
positiveSampleSpan = positiveSampleSpan,
isolationDuration = isolationDuration,
postIsolationDuration = postIsolationDuration,
covidIsolationDuration = covidIsolationDuration,
venuesSalt = venuesSalt,
allowNoAdvertisingDevice = allowNoAdvertisingDevice,
unsupportedDevices = gson.fromJson(
)
val compareColorList = gson.fromJson<List<Map<String, String>>?>(
compareColors,
object : TypeToken<List<Map<String, String>>>() {}.type
)
val colorsCompareKeyFigures = compareColorList?.let {
try {
Configuration.ColorsCompareKeyFigures(
Configuration.ColorCompareKeyFigures(
it[0]["d"],
it[0]["l"]
),
Configuration.ColorCompareKeyFigures(
it[1]["d"],
it[1]["l"]
),
)
} catch (e: IndexOutOfBoundsException) {
null
}
}
val proximityReactivationReminderHourList = gson.fromJson<List<Int>>(
proximityReactivationReminderHours,
object : TypeToken<List<Int>>() {}.type,
)
val unsupportedDeviceList = gson.fromJson<List<String>?>(
unsupportedDevices,
object : TypeToken<List<String>?>() {}.type
),
vaccinationCentersCount = vaccinationCentersCount,
scanReportDelay = scanReportDelay,
contagiousSpan = contagiousSpan,
ameliUrl = ameliUrl,
displaySanitaryCertificatesWallet = displaySanitaryCertificatesWallet,
walletOldCertificateThresholdInDays = gson.fromJson(
)
val walletOldCertificateThresholdInDayMap = gson.fromJson<Map<String, Float>?>(
walletOldCertificateThresholdInDays,
object : TypeToken<Map<String, Float>?>() {}.type
),
walletPublicKeys = gson.fromJson(
)
val walletPublicKeyList = gson.fromJson<List<WalletPublicKey>?>(
walletPublicKeys,
object : TypeToken<List<WalletPublicKey>?>() {}.type
),
isAnalyticsOn = isAnalyticsOn,
analyticsApiVersion = analyticsApiVersion,
testCertificateValidityThresholds = gson.fromJson(testCertificateValidityThresholds, object : TypeToken<List<Int>>() {}.type),
cleaUrls = gson.fromJson(
)
val testCertificateValidityThresholdList = gson.fromJson<List<Int>>(
testCertificateValidityThresholds,
object : TypeToken<List<Int>>() {}.type
)
val cleaUrlList = gson.fromJson<List<String>?>(
cleaUrls,
object : TypeToken<List<String>?>() {}.type
),
covidPlusWarning = covidPlusWarning,
covidPlusNoTracing = covidPlusNoTracing,
displayCertificateConversion = displayCertificateConversion,
certificateConversionSidepOnlyCode = gson.fromJson(certificateConversionSidepOnlyCode, object : TypeToken<List<String>>() {}.type),
conversionPublicKey = gson.fromJson(conversionPublicKey, object : TypeToken<Map<String, String>>() {}.type),
conversionApiVersion = conversionApiVersion,
maxCertBeforeWarning = maxCertBeforeWarning,
noWaitDoses = (
gson.fromJson(
noWaitDoses,
object : TypeToken<List<ApiCodeValueEntry>>() {}.type
) as List<ApiCodeValueEntry>
).associate { Pair(it.code, it.value) },
ratingsKeyFiguresOpeningThreshold = ratingsKeyFiguresOpeningThreshold,
displayUrgentDgs = displayUrgentDgs,
notification = (
gson.fromJson(
notif,
object : TypeToken<Map<String, Any>?>() {}.type
) as Map<String, Any>?
)?.let {
)
val certificateConversionSidepOnlyCodeList = gson.fromJson<List<String>>(
certificateConversionSidepOnlyCode,
object : TypeToken<List<String>>() {}.type
)
val conversionPublicKeyMap = gson.fromJson<Map<String, String>>(conversionPublicKey, object : TypeToken<Map<String, String>>() {}.type)
val noWaitDoseList = gson.fromJson<List<ApiCodeValueEntry>>(
noWaitDoses,
object : TypeToken<List<ApiCodeValueEntry>>() {}.type
)
val noWaitDoseMap = noWaitDoseList.associate { Pair(it.code, it.value) }
val notifMap = gson.fromJson<Map<String, Any>?>(
notif,
object : TypeToken<Map<String, Any>?>() {}.type
)
val notification = notifMap?.let {
try {
Configuration.Notification(
title = (it["t"] as? String)!!,
......@@ -281,41 +267,13 @@ internal fun ApiConfiguration.toDomain(gson: Gson) = Configuration(
} catch (e: NullPointerException) {
null
}
},
generationServerPublicKey = generationServerPublicKey,
activityPassSkipNegTestHours = activityPassSkipNegTestHours,
displayActivityPass = displayActivityPass,
renewThreshold = renewThreshold,
smartWalletVacc = gson.fromJson(smartWalletVacc, SmartWalletVacc::class.java),
smartWalletNotif = smartWalletNotif,
isSmartWalletOn = isSmartWalletOn,
colorsCompareKeyFigures = (
gson.fromJson(
compareColors,
object : TypeToken<List<Map<String, String>>>() {}.type
) as List<Map<String, String>>?
)?.let {
try {
Configuration.ColorsCompareKeyFigures(
Configuration.ColorCompareKeyFigures(
it[0]["d"],
it[0]["l"]
),
Configuration.ColorCompareKeyFigures(
it[1]["d"],
it[1]["l"]
),
)
} catch (e: IndexOutOfBoundsException) {
null
}
},
keyFiguresCombination = (
gson.fromJson(
this.keyFiguresCombination,
object : TypeToken<List<Map<String, String>>>() {}.type
) as List<Map<String, String>>?
)?.let { list ->
}
val apiKeyFiguresCombinationList = gson.fromJson<List<Map<String, String>>>(
this.keyFiguresCombination,
object : TypeToken<List<Map<String, String>>>() {}.type
)
val keyFiguresCombinationList = apiKeyFiguresCombinationList?.let { list ->
list.map { map ->
Configuration.KeyFigureCombination(
map["t"],
......@@ -323,11 +281,94 @@ internal fun ApiConfiguration.toDomain(gson: Gson) = Configuration(
map["k2"]
)
}
},
dccKidsEmoji = gson.fromJson(dccKids, ApiDccKidsEmoji::class.java)?.dccKidsEmoji,
multipassConfig = gson.fromJson(multipassConfig, ApiMultipassConfig::class.java)?.toMultipassConfig(displayMultipass),
recoveryValidityThreshold = gson.fromJson(recoveryValidityThreshold, ApiRecoveryValidityThreshold::class.java)
?.toRecoveryValidityThreshold(),
smartWalletEngine = gson.fromJson(this.smartwalletEngine, ApiSmartWalletEngine::class.java)?.toSmartWalletEngine(),
blacklistRefreshFrequency = blacklistFreqInMinutes.minutes,
)
}
val smartWalletVacc = gson.fromJson(smartWalletVacc, SmartWalletVacc::class.java)
val dccKidsEmoji = gson.fromJson(dccKids, ApiDccKidsEmoji::class.java)?.dccKidsEmoji
val multipassConfig = gson.fromJson(multipassConfig, ApiMultipassConfig::class.java)?.toMultipassConfig(displayMultipass)
val recoveryValidityThreshold = gson.fromJson(recoveryValidityThreshold, ApiRecoveryValidityThreshold::class.java)
?.toRecoveryValidityThreshold()
val smartWalletEngine = gson.fromJson(this.smartwalletEngine, ApiSmartWalletEngine::class.java)?.toSmartWalletEngine()
return Configuration(
version = version,
versionCalibrationBle = versionCalibrationBle,
apiVersion = apiVersion,
cleaReportApiVersion = cleaReportApiVersion,
cleaStatusApiVersion = cleaStatusApiVersion,
displayAttestation = displayAttestation,
displayVaccination = displayVaccination,
dataRetentionPeriod = dataRetentionPeriod,
quarantinePeriod = quarantinePeriod,
checkStatusFrequencyHour = checkStatusFrequencyHour,
minStatusRetryDuration = minStatusRetryDuration,
randomStatusHour = randomStatusHour,
preSymptomsSpan = preSymptomsSpan,
minHourContactNotif = minHourContactNotif,
maxHourContactNotif = maxHourContactNotif,
displayDepartmentLevel = displayDepartmentLevel,
dontUseScannerHardwareBatching = dontUseScannerHardwareBatchingList,
filterConfig = filterConfig,
filterMode = filterMode,
serviceUUID = serviceUUID,
characteristicUUID = characteristicUUID,
backgroundServiceManufacturerData = backgroundServiceManufacturerData,
qrCodeDeletionHours = qrCodeDeletionHours,
qrCodeExpiredHours = qrCodeExpiredHours,
qrCodeFormattedString = qrCodeFormattedString,
qrCodeFormattedStringDisplayed = qrCodeFormattedStringDisplayed,
qrCodeFooterString = qrCodeFooterString,
venuesTimestampRoundingInterval = venuesTimestampRoundingInterval,
proximityReactivationReminderHours = proximityReactivationReminderHourList,
venuesRetentionPeriod = venuesRetentionPeriod,
privateEventVenueType = privateEventVenueType,
displayRecordVenues = displayRecordVenues,
displayPrivateEvent = displayPrivateEvent,
displayIsolation = displayIsolation,
isolationMinRiskLevel = isolationMinRiskLevel,
positiveSampleSpan = positiveSampleSpan,
isolationDuration = isolationDuration,
postIsolationDuration = postIsolationDuration,
covidIsolationDuration = covidIsolationDuration,
venuesSalt = venuesSalt,
allowNoAdvertisingDevice = allowNoAdvertisingDevice,
unsupportedDevices = unsupportedDeviceList,
vaccinationCentersCount = vaccinationCentersCount,
scanReportDelay = scanReportDelay,
contagiousSpan = contagiousSpan,
ameliUrl = ameliUrl,
displaySanitaryCertificatesWallet = displaySanitaryCertificatesWallet,
walletOldCertificateThresholdInDays = walletOldCertificateThresholdInDayMap,
walletPublicKeys = walletPublicKeyList,
isAnalyticsOn = isAnalyticsOn,
analyticsApiVersion = analyticsApiVersion,
testCertificateValidityThresholds = testCertificateValidityThresholdList,
cleaUrls = cleaUrlList,
covidPlusWarning = covidPlusWarning,
covidPlusNoTracing = covidPlusNoTracing,
displayCertificateConversion = displayCertificateConversion,
certificateConversionSidepOnlyCode = certificateConversionSidepOnlyCodeList,
conversionPublicKey = conversionPublicKeyMap,
conversionApiVersion = conversionApiVersion,
maxCertBeforeWarning = maxCertBeforeWarning,
noWaitDoses = noWaitDoseMap,
ratingsKeyFiguresOpeningThreshold = ratingsKeyFiguresOpeningThreshold,
displayUrgentDgs = displayUrgentDgs,
notification = notification,
generationServerPublicKey = generationServerPublicKey,
activityPassSkipNegTestHours = activityPassSkipNegTestHours,
displayActivityPass = displayActivityPass,
renewThreshold = renewThreshold,
smartWalletVacc = smartWalletVacc,
smartWalletNotif = smartWalletNotif,
isSmartWalletOn = isSmartWalletOn,
colorsCompareKeyFigures = colorsCompareKeyFigures,
keyFiguresCombination = keyFiguresCombinationList,
dccKidsEmoji = dccKidsEmoji,
multipassConfig = multipassConfig,
recoveryValidityThreshold = recoveryValidityThreshold,
smartWalletEngine = smartWalletEngine,
blacklistRefreshFrequency = blacklistFreqInMinutes.minutes,
displaySickLeave = displaySickLeave,
)
}
......@@ -9,7 +9,7 @@
-->
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="@integer/config_navAnimTime"
android:duration="@integer/material_motion_duration_short_2"
android:fromXDelta="100%"
android:interpolator="@android:anim/linear_interpolator"
android:toXDelta="0%" />
......
......@@ -9,7 +9,7 @@
-->
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="@integer/config_navAnimTime"
android:duration="@integer/material_motion_duration_short_2"
android:fromXDelta="0%"
android:interpolator="@android:anim/linear_interpolator"
android:toXDelta="-100%" />
......
......@@ -9,7 +9,7 @@
-->
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="@integer/config_navAnimTime"
android:duration="@integer/material_motion_duration_short_2"
android:fromXDelta="-100%"
android:interpolator="@android:anim/linear_interpolator"
android:toXDelta="0%" />
......
......@@ -9,7 +9,7 @@
-->
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="@integer/config_navAnimTime"
android:duration="@integer/material_motion_duration_short_2"
android:fromXDelta="0%"
android:interpolator="@android:anim/linear_interpolator"
android:toXDelta="100%" />
......
<!--
~ This Source Code Form is subject to the terms of the Mozilla Public
~ License, v. 2.0. If a copy of the MPL was not distributed with this
~ file, You can obtain one at https://mozilla.org/MPL/2.0/.
~
~ Authors
~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~ Created by Lunabee Studio / Date - 2020/15/05 - for the TOUS-ANTI-COVID project
-->
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/bottomSheetTextView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginHorizontal="@dimen/spacing_xlarge"
android:layout_marginTop="@dimen/spacing_large"
android:gravity="center"
android:textIsSelectable="false"
app:layout_constraintBottom_toTopOf="@id/mainButton"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="@tools:sample/lorem[12]" />
<com.google.android.material.button.MaterialButton
android:id="@+id/mainButton"
style="@style/Widget.StopCovid.Button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/spacing_large"
android:layout_marginVertical="@dimen/spacing_medium"
app:layout_constraintBottom_toTopOf="@id/dangerButton"
app:layout_constraintTop_toBottomOf="@id/bottomSheetTextView"
tools:text="@tools:sample/lorem[3]" />
<com.google.android.material.button.MaterialButton
android:id="@+id/dangerButton"
style="@style/Widget.StopCovid.Button.Danger"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/spacing_large"
app:layout_constraintBottom_toTopOf="@id/lightButton"
app:layout_constraintTop_toBottomOf="@id/mainButton"
tools:text="@tools:sample/lorem[3]" />
<com.google.android.material.button.MaterialButton
android:id="@+id/lightButton"
style="@style/Widget.StopCovid.Button.Light"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/spacing_large"
android:layout_marginVertical="@dimen/spacing_medium"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/dangerButton"
tools:text="@tools:sample/lorem[3]" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -12,9 +12,7 @@
<color name="color_primary_light">#2685BBFF</color>
<color name="color_on_primary_light">#FFFFFF</color>
<color name="color_no_risk">#51C495</color>
<color name="color_risk">#fd706a</color>
<color name="color_error_light">#331716</color>
<color name="color_icon_background">#000000</color>
<color name="color_east_bay">#B3B8E8</color>
</resources>
......@@ -17,14 +17,9 @@
<color name="color_on_error">#FFF</color>
<color name="color_alert">#FED042</color>
<color name="color_on_alert">#000000</color>
<color name="color_icon_background">#FFFFFF</color>
<color name="color_on_gradient">#FFFFFF</color>
<color name="color_black_33">#55000000</color>
<color name="color_indigo">#5770BE</color>
<color name="color_no_risk">#449976</color>
<color name="color_risk">#fd706a</color>
<color name="color_on_status_notification">#FFFFFF</color>
<color name="color_button_learn_more">#33000000</color>
<color name="color_persian_green">#00AC8C</color>
......@@ -34,15 +29,12 @@
<color name="color_trinidad">#E14800</color>
<color name="color_monza">#E1000F</color>
<color name="color_east_bay">#484D7A</color>
<color name="color_neon_carrot">#FF9940</color>
<color name="color_persian_blue">#0F31C8</color>
<color name="color_malibu">#85BBFF</color>
<color name="color_mercury">#E6E6E6</color>
<color name="color_mine_shaft">#313131</color>
<color name="color_tundora">#4D4C4C</color>
<color name="color_navy_blue">#000091</color>
<color name="color_galliano">#DBA90E</color>
<color name="color_pharlap">#A47984</color>
<color name="color_ferra">#7E4F5B</color>
<color name="color_kimberly">#6D7195</color>
......
......@@ -21,21 +21,16 @@
<dimen name="divider_height">0.5dp</dimen>
<dimen name="double_item_image_width">70dp</dimen>
<dimen name="icon_size">24dp</dimen>
<dimen name="icon_small_size">12dp</dimen>
<dimen name="icon_large_size">36dp</dimen>
<dimen name="link_icon_size">16dp</dimen>
<dimen name="logo_body_size">80dp</dimen>
<dimen name="logo_height">150dp</dimen>
<dimen name="min_logo_height">116dp</dimen>
<dimen name="warning_banner_separator_height">1dp</dimen>
<dimen name="caption_font_size">15sp</dimen>
<dimen name="small_caption_font_size">13sp</dimen>
<dimen name="circle_font_size">24sp</dimen>
<dimen name="error_font_size">15sp</dimen>
<dimen name="header_font_size">18sp</dimen>
<dimen name="indicator_font_size">24sp</dimen>
<dimen name="title_big_font_size">24sp</dimen>
<dimen name="key_figure_font_size">50sp</dimen>
<dimen name="home_key_figure_font_size">36sp</dimen>
<dimen name="title_font_size">18sp</dimen>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment