From 0319458a44ed84c8dec0ee30306ef4ad9554fd5e Mon Sep 17 00:00:00 2001 From: Matthias Urhahn <matthias.urhahn@sap.com> Date: Tue, 27 Oct 2020 17:08:59 +0100 Subject: [PATCH] Show different progress UIs for download and calculation (EXPOSUREAPP-2743) (#1486) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Two new progress states for the risk card+details. * Add unit tests for new card states. * Flatten UI of risk card to improve layouting performance on slow devices. * Remove stale strings from other translations. * UX wants the ... ¯\_(ツ)_/¯ Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com> --- .../fragment_test_risk_level_calculation.xml | 15 +- .../storage/TracingRepository.kt | 13 +- .../coronawarnapp/tracing/TracingProgress.kt | 10 + .../ui/main/home/HomeFragment.kt | 8 +- .../ui/tracing/card/TracingCardState.kt | 62 +-- .../tracing/card/TracingCardStateProvider.kt | 8 +- .../ui/tracing/common/BaseTracingState.kt | 43 +- .../ui/tracing/details/TracingDetailsState.kt | 11 +- .../details/TracingDetailsStateProvider.kt | 7 +- .../src/main/res/layout/fragment_home.xml | 27 +- .../main/res/layout/fragment_risk_details.xml | 29 +- ...card.xml => include_risk_card_content.xml} | 264 +++++++------ ....xml => include_risk_card_content_row.xml} | 10 +- .../src/main/res/values-bg/strings.xml | 4 - .../src/main/res/values-de/strings.xml | 17 +- .../src/main/res/values-en/strings.xml | 4 - .../src/main/res/values-pl/strings.xml | 4 - .../src/main/res/values-ro/strings.xml | 4 - .../src/main/res/values-tr/strings.xml | 4 - .../src/main/res/values/strings.xml | 17 +- .../ui/tracing/card/TracingCardStateTest.kt | 366 +++++++++++------- .../ui/tracing/common/BaseTracingStateTest.kt | 17 +- .../details/TracingDetailsStateTest.kt | 5 +- 23 files changed, 523 insertions(+), 426 deletions(-) create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/TracingProgress.kt rename Corona-Warn-App/src/main/res/layout/{include_risk_card.xml => include_risk_card_content.xml} (62%) rename Corona-Warn-App/src/main/res/layout/{include_risk_card_row.xml => include_risk_card_content_row.xml} (81%) diff --git a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_risk_level_calculation.xml b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_risk_level_calculation.xml index 43a834f09..06f6d5af7 100644 --- a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_risk_level_calculation.xml +++ b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_risk_level_calculation.xml @@ -42,14 +42,23 @@ android:layout_height="wrap_content" android:text="Preview (no interaction possible)" /> - <include + <FrameLayout android:id="@+id/test_risk_card" - layout="@layout/include_risk_card" + style="@style/card" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:visibility="@{FormatterSubmissionHelper.formatShowRiskStatusCard(submissionViewModel.deviceUiState)}" - app:tracingCard="@{tracingCard}" /> + android:focusable="true" + android:backgroundTint="@{tracingCard.getRiskInfoContainerBackgroundTint(context)}" + android:backgroundTintMode="src_over"> + + <include + android:id="@+id/risk_card_content" + layout="@layout/include_risk_card_content" + app:tracingCard="@{tracingCard}" /> + + </FrameLayout> <LinearLayout android:layout_width="match_parent" diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/TracingRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/TracingRepository.kt index 131d74757..ee61db71c 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/TracingRepository.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/TracingRepository.kt @@ -8,6 +8,7 @@ import de.rki.coronawarnapp.nearby.ENFClient import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient import de.rki.coronawarnapp.risk.TimeVariables.getActiveTracingDaysInRetentionPeriod import de.rki.coronawarnapp.timer.TimerHelper +import de.rki.coronawarnapp.tracing.TracingProgress import de.rki.coronawarnapp.transaction.RetrieveDiagnosisKeysTransaction import de.rki.coronawarnapp.transaction.RiskLevelTransaction import de.rki.coronawarnapp.util.ConnectivityHelper @@ -57,12 +58,16 @@ class TracingRepository @Inject constructor( } // TODO shouldn't access this directly - val internalIsRefreshing = MutableStateFlow(false) - val isRefreshing: Flow<Boolean> = combine( + private val internalIsRefreshing = MutableStateFlow(false) + val tracingProgress: Flow<TracingProgress> = combine( internalIsRefreshing, enfClient.isCurrentlyCalculating() - ) { isRefreshing, isCalculating -> - isRefreshing || isCalculating + ) { isDownloading, isCalculating -> + when { + isDownloading -> TracingProgress.Downloading + isCalculating -> TracingProgress.ENFIsCalculating + else -> TracingProgress.Idle + } } /** diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/TracingProgress.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/TracingProgress.kt new file mode 100644 index 000000000..aa4416de0 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/TracingProgress.kt @@ -0,0 +1,10 @@ +package de.rki.coronawarnapp.tracing + +sealed class TracingProgress { + + object Idle : TracingProgress() + + object Downloading : TracingProgress() + + object ENFIsCalculating : TracingProgress() +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragment.kt index 1c5a321dd..2b85288ee 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragment.kt @@ -116,10 +116,10 @@ class HomeFragment : Fragment(R.layout.fragment_home), AutoInject { } private fun setupRiskCard() { - binding.mainRisk.apply { - riskCard.setOnClickListener { - doNavigate(HomeFragmentDirections.actionMainFragmentToRiskDetailsFragment()) - } + binding.riskCard.setOnClickListener { + doNavigate(HomeFragmentDirections.actionMainFragmentToRiskDetailsFragment()) + } + binding.riskCardContent.apply { riskCardButtonUpdate.setOnClickListener { vm.refreshDiagnosisKeys() vm.settingsViewModel.updateManualKeyRetrievalEnabled(false) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardState.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardState.kt index aa993a6b3..56a85ecc4 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardState.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardState.kt @@ -1,19 +1,21 @@ package de.rki.coronawarnapp.ui.tracing.card import android.content.Context +import android.content.res.ColorStateList import android.graphics.drawable.Drawable import android.text.format.DateUtils import de.rki.coronawarnapp.R import de.rki.coronawarnapp.risk.RiskLevelConstants import de.rki.coronawarnapp.risk.TimeVariables import de.rki.coronawarnapp.tracing.GeneralTracingStatus +import de.rki.coronawarnapp.tracing.TracingProgress import de.rki.coronawarnapp.ui.tracing.common.BaseTracingState import java.util.Date data class TracingCardState( override val tracingStatus: GeneralTracingStatus.Status, override val riskLevelScore: Int, - override val isRefreshing: Boolean, + override val tracingProgress: TracingProgress, override val lastRiskLevelScoreCalculated: Int, override val matchedKeyCount: Int, override val daysSinceLastExposure: Int, @@ -62,7 +64,7 @@ data class TracingCardState( RiskLevelConstants.LOW_LEVEL_RISK, RiskLevelConstants.INCREASED_RISK, RiskLevelConstants.UNKNOWN_RISK_INITIAL -> { - val arg = formatRiskLevelHeadline(c, lastRiskLevelScoreCalculated, false) + val arg = formatRiskLevelHeadline(c, lastRiskLevelScoreCalculated) c.getString(R.string.risk_card_no_calculation_possible_body_saved_risk) .format(arg) } @@ -260,29 +262,37 @@ data class TracingCardState( fun showUpdateButton(): Boolean = !isTracingOffRiskLevel() && !isBackgroundJobEnabled && !showDetails - /** - * Formats the risk card headline depending on risk level - * Special case of a running update is caught - */ - fun getRiskLevelHeadline(c: Context): String = - formatRiskLevelHeadline(c, riskLevelScore, isRefreshing) + fun getRiskLevelHeadline(c: Context) = formatRiskLevelHeadline(c, riskLevelScore) - private fun formatRiskLevelHeadline(c: Context, riskLevelScore: Int, isRefreshing: Boolean) = - if (isRefreshing) { - c.getString(R.string.risk_card_loading_headline) - } else { - when (riskLevelScore) { - RiskLevelConstants.INCREASED_RISK -> c.getString(R.string.risk_card_increased_risk_headline) - RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS -> - c.getString(R.string.risk_card_outdated_risk_headline) - RiskLevelConstants.NO_CALCULATION_POSSIBLE_TRACING_OFF -> - c.getString(R.string.risk_card_no_calculation_possible_headline) - RiskLevelConstants.LOW_LEVEL_RISK -> c.getString(R.string.risk_card_low_risk_headline) - RiskLevelConstants.UNKNOWN_RISK_INITIAL -> - c.getString(R.string.risk_card_unknown_risk_headline) - RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS_MANUAL -> - c.getString(R.string.risk_card_unknown_risk_headline) - else -> "" - } - } + fun formatRiskLevelHeadline(c: Context, riskLevelScore: Int) = when (riskLevelScore) { + RiskLevelConstants.INCREASED_RISK -> R.string.risk_card_increased_risk_headline + RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS -> R.string.risk_card_outdated_risk_headline + RiskLevelConstants.NO_CALCULATION_POSSIBLE_TRACING_OFF -> R.string.risk_card_no_calculation_possible_headline + RiskLevelConstants.LOW_LEVEL_RISK -> R.string.risk_card_low_risk_headline + RiskLevelConstants.UNKNOWN_RISK_INITIAL -> R.string.risk_card_unknown_risk_headline + RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS_MANUAL -> R.string.risk_card_unknown_risk_headline + else -> null + }?.let { c.getString(it) } ?: "" + + fun getProgressCardHeadline(c: Context): String = when (tracingProgress) { + TracingProgress.Downloading -> R.string.risk_card_progress_download_headline + TracingProgress.ENFIsCalculating -> R.string.risk_card_progress_calculation_headline + TracingProgress.Idle -> null + }?.let { c.getString(it) } ?: "" + + fun getProgressCardBody(c: Context): String = when (tracingProgress) { + TracingProgress.Downloading -> R.string.risk_card_progress_download_body + TracingProgress.ENFIsCalculating -> R.string.risk_card_progress_calculation_body + TracingProgress.Idle -> null + }?.let { c.getString(it) } ?: "" + + fun isTracingInProgress(): Boolean = tracingProgress != TracingProgress.Idle + + fun getRiskInfoContainerBackgroundTint(c: Context): ColorStateList = when (riskLevelScore) { + RiskLevelConstants.INCREASED_RISK -> R.color.card_increased + RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS -> R.color.card_outdated + RiskLevelConstants.NO_CALCULATION_POSSIBLE_TRACING_OFF -> R.color.card_no_calculation + RiskLevelConstants.LOW_LEVEL_RISK -> R.color.card_low + else -> R.color.card_unknown + }.let { c.getColorStateList(it) } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardStateProvider.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardStateProvider.kt index 91406137d..7e2f05d5b 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardStateProvider.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardStateProvider.kt @@ -34,8 +34,8 @@ class TracingCardStateProvider @Inject constructor( RiskLevelRepository.riskLevelScoreLastSuccessfulCalculated.onEach { Timber.v("riskLevelScoreLastSuccessfulCalculated: $it") }, - tracingRepository.isRefreshing.onEach { - Timber.v("isRefreshing: $it") + tracingRepository.tracingProgress.onEach { + Timber.v("tracingProgress: $it") }, ExposureSummaryRepository.matchedKeyCount.onEach { Timber.v("matchedKeyCount: $it") @@ -61,7 +61,7 @@ class TracingCardStateProvider @Inject constructor( ) { status, riskLevelScore, riskLevelScoreLastSuccessfulCalculated, - isRefreshing, + tracingProgress, matchedKeyCount, daysSinceLastExposure, activeTracingDaysInRetentionPeriod, @@ -73,7 +73,7 @@ class TracingCardStateProvider @Inject constructor( TracingCardState( tracingStatus = status, riskLevelScore = riskLevelScore, - isRefreshing = isRefreshing, + tracingProgress = tracingProgress, lastRiskLevelScoreCalculated = riskLevelScoreLastSuccessfulCalculated, lastTimeDiagnosisKeysFetched = lastTimeDiagnosisKeysFetched, matchedKeyCount = matchedKeyCount, diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/common/BaseTracingState.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/common/BaseTracingState.kt index 6ba53ca9f..0961bf1c4 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/common/BaseTracingState.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/common/BaseTracingState.kt @@ -1,18 +1,17 @@ package de.rki.coronawarnapp.ui.tracing.common import android.content.Context -import android.content.res.ColorStateList -import android.graphics.drawable.Drawable import de.rki.coronawarnapp.R import de.rki.coronawarnapp.risk.RiskLevelConstants import de.rki.coronawarnapp.tracing.GeneralTracingStatus +import de.rki.coronawarnapp.tracing.TracingProgress import de.rki.coronawarnapp.util.TimeAndDateExtensions.millisecondsToHMS import java.util.Date abstract class BaseTracingState { abstract val tracingStatus: GeneralTracingStatus.Status abstract val riskLevelScore: Int - abstract val isRefreshing: Boolean + abstract val tracingProgress: TracingProgress abstract val lastRiskLevelScoreCalculated: Int abstract val matchedKeyCount: Int abstract val daysSinceLastExposure: Int @@ -23,36 +22,16 @@ abstract class BaseTracingState { abstract val isManualKeyRetrievalEnabled: Boolean abstract val manualKeyRetrievalTime: Long - fun getRiskShape(c: Context): Drawable? = - c.getDrawable(if (showDetails) R.drawable.rectangle else R.drawable.card) - - /** - * Formats the risk card colors for default and pressed states depending on risk level - */ - fun getRiskColor(c: Context): Int { - val colorRes = when (riskLevelScore) { - RiskLevelConstants.INCREASED_RISK -> R.color.colorSemanticHighRisk - RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS, - RiskLevelConstants.NO_CALCULATION_POSSIBLE_TRACING_OFF -> R.color.colorSemanticUnknownRisk - RiskLevelConstants.LOW_LEVEL_RISK -> R.color.colorSemanticLowRisk - else -> R.color.colorSemanticNeutralRisk - } - return c.getColor(colorRes) - } - /** * Formats the risk card colors for default and pressed states depending on risk level */ - fun getRiskColorStateList(c: Context): ColorStateList? { - val resource = when (riskLevelScore) { - RiskLevelConstants.INCREASED_RISK -> R.color.card_increased - RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS -> R.color.card_outdated - RiskLevelConstants.NO_CALCULATION_POSSIBLE_TRACING_OFF -> R.color.card_no_calculation - RiskLevelConstants.LOW_LEVEL_RISK -> R.color.card_low - else -> R.color.card_unknown - } - return c.getColorStateList(resource) - } + fun getRiskColor(c: Context): Int = when (riskLevelScore) { + RiskLevelConstants.INCREASED_RISK -> R.color.colorSemanticHighRisk + RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS, + RiskLevelConstants.NO_CALCULATION_POSSIBLE_TRACING_OFF -> R.color.colorSemanticUnknownRisk + RiskLevelConstants.LOW_LEVEL_RISK -> R.color.colorSemanticLowRisk + else -> R.color.colorSemanticNeutralRisk + }.let { c.getColor(it) } fun isTracingOffRiskLevel(): Boolean = when (riskLevelScore) { RiskLevelConstants.NO_CALCULATION_POSSIBLE_TRACING_OFF, @@ -74,7 +53,5 @@ abstract class BaseTracingState { c.getString(R.string.risk_card_button_cooldown).format(hmsCooldownTime) } - fun isUpdateButtonEnabled(): Boolean { - return isManualKeyRetrievalEnabled - } + fun isUpdateButtonEnabled(): Boolean = isManualKeyRetrievalEnabled } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/details/TracingDetailsState.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/details/TracingDetailsState.kt index a32b4f8ec..7db5aa19c 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/details/TracingDetailsState.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/details/TracingDetailsState.kt @@ -4,13 +4,14 @@ import android.content.Context import de.rki.coronawarnapp.R import de.rki.coronawarnapp.risk.RiskLevelConstants import de.rki.coronawarnapp.tracing.GeneralTracingStatus +import de.rki.coronawarnapp.tracing.TracingProgress import de.rki.coronawarnapp.ui.tracing.common.BaseTracingState import java.util.Date data class TracingDetailsState( override val tracingStatus: GeneralTracingStatus.Status, override val riskLevelScore: Int, - override val isRefreshing: Boolean, + override val tracingProgress: TracingProgress, override val lastRiskLevelScoreCalculated: Int, override val matchedKeyCount: Int, override val daysSinceLastExposure: Int, @@ -110,9 +111,7 @@ data class TracingDetailsState( * Formats the risk logged period card text display of tracing active duration in days depending on risk level * Displayed in case riskLevel is High and Low level */ - fun getRiskActiveTracingDaysInRetentionPeriodLogged(c: Context): String { - return c.getString( - R.string.risk_details_information_body_period_logged_assessment - ).format(activeTracingDaysInRetentionPeriod) - } + fun getRiskActiveTracingDaysInRetentionPeriodLogged(c: Context): String = c.getString( + R.string.risk_details_information_body_period_logged_assessment + ).format(activeTracingDaysInRetentionPeriod) } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/details/TracingDetailsStateProvider.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/details/TracingDetailsStateProvider.kt index 61627a9a7..f07401a32 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/details/TracingDetailsStateProvider.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/tracing/details/TracingDetailsStateProvider.kt @@ -29,7 +29,7 @@ class TracingDetailsStateProvider @Inject constructor( tracingStatus.generalStatus, RiskLevelRepository.riskLevelScore, RiskLevelRepository.riskLevelScoreLastSuccessfulCalculated, - tracingRepository.isRefreshing, + tracingRepository.tracingProgress, ExposureSummaryRepository.matchedKeyCount, ExposureSummaryRepository.daysSinceLastExposure, tracingRepository.activeTracingDaysInRetentionPeriod, @@ -40,7 +40,8 @@ class TracingDetailsStateProvider @Inject constructor( ) { status, riskLevelScore, riskLevelScoreLastSuccessfulCalculated, - isRefreshing, matchedKeyCount, + tracingProgress, + matchedKeyCount, daysSinceLastExposure, activeTracingDaysInRetentionPeriod, lastTimeDiagnosisKeysFetched, isBackgroundJobEnabled, @@ -58,7 +59,7 @@ class TracingDetailsStateProvider @Inject constructor( TracingDetailsState( tracingStatus = status, riskLevelScore = riskLevelScore, - isRefreshing = isRefreshing, + tracingProgress = tracingProgress, lastRiskLevelScoreCalculated = riskLevelScoreLastSuccessfulCalculated, matchedKeyCount = matchedKeyCount, daysSinceLastExposure = daysSinceLastExposure, diff --git a/Corona-Warn-App/src/main/res/layout/fragment_home.xml b/Corona-Warn-App/src/main/res/layout/fragment_home.xml index 2ea113515..7b1ebe31b 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_home.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_home.xml @@ -126,17 +126,26 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/main_tracing" /> - <include - android:id="@+id/main_risk" - layout="@layout/include_risk_card" - android:layout_width="@dimen/match_constraint" + <FrameLayout + android:id="@+id/risk_card" + style="@style/card" + gone="@{tracingCard == null || submissionCard == null || !submissionCard.isRiskCardVisible()}" + android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" - gone="@{tracingCard == null || submissionCard == null || !submissionCard.isRiskCardVisible()}" + android:focusable="true" + android:backgroundTint="@{tracingCard.getRiskInfoContainerBackgroundTint(context)}" + android:backgroundTintMode="src_over" app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" app:layout_constraintStart_toStartOf="@+id/guideline_card_start" - app:layout_constraintTop_toBottomOf="@+id/main_tracing_divider" - app:tracingCard="@{tracingCard}" /> + app:layout_constraintTop_toBottomOf="@+id/main_tracing_divider"> + + <include + android:id="@+id/risk_card_content" + layout="@layout/include_risk_card_content" + app:tracingCard="@{tracingCard}" /> + + </FrameLayout> <!-- submission status cards --> <include @@ -148,7 +157,7 @@ gone="@{submissionCard == null || !submissionCard.isUnregisteredCardVisible()}" app:layout_constraintEnd_toStartOf="@+id/guideline_card_end" app:layout_constraintStart_toStartOf="@+id/guideline_card_start" - app:layout_constraintTop_toBottomOf="@id/main_risk" /> + app:layout_constraintTop_toBottomOf="@id/risk_card" /> <include android:id="@+id/main_test_result" @@ -224,7 +233,7 @@ app:layout_constraintStart_toStartOf="@+id/guideline_card_start" app:layout_constraintTop_toBottomOf="@+id/main_barrier" app:layout_constraintBottom_toBottomOf="@+id/guideline_bottom" - app:layout_constraintVertical_bias="0.0"/> + app:layout_constraintVertical_bias="0.0" /> <include layout="@layout/merge_guidelines_side" /> diff --git a/Corona-Warn-App/src/main/res/layout/fragment_risk_details.xml b/Corona-Warn-App/src/main/res/layout/fragment_risk_details.xml index 9a0c92b64..b2248af9e 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_risk_details.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_risk_details.xml @@ -26,8 +26,9 @@ android:id="@+id/risk_details_header" android:layout_width="match_parent" android:layout_height="@dimen/header" - android:background="@{tracingDetails.getRiskShape(context)}" - android:backgroundTint="@{tracingDetails.getRiskColorStateList(context)}" + android:background="@drawable/rectangle" + android:backgroundTint="@{tracingDetails.getRiskColor(context)}" + android:backgroundTintMode="src_over" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> @@ -99,17 +100,25 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - <include - android:id="@+id/risk_details_risk_card" - layout="@layout/include_risk_card" + <FrameLayout + android:id="@+id/risk_card" + gone="@{tracingCard == null}" android:layout_width="0dp" android:layout_height="wrap_content" - android:focusable="false" - gone="@{tracingCard == null}" + android:background="@drawable/rectangle" + android:backgroundTint="@{tracingCard.getRiskInfoContainerBackgroundTint(context)}" + android:backgroundTintMode="src_over" + android:padding="@dimen/spacing_normal" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:tracingCard="@{tracingCard}" /> + app:layout_constraintTop_toTopOf="parent"> + + <include + android:id="@+id/risk_card_content" + layout="@layout/include_risk_card_content" + app:tracingCard="@{tracingCard}" /> + + </FrameLayout> <include android:id="@+id/risk_details_additional_information" @@ -119,7 +128,7 @@ android:focusable="false" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/risk_details_risk_card" + app:layout_constraintTop_toBottomOf="@id/risk_card" gone="@{!tracingDetails.isAdditionalInformationVisible}" /> <TextView diff --git a/Corona-Warn-App/src/main/res/layout/include_risk_card.xml b/Corona-Warn-App/src/main/res/layout/include_risk_card_content.xml similarity index 62% rename from Corona-Warn-App/src/main/res/layout/include_risk_card.xml rename to Corona-Warn-App/src/main/res/layout/include_risk_card_content.xml index e10715329..bcbad4136 100644 --- a/Corona-Warn-App/src/main/res/layout/include_risk_card.xml +++ b/Corona-Warn-App/src/main/res/layout/include_risk_card_content.xml @@ -1,281 +1,287 @@ <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> <data> + <variable name="tracingCard" type="de.rki.coronawarnapp.ui.tracing.card.TracingCardState" /> </data> - <androidx.constraintlayout.widget.ConstraintLayout - android:id="@+id/risk_card" - style="@style/card" + <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@{tracingCard.getRiskShape(context)}" - android:backgroundTint="@{tracingCard.getRiskColorStateList(context)}" - android:focusable="true"> + tools:background="@drawable/rectangle" + tools:backgroundTint="@color/card_low" + tools:padding="@dimen/spacing_normal"> <androidx.constraintlayout.widget.ConstraintLayout - android:id="@+id/risk_card_header" - android:layout_width="@dimen/match_constraint" + gone="@{tracingCard == null || !tracingCard.isTracingInProgress()}" + android:layout_width="match_parent" android:layout_height="wrap_content" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent"> + app:layout_constraintTop_toTopOf="parent" + tools:visibility="gone"> <TextView - android:id="@+id/risk_card_header_headline" - android:accessibilityHeading="true" + android:id="@+id/risk_card_progress_headline" style="@style/headline5" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginEnd="@dimen/spacing_normal" - android:text="@{tracingCard.getRiskLevelHeadline(context)}" - android:textColor="@{tracingCard.getStableTextColor(context)}" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toStartOf="@+id/risk_card_header_icon" + android:layout_marginEnd="16dp" + android:accessibilityHeading="true" + android:text="@{tracingCard.getProgressCardHeadline(context)}" + android:textColor="@color/colorStableLight" + app:layout_constraintEnd_toStartOf="@+id/risk_card_progress_headline_icon" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + app:layout_goneMarginEnd="0dp" + tools:text="Daten werden herunter geladen" /> <ImageView - android:id="@+id/risk_card_header_icon" + android:id="@+id/risk_card_progress_headline_icon" + gone="@{tracingCard.showDetails}" android:layout_width="@dimen/icon_size_risk_card" android:layout_height="@dimen/icon_size_risk_card" android:importantForAccessibility="no" android:src="@drawable/ic_forward" - android:tint="@{tracingCard.getStableTextColor(context)}" - gone="@{tracingCard.showDetails}" + android:tint="@color/colorStableLight" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> - </androidx.constraintlayout.widget.ConstraintLayout> - - <!-- Loading State --> - <androidx.constraintlayout.widget.ConstraintLayout - android:layout_width="@dimen/match_constraint" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_normal" - gone="@{!tracingCard.refreshing}" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/risk_card_header"> - <ProgressBar - android:id="@+id/risk_card_progress" + android:id="@+id/risk_card_progress_indicator" style="@style/progressBar" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginStart="@dimen/spacing_small" + android:layout_width="36dp" + android:layout_height="36dp" android:indeterminate="true" - app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintBottom_toBottomOf="@+id/textView2" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="@+id/textView2" /> <TextView + android:id="@+id/textView2" style="@style/subtitle" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacing_small" - android:text="@string/risk_card_loading_body" - android:textColor="@{tracingCard.getStableTextColor(context)}" + android:layout_marginTop="24dp" + android:text="@{tracingCard.getProgressCardBody(context)}" + android:textColor="@color/colorStableLight" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@id/risk_card_progress" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintStart_toEndOf="@id/risk_card_progress_indicator" + app:layout_constraintTop_toBottomOf="@+id/risk_card_progress_headline" + tools:text="Es werden aktuelle Daten heruntergeladen. Dies kann mehrere Minuten dauern." /> + </androidx.constraintlayout.widget.ConstraintLayout> - <!-- Card Content --> <androidx.constraintlayout.widget.ConstraintLayout - android:layout_width="0dp" - android:layout_height="wrap_content" - gone="@{tracingCard.refreshing}" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/risk_card_header"> + android:id="@+id/risk_card_content" + gone="@{tracingCard == null || tracingCard.isTracingInProgress()}" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <TextView + android:id="@+id/risk_card_header_headline" + style="@style/headline5" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginEnd="16dp" + android:accessibilityHeading="true" + android:text="@{tracingCard.getRiskLevelHeadline(context)}" + android:textColor="@{tracingCard.getStableTextColor(context)}" + app:layout_constraintEnd_toStartOf="@+id/risk_card_header_icon" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_goneMarginEnd="0dp" + tools:text="@string/risk_card_low_risk_headline" + tools:textColor="@color/colorStableLight" /> + + <ImageView + android:id="@+id/risk_card_header_icon" + gone="@{tracingCard.showDetails}" + android:layout_width="@dimen/icon_size_risk_card" + android:layout_height="@dimen/icon_size_risk_card" + android:importantForAccessibility="no" + tools:tint="@color/colorStableLight" + android:src="@drawable/ic_forward" + android:tint="@{tracingCard.getStableTextColor(context)}" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/risk_card_body" style="@style/subtitle" + gone="@{tracingCard.getRiskBody(context).empty}" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@{tracingCard.getRiskBody(context)}" android:textColor="@{tracingCard.getStableTextColor(context)}" - gone="@{tracingCard.getRiskBody(context).empty}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toBottomOf="@+id/risk_card_header_headline" + tools:text="@string/risk_card_outdated_risk_body" + tools:textColor="@color/colorStableLight" /> <include android:id="@+id/risk_card_row_saved_risk" - layout="@layout/include_risk_card_row" + gone="@{tracingCard.getSavedRiskBody(context).empty}" + layout="@layout/include_risk_card_content_row" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" - gone="@{tracingCard.getSavedRiskBody(context).empty}" app:body="@{tracingCard.getSavedRiskBody(context)}" + app:bodyTextColor="@{tracingCard.getStableTextColor(context)}" app:icon="@{@drawable/ic_risk_card_saved_risk}" + app:iconTint="@{tracingCard.getStableIconColor(context)}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/risk_card_body" - app:iconTint="@{tracingCard.getStableIconColor(context)}" - app:bodyTextColor="@{tracingCard.getStableTextColor(context)}" /> + app:layout_constraintTop_toBottomOf="@+id/risk_card_body" /> <include android:id="@+id/risk_card_row_contact" - layout="@layout/include_risk_card_row" + gone="@{tracingCard.getRiskContactBody(context).empty}" + layout="@layout/include_risk_card_content_row" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" - gone="@{tracingCard.getRiskContactBody(context).empty}" app:body="@{tracingCard.getRiskContactBody(context)}" + app:bodyTextColor="@{tracingCard.getStableTextColor(context)}" app:icon="@{tracingCard.getRiskContactIcon(context)}" + app:iconTint="@{tracingCard.getStableIconColor(context)}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/risk_card_row_saved_risk" - app:iconTint="@{tracingCard.getStableIconColor(context)}" - app:bodyTextColor="@{tracingCard.getStableTextColor(context)}" /> + app:layout_constraintTop_toBottomOf="@+id/risk_card_row_saved_risk" /> <include android:id="@+id/risk_card_row_contact_last" - layout="@layout/include_risk_card_row" + gone="@{tracingCard.getRiskContactLast(context).empty}" + layout="@layout/include_risk_card_content_row" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_tiny" - gone="@{tracingCard.getRiskContactLast(context).empty}" app:body="@{tracingCard.getRiskContactLast(context)}" + app:bodyTextColor="@{tracingCard.getStableTextColor(context)}" app:icon="@{@drawable/ic_risk_card_calendar}" + app:iconTint="@{tracingCard.getStableIconColor(context)}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/risk_card_row_contact" - app:iconTint="@{tracingCard.getStableIconColor(context)}" - app:bodyTextColor="@{tracingCard.getStableTextColor(context)}" /> + app:layout_constraintTop_toBottomOf="@+id/risk_card_row_contact" /> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/risk_card_row_saved_days" + gone="@{tracingCard.getRiskActiveTracingDaysInRetentionPeriod(context).empty}" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_tiny" - gone="@{tracingCard.getRiskActiveTracingDaysInRetentionPeriod(context).empty}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/risk_card_row_contact_last"> - - <androidx.constraintlayout.widget.ConstraintLayout + <de.rki.coronawarnapp.ui.view.CircleProgress android:id="@+id/risk_card_row_saved_days_circle_progress" - android:layout_width="@dimen/icon_size_risk_card" - android:layout_height="@dimen/icon_size_risk_card" - app:layout_constraintBottom_toBottomOf="parent" + android:layout_width="@dimen/circle_small" + android:layout_height="@dimen/circle_small" + android:layout_marginStart="8dp" + app:circleColor="@color/colorStableHairlineLight" + app:circleWidth="@dimen/circle_small_width" + app:disableText="true" + app:layout_constraintBottom_toBottomOf="@+id/risk_card_row_saved_days_body" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent"> - - <de.rki.coronawarnapp.ui.view.CircleProgress - android:layout_width="@dimen/circle_small" - android:layout_height="@dimen/circle_small" - app:circleColor="@color/colorStableHairlineLight" - app:circleWidth="@dimen/circle_small_width" - app:disableText="true" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:progress="@{tracingCard.activeTracingDaysInRetentionPeriod}" - app:progressColor="@color/colorStableLight" /> - - </androidx.constraintlayout.widget.ConstraintLayout> + app:layout_constraintTop_toTopOf="@+id/risk_card_row_saved_days_body" + app:progress="@{tracingCard.activeTracingDaysInRetentionPeriod}" + app:progressColor="@color/colorStableLight" /> <TextView android:id="@+id/risk_card_row_saved_days_body" style="@style/subtitle" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/spacing_small" + android:layout_marginStart="24dp" android:text="@{tracingCard.getRiskActiveTracingDaysInRetentionPeriod(context)}" android:textColor="@{tracingCard.getStableTextColor(context)}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/risk_card_row_saved_days_circle_progress" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + tools:text="@string/risk_card_body_saved_days" + tools:textColor="@color/colorStableLight" /> </androidx.constraintlayout.widget.ConstraintLayout> <include android:id="@+id/risk_card_row_time_fetched" - layout="@layout/include_risk_card_row" + gone="@{tracingCard.getTimeFetched(context).empty}" + layout="@layout/include_risk_card_content_row" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_tiny" - gone="@{tracingCard.getTimeFetched(context).empty}" app:body="@{tracingCard.getTimeFetched(context)}" + app:bodyTextColor="@{tracingCard.getStableTextColor(context)}" app:icon="@{@drawable/ic_risk_card_time_fetched}" + app:iconTint="@{tracingCard.getStableIconColor(context)}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/risk_card_row_saved_days" - app:iconTint="@{tracingCard.getStableIconColor(context)}" - app:bodyTextColor="@{tracingCard.getStableTextColor(context)}" /> - + app:layout_constraintTop_toBottomOf="@+id/risk_card_row_saved_days" /> - <androidx.constraintlayout.widget.ConstraintLayout - android:id="@+id/risk_card_next_update" + <include + android:id="@+id/risk_card_next_update_divider" + gone="@{tracingCard.getNextUpdate(context).empty}" + layout="@layout/include_divider" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" - gone="@{tracingCard.getNextUpdate(context).empty}" + app:dividerColor="@{tracingCard.getStableDividerColor(context)}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/risk_card_row_time_fetched"> - - <include - android:id="@+id/risk_card_next_update_divider" - layout="@layout/include_divider" - android:layout_width="@dimen/match_constraint" - android:layout_height="wrap_content" - app:dividerColor="@{tracingCard.getStableDividerColor(context)}" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - - <TextView - style="@style/body2" - android:layout_width="@dimen/match_constraint" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_small" - android:text="@{tracingCard.getNextUpdate(context)}" - android:textColor="@{tracingCard.getStableTextColor(context)}" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/risk_card_next_update_divider" /> + app:layout_constraintTop_toBottomOf="@+id/risk_card_row_time_fetched" /> - </androidx.constraintlayout.widget.ConstraintLayout> + <TextView + android:id="@+id/risk_card_next_update_test" + style="@style/body2" + gone="@{tracingCard.getNextUpdate(context).empty}" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_small" + android:text="@{tracingCard.getNextUpdate(context)}" + android:textColor="@{tracingCard.getStableTextColor(context)}" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/risk_card_next_update_divider" + tools:text="@string/risk_card_body_next_update" + tools:textColor="@color/colorStableLight" /> <Button android:id="@+id/risk_card_button_enable_tracing" style="@style/buttonPrimary" + gone="@{!tracingCard.showTracingButton()}" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:text="@string/risk_details_button_enable_tracing" - gone="@{!tracingCard.showTracingButton()}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/risk_card_next_update" /> + app:layout_constraintTop_toBottomOf="@+id/risk_card_next_update_test" /> <Button android:id="@+id/risk_card_button_update" style="@style/buttonLight" + gone="@{!tracingCard.showUpdateButton()}" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" android:enabled="@{tracingCard.isUpdateButtonEnabled()}" android:text="@{tracingCard.getUpdateButtonText(context)}" - gone="@{!tracingCard.showUpdateButton()}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/risk_card_button_enable_tracing" /> + app:layout_constraintTop_toBottomOf="@+id/risk_card_button_enable_tracing" + tools:text="@string/risk_card_button_cooldown" /> </androidx.constraintlayout.widget.ConstraintLayout> - - </androidx.constraintlayout.widget.ConstraintLayout> + </FrameLayout> </layout> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/layout/include_risk_card_row.xml b/Corona-Warn-App/src/main/res/layout/include_risk_card_content_row.xml similarity index 81% rename from Corona-Warn-App/src/main/res/layout/include_risk_card_row.xml rename to Corona-Warn-App/src/main/res/layout/include_risk_card_content_row.xml index b1f8d63b9..3b737e44f 100644 --- a/Corona-Warn-App/src/main/res/layout/include_risk_card_row.xml +++ b/Corona-Warn-App/src/main/res/layout/include_risk_card_content_row.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> <data> @@ -35,7 +36,8 @@ android:tint="@{iconTint}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + tools:src="@drawable/ic_risk_details_home" /> <TextView android:id="@+id/risk_card_row_body" @@ -48,6 +50,8 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/risk_card_row_icon" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + tools:text="@string/lorem_ipsum" + tools:textColor="@color/colorStableLight" /> </androidx.constraintlayout.widget.ConstraintLayout> </layout> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/values-bg/strings.xml b/Corona-Warn-App/src/main/res/values-bg/strings.xml index 5fca95bfd..69e61ed8c 100644 --- a/Corona-Warn-App/src/main/res/values-bg/strings.xml +++ b/Corona-Warn-App/src/main/res/values-bg/strings.xml @@ -192,10 +192,6 @@ <string name="risk_card_outdated_risk_body">"РегиÑтърът на излаганиÑта на риÑк не е обновÑван повече от 24 чаÑа."</string> <!-- XTXT: risk card - outdated risk manual, calculation couldn't be updated in the last 48 hours --> <string name="risk_card_outdated_manual_risk_body">"ВашиÑÑ‚ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° риÑк не е обновÑван от повече от 48 чаÑа. МолÑ, актуализирайте го."</string> - <!-- XHED: risk card - loading headline, update is ongoing --> - <string name="risk_card_loading_headline">"Извършва Ñе проверка..."</string> - <!-- XTXT: risk card - loading, data is downloaded and will be checked, this can take several minutes --> - <string name="risk_card_loading_body">"Ðктуалните данни Ñе ÑвалÑÑ‚ и проверÑват. Това може да отнеме нÑколко минути."</string> <!-- #################################### Main diff --git a/Corona-Warn-App/src/main/res/values-de/strings.xml b/Corona-Warn-App/src/main/res/values-de/strings.xml index 58c5bc21d..eabf99c51 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -193,10 +193,19 @@ <string name="risk_card_outdated_risk_body">"Ihre Risiko-Ermittlung konnte seit mehr als 24 Stunden nicht aktualisiert werden."</string> <!-- XTXT: risk card - outdated risk manual, calculation couldn't be updated in the last 48 hours --> <string name="risk_card_outdated_manual_risk_body">"Ihr Risikostatus wurde seit mehr als 48 Stunden nicht aktualisiert. Bitte aktualisieren Sie Ihren Risikostatus."</string> - <!-- XHED: risk card - loading headline, update is ongoing --> - <string name="risk_card_loading_headline">"Prüfung läuft …"</string> - <!-- XTXT: risk card - loading, data is downloaded and will be checked, this can take several minutes --> - <string name="risk_card_loading_body">"Es werden aktuelle Daten heruntergeladen und geprüft. Dies kann mehrere Minuten dauern."</string> + + <!-- #################################### + Risk Card - Progress + ###################################### --> + + <!-- XHED: risk card - progress - progress card headline displayed downloading key packages --> + <string name="risk_card_progress_download_headline">"Daten werden heruntergeladen…"</string> + <!-- XTXT: risk card - progress - progress card body displayed downloading key packages --> + <string name="risk_card_progress_download_body">"Das kann mehrere Minuten dauern. Vielen Dank für Ihre Geduld."</string> + <!-- XHED: risk card - progress - progress card headline displayed calculating the risklevel --> + <string name="risk_card_progress_calculation_headline">"Prüfung läuft…"</string> + <!-- XTXT: risk card - progress - progress card body displayed calculating the risklevel --> + <string name="risk_card_progress_calculation_body">"Ihre Begegnungsdaten werden nun geprüft. Das kann mehrere Minuten dauern. Vielen Dank für Ihre Geduld."</string> <!-- #################################### Main diff --git a/Corona-Warn-App/src/main/res/values-en/strings.xml b/Corona-Warn-App/src/main/res/values-en/strings.xml index c86de9ba7..62d0aea4b 100644 --- a/Corona-Warn-App/src/main/res/values-en/strings.xml +++ b/Corona-Warn-App/src/main/res/values-en/strings.xml @@ -192,10 +192,6 @@ <string name="risk_card_outdated_risk_body">"Your exposure logging could not be updated for more than 24 hours."</string> <!-- XTXT: risk card - outdated risk manual, calculation couldn't be updated in the last 48 hours --> <string name="risk_card_outdated_manual_risk_body">"Your risk status has not been updated for more than 48 hours. Please update your risk status."</string> - <!-- XHED: risk card - loading headline, update is ongoing --> - <string name="risk_card_loading_headline">"Check is running…"</string> - <!-- XTXT: risk card - loading, data is downloaded and will be checked, this can take several minutes --> - <string name="risk_card_loading_body">"Current data is being downloaded and checked. This may take several minutes."</string> <!-- #################################### Main diff --git a/Corona-Warn-App/src/main/res/values-pl/strings.xml b/Corona-Warn-App/src/main/res/values-pl/strings.xml index a089fa3eb..da52edfad 100644 --- a/Corona-Warn-App/src/main/res/values-pl/strings.xml +++ b/Corona-Warn-App/src/main/res/values-pl/strings.xml @@ -192,10 +192,6 @@ <string name="risk_card_outdated_risk_body">"Rejestrowanie narażenia nie mogÅ‚o zostać zaktualizowane przez okres dÅ‚uższy niż 24 godziny."</string> <!-- XTXT: risk card - outdated risk manual, calculation couldn't be updated in the last 48 hours --> <string name="risk_card_outdated_manual_risk_body">"Twój status ryzyka nie byÅ‚ aktualizowany od ponad 48 godzin. Zaktualizuj swój status ryzyka."</string> - <!-- XHED: risk card - loading headline, update is ongoing --> - <string name="risk_card_loading_headline">"Sprawdzanie w toku..."</string> - <!-- XTXT: risk card - loading, data is downloaded and will be checked, this can take several minutes --> - <string name="risk_card_loading_body">"Bieżące dane sÄ… pobierane i sprawdzane. Może to potrwać kilka minut."</string> <!-- #################################### Main diff --git a/Corona-Warn-App/src/main/res/values-ro/strings.xml b/Corona-Warn-App/src/main/res/values-ro/strings.xml index a3e5fa6dc..2d7638c5d 100644 --- a/Corona-Warn-App/src/main/res/values-ro/strings.xml +++ b/Corona-Warn-App/src/main/res/values-ro/strings.xml @@ -192,10 +192,6 @@ <string name="risk_card_outdated_risk_body">"ÃŽnregistrarea în jurnal a expunerilor dvs. nu a putut fi actualizată timp de peste 24 de ore."</string> <!-- XTXT: risk card - outdated risk manual, calculation couldn't be updated in the last 48 hours --> <string name="risk_card_outdated_manual_risk_body">"Starea riscului dvs. nu a fost actualizată timp de peste 48 de ore. Vă rugăm să activaÈ›i starea riscului dvs."</string> - <!-- XHED: risk card - loading headline, update is ongoing --> - <string name="risk_card_loading_headline">"Verificarea este în curs…"</string> - <!-- XTXT: risk card - loading, data is downloaded and will be checked, this can take several minutes --> - <string name="risk_card_loading_body">"Datele curente sunt în curs de descărcare È™i verificare. Aceasta poate dura mai multe minute."</string> <!-- #################################### Main diff --git a/Corona-Warn-App/src/main/res/values-tr/strings.xml b/Corona-Warn-App/src/main/res/values-tr/strings.xml index a1a5c7199..4a1c6803e 100644 --- a/Corona-Warn-App/src/main/res/values-tr/strings.xml +++ b/Corona-Warn-App/src/main/res/values-tr/strings.xml @@ -192,10 +192,6 @@ <string name="risk_card_outdated_risk_body">"Maruz kalma günlüğünüz 24 saatten uzun süre için güncellenemedi."</string> <!-- XTXT: risk card - outdated risk manual, calculation couldn't be updated in the last 48 hours --> <string name="risk_card_outdated_manual_risk_body">"Risk durumunuz 48 saatten uzun süredir güncellenmedi. Lütfen risk durumunuzu güncelleyin."</string> - <!-- XHED: risk card - loading headline, update is ongoing --> - <string name="risk_card_loading_headline">"Kontrol devam ediyor…"</string> - <!-- XTXT: risk card - loading, data is downloaded and will be checked, this can take several minutes --> - <string name="risk_card_loading_body">"Güncel veriler indiriliyor ve kaydediliyor. Bu iÅŸlem birkaç dakika sürebilir."</string> <!-- #################################### Main diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index 89a3039fb..e7d87358a 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -199,10 +199,19 @@ <string name="risk_card_outdated_risk_body">"Your exposure logging could not be updated for more than 24 hours."</string> <!-- XTXT: risk card - outdated risk manual, calculation couldn't be updated in the last 48 hours --> <string name="risk_card_outdated_manual_risk_body">"Your risk status has not been updated for more than 48 hours. Please update your risk status."</string> - <!-- XHED: risk card - loading headline, update is ongoing --> - <string name="risk_card_loading_headline">"Check is running…"</string> - <!-- XTXT: risk card - loading, data is downloaded and will be checked, this can take several minutes --> - <string name="risk_card_loading_body">"Current data is being downloaded and checked. This may take several minutes."</string> + + <!-- #################################### + Risk Card - Progress + ###################################### --> + + <!-- XHED: risk card - progress - progress card headline displayed downloading key packages --> + <string name="risk_card_progress_download_headline">""</string> + <!-- XTXT: risk card - progress - progress card body displayed downloading key packages --> + <string name="risk_card_progress_download_body">""</string> + <!-- XHED: risk card - progress - progress card headline displayed calculating the risklevel --> + <string name="risk_card_progress_calculation_headline">""</string> + <!-- XTXT: risk card - progress - progress card body displayed calculating the risklevel --> + <string name="risk_card_progress_calculation_body">""</string> <!-- #################################### Main diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardStateTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardStateTest.kt index aba526c2f..a6d955946 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardStateTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/tracing/card/TracingCardStateTest.kt @@ -9,12 +9,14 @@ import de.rki.coronawarnapp.risk.RiskLevelConstants.NO_CALCULATION_POSSIBLE_TRAC import de.rki.coronawarnapp.risk.RiskLevelConstants.UNKNOWN_RISK_INITIAL import de.rki.coronawarnapp.risk.RiskLevelConstants.UNKNOWN_RISK_OUTDATED_RESULTS import de.rki.coronawarnapp.tracing.GeneralTracingStatus +import de.rki.coronawarnapp.tracing.TracingProgress import io.kotest.matchers.shouldBe import io.mockk.MockKAnnotations import io.mockk.clearAllMocks import io.mockk.impl.annotations.MockK import io.mockk.mockk import io.mockk.verify +import io.mockk.verifySequence import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -38,7 +40,7 @@ class TracingCardStateTest : BaseTest() { private fun createInstance( tracingStatus: GeneralTracingStatus.Status = mockk(), riskLevel: Int = 0, - isRefreshing: Boolean = false, + tracingProgress: TracingProgress = TracingProgress.Idle, riskLevelLastSuccessfulCalculation: Int = 0, matchedKeyCount: Int = 0, daysSinceLastExposure: Int = 0, @@ -50,7 +52,7 @@ class TracingCardStateTest : BaseTest() { ) = TracingCardState( tracingStatus = tracingStatus, riskLevelScore = riskLevel, - isRefreshing = isRefreshing, + tracingProgress = tracingProgress, lastRiskLevelScoreCalculated = riskLevelLastSuccessfulCalculation, matchedKeyCount = matchedKeyCount, daysSinceLastExposure = daysSinceLastExposure, @@ -92,27 +94,27 @@ class TracingCardStateTest : BaseTest() { @Test fun `risklevel affects riskcolors`() { createInstance(riskLevel = INCREASED_RISK).apply { - getRiskColorStateList(context) + getRiskInfoContainerBackgroundTint(context) verify { context.getColorStateList(R.color.card_increased) } } createInstance(riskLevel = UNKNOWN_RISK_OUTDATED_RESULTS).apply { - getRiskColorStateList(context) + getRiskInfoContainerBackgroundTint(context) verify { context.getColorStateList(R.color.card_outdated) } } createInstance(riskLevel = NO_CALCULATION_POSSIBLE_TRACING_OFF).apply { - getRiskColorStateList(context) + getRiskInfoContainerBackgroundTint(context) verify { context.getColorStateList(R.color.card_no_calculation) } } createInstance(riskLevel = LOW_LEVEL_RISK).apply { - getRiskColorStateList(context) + getRiskInfoContainerBackgroundTint(context) verify { context.getColorStateList(R.color.card_low) } } createInstance(riskLevel = UNKNOWN_RISK_INITIAL).apply { - getRiskColorStateList(context) + getRiskInfoContainerBackgroundTint(context) verify { context.getColorStateList(R.color.card_unknown) } } } @@ -148,31 +150,36 @@ class TracingCardStateTest : BaseTest() { fun `saved risk body is affected by risklevel`() { createInstance( riskLevel = INCREASED_RISK, - riskLevelLastSuccessfulCalculation = 0).apply { + riskLevelLastSuccessfulCalculation = 0 + ).apply { getSavedRiskBody(context) shouldBe "" } createInstance( riskLevel = UNKNOWN_RISK_OUTDATED_RESULTS, - riskLevelLastSuccessfulCalculation = 0).apply { + riskLevelLastSuccessfulCalculation = 0 + ).apply { getSavedRiskBody(context) shouldBe "" } createInstance( riskLevel = NO_CALCULATION_POSSIBLE_TRACING_OFF, - riskLevelLastSuccessfulCalculation = 0).apply { + riskLevelLastSuccessfulCalculation = 0 + ).apply { getSavedRiskBody(context) shouldBe "" } createInstance( riskLevel = LOW_LEVEL_RISK, - riskLevelLastSuccessfulCalculation = 0).apply { + riskLevelLastSuccessfulCalculation = 0 + ).apply { getSavedRiskBody(context) shouldBe "" } createInstance( riskLevel = UNKNOWN_RISK_INITIAL, - riskLevelLastSuccessfulCalculation = 0).apply { + riskLevelLastSuccessfulCalculation = 0 + ).apply { getSavedRiskBody(context) shouldBe "" } @@ -216,9 +223,11 @@ class TracingCardStateTest : BaseTest() { riskLevelLastSuccessfulCalculation = LOW_LEVEL_RISK ).apply { getSavedRiskBody(context) - verify { context - .getString(R.string.risk_card_no_calculation_possible_body_saved_risk) - .format(context.getString(R.string.risk_card_low_risk_headline)) } + verify { + context + .getString(R.string.risk_card_no_calculation_possible_body_saved_risk) + .format(context.getString(R.string.risk_card_low_risk_headline)) + } } createInstance( @@ -226,9 +235,11 @@ class TracingCardStateTest : BaseTest() { riskLevelLastSuccessfulCalculation = INCREASED_RISK ).apply { getSavedRiskBody(context) - verify { context - .getString(R.string.risk_card_no_calculation_possible_body_saved_risk) - .format(context.getString(R.string.risk_card_increased_risk_headline)) } + verify { + context + .getString(R.string.risk_card_no_calculation_possible_body_saved_risk) + .format(context.getString(R.string.risk_card_increased_risk_headline)) + } } createInstance( @@ -236,9 +247,11 @@ class TracingCardStateTest : BaseTest() { riskLevelLastSuccessfulCalculation = UNKNOWN_RISK_INITIAL ).apply { getSavedRiskBody(context) - verify { context - .getString(R.string.risk_card_no_calculation_possible_body_saved_risk) - .format(context.getString(R.string.risk_card_unknown_risk_headline)) } + verify { + context + .getString(R.string.risk_card_no_calculation_possible_body_saved_risk) + .format(context.getString(R.string.risk_card_unknown_risk_headline)) + } } createInstance( @@ -246,9 +259,11 @@ class TracingCardStateTest : BaseTest() { riskLevelLastSuccessfulCalculation = LOW_LEVEL_RISK ).apply { getSavedRiskBody(context) - verify { context - .getString(R.string.risk_card_no_calculation_possible_body_saved_risk) - .format(context.getString(R.string.risk_card_low_risk_headline)) } + verify { + context + .getString(R.string.risk_card_no_calculation_possible_body_saved_risk) + .format(context.getString(R.string.risk_card_low_risk_headline)) + } } createInstance( @@ -256,9 +271,11 @@ class TracingCardStateTest : BaseTest() { riskLevelLastSuccessfulCalculation = INCREASED_RISK ).apply { getSavedRiskBody(context) - verify { context - .getString(R.string.risk_card_no_calculation_possible_body_saved_risk) - .format(context.getString(R.string.risk_card_increased_risk_headline)) } + verify { + context + .getString(R.string.risk_card_no_calculation_possible_body_saved_risk) + .format(context.getString(R.string.risk_card_increased_risk_headline)) + } } createInstance( @@ -266,9 +283,11 @@ class TracingCardStateTest : BaseTest() { riskLevelLastSuccessfulCalculation = UNKNOWN_RISK_INITIAL ).apply { getSavedRiskBody(context) - verify { context - .getString(R.string.risk_card_no_calculation_possible_body_saved_risk) - .format(context.getString(R.string.risk_card_unknown_risk_headline)) } + verify { + context + .getString(R.string.risk_card_no_calculation_possible_body_saved_risk) + .format(context.getString(R.string.risk_card_unknown_risk_headline)) + } } } @@ -276,73 +295,87 @@ class TracingCardStateTest : BaseTest() { fun `risk contact body is affected by risklevel`() { createInstance( riskLevel = INCREASED_RISK, - matchedKeyCount = 0).apply { + matchedKeyCount = 0 + ).apply { getRiskContactBody(context) verify { context.getString(R.string.risk_card_body_contact) } } createInstance( riskLevel = INCREASED_RISK, - matchedKeyCount = 2).apply { + matchedKeyCount = 2 + ).apply { getRiskContactBody(context) - verify { context.resources.getQuantityString( - R.plurals.risk_card_body_contact_value_high_risk, - 2, - 2) + verify { + context.resources.getQuantityString( + R.plurals.risk_card_body_contact_value_high_risk, + 2, + 2 + ) } } createInstance( riskLevel = LOW_LEVEL_RISK, - matchedKeyCount = 0).apply { + matchedKeyCount = 0 + ).apply { getRiskContactBody(context) verify { context.getString(R.string.risk_card_body_contact) } } createInstance( riskLevel = LOW_LEVEL_RISK, - matchedKeyCount = 2).apply { + matchedKeyCount = 2 + ).apply { getRiskContactBody(context) - verify { context.resources.getQuantityString( - R.plurals.risk_card_body_contact_value, - 2, - 2) + verify { + context.resources.getQuantityString( + R.plurals.risk_card_body_contact_value, + 2, + 2 + ) } } createInstance( riskLevel = UNKNOWN_RISK_OUTDATED_RESULTS, - matchedKeyCount = 0).apply { + matchedKeyCount = 0 + ).apply { getRiskContactBody(context) shouldBe "" } createInstance( riskLevel = NO_CALCULATION_POSSIBLE_TRACING_OFF, - matchedKeyCount = 0).apply { + matchedKeyCount = 0 + ).apply { getRiskContactBody(context) shouldBe "" } createInstance( riskLevel = UNKNOWN_RISK_INITIAL, - matchedKeyCount = 0).apply { + matchedKeyCount = 0 + ).apply { getRiskContactBody(context) shouldBe "" } createInstance( riskLevel = UNKNOWN_RISK_OUTDATED_RESULTS, - matchedKeyCount = 2).apply { + matchedKeyCount = 2 + ).apply { getRiskContactBody(context) shouldBe "" } createInstance( riskLevel = NO_CALCULATION_POSSIBLE_TRACING_OFF, - matchedKeyCount = 2).apply { + matchedKeyCount = 2 + ).apply { getRiskContactBody(context) shouldBe "" } createInstance( riskLevel = UNKNOWN_RISK_INITIAL, - matchedKeyCount = 2).apply { + matchedKeyCount = 2 + ).apply { getRiskContactBody(context) shouldBe "" } } @@ -379,47 +412,57 @@ class TracingCardStateTest : BaseTest() { fun `last risk contact text formatting`() { createInstance( riskLevel = INCREASED_RISK, - daysSinceLastExposure = 2).apply { + daysSinceLastExposure = 2 + ).apply { getRiskContactLast(context) - verify { context.resources.getQuantityString( - R.plurals.risk_card_increased_risk_body_contact_last, - 2, - 2) + verify { + context.resources.getQuantityString( + R.plurals.risk_card_increased_risk_body_contact_last, + 2, + 2 + ) } } createInstance( riskLevel = INCREASED_RISK, - daysSinceLastExposure = 0).apply { + daysSinceLastExposure = 0 + ).apply { getRiskContactLast(context) - verify { context.resources.getQuantityString( - R.plurals.risk_card_increased_risk_body_contact_last, - 0, - 0) + verify { + context.resources.getQuantityString( + R.plurals.risk_card_increased_risk_body_contact_last, + 0, + 0 + ) } } createInstance( riskLevel = UNKNOWN_RISK_OUTDATED_RESULTS, - daysSinceLastExposure = 2).apply { + daysSinceLastExposure = 2 + ).apply { getRiskContactLast(context) shouldBe "" } createInstance( riskLevel = NO_CALCULATION_POSSIBLE_TRACING_OFF, - daysSinceLastExposure = 2).apply { + daysSinceLastExposure = 2 + ).apply { getRiskContactLast(context) shouldBe "" } createInstance( riskLevel = LOW_LEVEL_RISK, - daysSinceLastExposure = 2).apply { + daysSinceLastExposure = 2 + ).apply { getRiskContactLast(context) shouldBe "" } createInstance( riskLevel = UNKNOWN_RISK_INITIAL, - daysSinceLastExposure = 2).apply { + daysSinceLastExposure = 2 + ).apply { getRiskContactLast(context) shouldBe "" } } @@ -428,39 +471,45 @@ class TracingCardStateTest : BaseTest() { fun `text for active risktracing in retention period`() { createInstance( riskLevel = INCREASED_RISK, - activeTracingDaysInRetentionPeriod = 1).apply { + activeTracingDaysInRetentionPeriod = 1 + ).apply { getRiskActiveTracingDaysInRetentionPeriod(context) shouldBe "" } createInstance( riskLevel = UNKNOWN_RISK_OUTDATED_RESULTS, - activeTracingDaysInRetentionPeriod = 1).apply { + activeTracingDaysInRetentionPeriod = 1 + ).apply { getRiskActiveTracingDaysInRetentionPeriod(context) shouldBe "" } createInstance( riskLevel = NO_CALCULATION_POSSIBLE_TRACING_OFF, - activeTracingDaysInRetentionPeriod = 1).apply { + activeTracingDaysInRetentionPeriod = 1 + ).apply { getRiskActiveTracingDaysInRetentionPeriod(context) shouldBe "" } createInstance( riskLevel = LOW_LEVEL_RISK, - activeTracingDaysInRetentionPeriod = 1).apply { + activeTracingDaysInRetentionPeriod = 1 + ).apply { getRiskActiveTracingDaysInRetentionPeriod(context) verify { context.getString(R.string.risk_card_body_saved_days).format(1) } } createInstance( riskLevel = LOW_LEVEL_RISK, - activeTracingDaysInRetentionPeriod = 2).apply { + activeTracingDaysInRetentionPeriod = 2 + ).apply { getRiskActiveTracingDaysInRetentionPeriod(context) verify { context.getString(R.string.risk_card_body_saved_days).format(2) } } createInstance( riskLevel = UNKNOWN_RISK_INITIAL, - activeTracingDaysInRetentionPeriod = 1).apply { + activeTracingDaysInRetentionPeriod = 1 + ).apply { getRiskActiveTracingDaysInRetentionPeriod(context) shouldBe "" } } @@ -471,7 +520,8 @@ class TracingCardStateTest : BaseTest() { createInstance( riskLevel = INCREASED_RISK, riskLevelLastSuccessfulCalculation = 2, - lastTimeDiagnosisKeysFetched = date).apply { + lastTimeDiagnosisKeysFetched = date + ).apply { getTimeFetched(context) verify { context.getString(eq(R.string.risk_card_body_time_fetched), any()) } } @@ -479,7 +529,8 @@ class TracingCardStateTest : BaseTest() { createInstance( riskLevel = UNKNOWN_RISK_OUTDATED_RESULTS, riskLevelLastSuccessfulCalculation = 2, - lastTimeDiagnosisKeysFetched = date).apply { + lastTimeDiagnosisKeysFetched = date + ).apply { getTimeFetched(context) verify { context.getString(eq(R.string.risk_card_body_time_fetched), any()) } } @@ -487,7 +538,8 @@ class TracingCardStateTest : BaseTest() { createInstance( riskLevel = NO_CALCULATION_POSSIBLE_TRACING_OFF, riskLevelLastSuccessfulCalculation = 2, - lastTimeDiagnosisKeysFetched = date).apply { + lastTimeDiagnosisKeysFetched = date + ).apply { getTimeFetched(context) verify { context.getString(eq(R.string.risk_card_body_time_fetched), any()) } } @@ -495,7 +547,8 @@ class TracingCardStateTest : BaseTest() { createInstance( riskLevel = LOW_LEVEL_RISK, riskLevelLastSuccessfulCalculation = 2, - lastTimeDiagnosisKeysFetched = date).apply { + lastTimeDiagnosisKeysFetched = date + ).apply { getTimeFetched(context) verify { context.getString(eq(R.string.risk_card_body_time_fetched), any()) } } @@ -503,71 +556,82 @@ class TracingCardStateTest : BaseTest() { createInstance( riskLevel = UNKNOWN_RISK_INITIAL, riskLevelLastSuccessfulCalculation = 2, - lastTimeDiagnosisKeysFetched = date).apply { + lastTimeDiagnosisKeysFetched = date + ).apply { getTimeFetched(context) shouldBe "" } createInstance( riskLevel = INCREASED_RISK, - lastTimeDiagnosisKeysFetched = date).apply { + lastTimeDiagnosisKeysFetched = date + ).apply { getTimeFetched(context) verify { context.getString(eq(R.string.risk_card_body_time_fetched), any()) } } createInstance( riskLevel = UNKNOWN_RISK_OUTDATED_RESULTS, - lastTimeDiagnosisKeysFetched = date).apply { + lastTimeDiagnosisKeysFetched = date + ).apply { getTimeFetched(context) shouldBe "" } createInstance( riskLevel = NO_CALCULATION_POSSIBLE_TRACING_OFF, - lastTimeDiagnosisKeysFetched = date).apply { + lastTimeDiagnosisKeysFetched = date + ).apply { getTimeFetched(context) shouldBe "" } createInstance( riskLevel = LOW_LEVEL_RISK, - lastTimeDiagnosisKeysFetched = date).apply { + lastTimeDiagnosisKeysFetched = date + ).apply { getTimeFetched(context) verify { context.getString(eq(R.string.risk_card_body_time_fetched), any()) } } createInstance( riskLevel = UNKNOWN_RISK_INITIAL, - lastTimeDiagnosisKeysFetched = date).apply { + lastTimeDiagnosisKeysFetched = date + ).apply { getTimeFetched(context) shouldBe "" } createInstance( riskLevel = INCREASED_RISK, - lastTimeDiagnosisKeysFetched = null).apply { + lastTimeDiagnosisKeysFetched = null + ).apply { getTimeFetched(context) verify { context.getString(R.string.risk_card_body_not_yet_fetched) } } createInstance( riskLevel = UNKNOWN_RISK_OUTDATED_RESULTS, - lastTimeDiagnosisKeysFetched = null).apply { + lastTimeDiagnosisKeysFetched = null + ).apply { getTimeFetched(context) shouldBe "" } createInstance( riskLevel = NO_CALCULATION_POSSIBLE_TRACING_OFF, - lastTimeDiagnosisKeysFetched = null).apply { + lastTimeDiagnosisKeysFetched = null + ).apply { getTimeFetched(context) shouldBe "" } createInstance( riskLevel = LOW_LEVEL_RISK, - lastTimeDiagnosisKeysFetched = null).apply { + lastTimeDiagnosisKeysFetched = null + ).apply { getTimeFetched(context) verify { context.getString(R.string.risk_card_body_not_yet_fetched) } } createInstance( riskLevel = UNKNOWN_RISK_INITIAL, - lastTimeDiagnosisKeysFetched = null).apply { + lastTimeDiagnosisKeysFetched = null + ).apply { getTimeFetched(context) shouldBe "" } } @@ -576,63 +640,73 @@ class TracingCardStateTest : BaseTest() { fun `text for next update time`() { createInstance( riskLevel = INCREASED_RISK, - isBackgroundJobEnabled = false).apply { + isBackgroundJobEnabled = false + ).apply { getNextUpdate(context) shouldBe "" } createInstance( riskLevel = UNKNOWN_RISK_OUTDATED_RESULTS, - isBackgroundJobEnabled = false).apply { + isBackgroundJobEnabled = false + ).apply { getNextUpdate(context) shouldBe "" } createInstance( riskLevel = NO_CALCULATION_POSSIBLE_TRACING_OFF, - isBackgroundJobEnabled = false).apply { + isBackgroundJobEnabled = false + ).apply { getNextUpdate(context) shouldBe "" } createInstance( riskLevel = LOW_LEVEL_RISK, - isBackgroundJobEnabled = false).apply { + isBackgroundJobEnabled = false + ).apply { getNextUpdate(context) shouldBe "" } createInstance( riskLevel = UNKNOWN_RISK_INITIAL, - isBackgroundJobEnabled = false).apply { + isBackgroundJobEnabled = false + ).apply { getNextUpdate(context) shouldBe "" } createInstance( riskLevel = INCREASED_RISK, - isBackgroundJobEnabled = true).apply { + isBackgroundJobEnabled = true + ).apply { getNextUpdate(context) verify { context.getString(R.string.risk_card_body_next_update) } } createInstance( riskLevel = UNKNOWN_RISK_OUTDATED_RESULTS, - isBackgroundJobEnabled = true).apply { + isBackgroundJobEnabled = true + ).apply { getNextUpdate(context) shouldBe "" } createInstance( riskLevel = NO_CALCULATION_POSSIBLE_TRACING_OFF, - isBackgroundJobEnabled = true).apply { + isBackgroundJobEnabled = true + ).apply { getNextUpdate(context) shouldBe "" } createInstance( riskLevel = LOW_LEVEL_RISK, - isBackgroundJobEnabled = true).apply { + isBackgroundJobEnabled = true + ).apply { getNextUpdate(context) verify { context.getString(R.string.risk_card_body_next_update) } } createInstance( riskLevel = UNKNOWN_RISK_INITIAL, - isBackgroundJobEnabled = true).apply { + isBackgroundJobEnabled = true + ).apply { getNextUpdate(context) verify { context.getString(R.string.risk_card_body_next_update) } } @@ -693,135 +767,131 @@ class TracingCardStateTest : BaseTest() { fun `update button visibility`() { createInstance( riskLevel = INCREASED_RISK, - isBackgroundJobEnabled = false).apply { + isBackgroundJobEnabled = false + ).apply { showUpdateButton() shouldBe true } createInstance( riskLevel = INCREASED_RISK, - isBackgroundJobEnabled = true).apply { + isBackgroundJobEnabled = true + ).apply { showUpdateButton() shouldBe false } createInstance( riskLevel = UNKNOWN_RISK_OUTDATED_RESULTS, - isBackgroundJobEnabled = false).apply { + isBackgroundJobEnabled = false + ).apply { showUpdateButton() shouldBe false } createInstance( riskLevel = UNKNOWN_RISK_OUTDATED_RESULTS, - isBackgroundJobEnabled = true).apply { + isBackgroundJobEnabled = true + ).apply { showUpdateButton() shouldBe false } createInstance( riskLevel = NO_CALCULATION_POSSIBLE_TRACING_OFF, - isBackgroundJobEnabled = false).apply { + isBackgroundJobEnabled = false + ).apply { showUpdateButton() shouldBe false } createInstance( riskLevel = NO_CALCULATION_POSSIBLE_TRACING_OFF, - isBackgroundJobEnabled = true).apply { + isBackgroundJobEnabled = true + ).apply { showUpdateButton() shouldBe false } createInstance( riskLevel = LOW_LEVEL_RISK, - isBackgroundJobEnabled = false).apply { + isBackgroundJobEnabled = false + ).apply { showUpdateButton() shouldBe true } createInstance( riskLevel = LOW_LEVEL_RISK, - isBackgroundJobEnabled = true).apply { + isBackgroundJobEnabled = true + ).apply { showUpdateButton() shouldBe false } createInstance( riskLevel = UNKNOWN_RISK_INITIAL, - isBackgroundJobEnabled = false).apply { + isBackgroundJobEnabled = false + ).apply { showUpdateButton() shouldBe true } createInstance( riskLevel = UNKNOWN_RISK_INITIAL, - isBackgroundJobEnabled = true).apply { + isBackgroundJobEnabled = true + ).apply { showUpdateButton() shouldBe false } } @Test - fun `risklevel headline is affected by score and refreshingstate`() { - createInstance( - riskLevel = INCREASED_RISK, - isRefreshing = false).apply { + fun `risklevel headline is affected by score`() { + createInstance(riskLevel = INCREASED_RISK).apply { getRiskLevelHeadline(context) verify { context.getString(R.string.risk_card_increased_risk_headline) } } - createInstance( - riskLevel = UNKNOWN_RISK_OUTDATED_RESULTS, - isRefreshing = false).apply { + createInstance(riskLevel = UNKNOWN_RISK_OUTDATED_RESULTS).apply { getRiskLevelHeadline(context) verify { context.getString(R.string.risk_card_outdated_risk_headline) } } - createInstance( - riskLevel = NO_CALCULATION_POSSIBLE_TRACING_OFF, - isRefreshing = false).apply { + createInstance(riskLevel = NO_CALCULATION_POSSIBLE_TRACING_OFF).apply { getRiskLevelHeadline(context) verify { context.getString(R.string.risk_card_no_calculation_possible_headline) } } - createInstance( - riskLevel = LOW_LEVEL_RISK, - isRefreshing = false).apply { + createInstance(riskLevel = LOW_LEVEL_RISK).apply { getRiskLevelHeadline(context) verify { context.getString(R.string.risk_card_low_risk_headline) } } - createInstance( - riskLevel = UNKNOWN_RISK_INITIAL, - isRefreshing = false).apply { + createInstance(riskLevel = UNKNOWN_RISK_INITIAL).apply { getRiskLevelHeadline(context) verify { context.getString(R.string.risk_card_unknown_risk_headline) } } createInstance( - riskLevel = INCREASED_RISK, - isRefreshing = true).apply { - getRiskLevelHeadline(context) - verify { context.getString(R.string.risk_card_loading_headline) } - } - - createInstance( - riskLevel = UNKNOWN_RISK_OUTDATED_RESULTS, - isRefreshing = true).apply { - getRiskLevelHeadline(context) - verify { context.getString(R.string.risk_card_loading_headline) } - } - - createInstance( - riskLevel = NO_CALCULATION_POSSIBLE_TRACING_OFF, - isRefreshing = true).apply { - getRiskLevelHeadline(context) - verify { context.getString(R.string.risk_card_loading_headline) } - } - - createInstance( - riskLevel = LOW_LEVEL_RISK, - isRefreshing = true).apply { + riskLevel = UNKNOWN_RISK_INITIAL, + tracingProgress = TracingProgress.Downloading + ).apply { getRiskLevelHeadline(context) - verify { context.getString(R.string.risk_card_loading_headline) } + verify { context.getString(R.string.risk_card_unknown_risk_headline) } } + } - createInstance( - riskLevel = UNKNOWN_RISK_INITIAL, - isRefreshing = true).apply { - getRiskLevelHeadline(context) - verify { context.getString(R.string.risk_card_loading_headline) } + @Test + fun `tracing progress state`() { + createInstance(tracingProgress = TracingProgress.Idle).apply { + getProgressCardHeadline(context) + getProgressCardBody(context) + verify(exactly = 0) { context.getString(any()) } + } + createInstance(tracingProgress = TracingProgress.Downloading).apply { + getProgressCardHeadline(context) + getProgressCardBody(context) + } + createInstance(tracingProgress = TracingProgress.ENFIsCalculating).apply { + getProgressCardHeadline(context) + getProgressCardBody(context) + } + verifySequence { + context.getString(R.string.risk_card_progress_download_headline) + context.getString(R.string.risk_card_progress_download_body) + context.getString(R.string.risk_card_progress_calculation_headline) + context.getString(R.string.risk_card_progress_calculation_body) } } } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/tracing/common/BaseTracingStateTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/tracing/common/BaseTracingStateTest.kt index 7c1f6d463..75687a7d8 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/tracing/common/BaseTracingStateTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/tracing/common/BaseTracingStateTest.kt @@ -4,6 +4,7 @@ import android.content.Context import de.rki.coronawarnapp.R import de.rki.coronawarnapp.risk.RiskLevelConstants import de.rki.coronawarnapp.tracing.GeneralTracingStatus +import de.rki.coronawarnapp.tracing.TracingProgress import io.kotest.matchers.shouldBe import io.mockk.MockKAnnotations import io.mockk.clearAllMocks @@ -44,7 +45,7 @@ class BaseTracingStateTest : BaseTest() { private fun createInstance( tracingStatus: GeneralTracingStatus.Status = mockk(), riskLevelScore: Int = 0, - isRefreshing: Boolean = false, + tracingProgress: TracingProgress = TracingProgress.Idle, riskLevelLastSuccessfulCalculation: Int = 0, matchedKeyCount: Int = 0, daysSinceLastExposure: Int = 0, @@ -57,7 +58,7 @@ class BaseTracingStateTest : BaseTest() { ) = object : BaseTracingState() { override val tracingStatus: GeneralTracingStatus.Status = tracingStatus override val riskLevelScore: Int = riskLevelScore - override val isRefreshing: Boolean = isRefreshing + override val tracingProgress: TracingProgress = tracingProgress override val lastRiskLevelScoreCalculated: Int = riskLevelLastSuccessfulCalculation override val matchedKeyCount: Int = matchedKeyCount override val daysSinceLastExposure: Int = daysSinceLastExposure @@ -69,18 +70,6 @@ class BaseTracingStateTest : BaseTest() { override val manualKeyRetrievalTime: Long = manualKeyRetrievalTime } - @Test - fun `risk card shape`() { - createInstance(showDetails = true).apply { - getRiskShape(context) - verify { context.getDrawable(R.drawable.rectangle) } - } - createInstance(showDetails = false).apply { - getRiskShape(context) - verify { context.getDrawable(R.drawable.rectangle) } - } - } - @Test fun `risk color`() { createInstance(riskLevelScore = RiskLevelConstants.INCREASED_RISK).apply { diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/tracing/details/TracingDetailsStateTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/tracing/details/TracingDetailsStateTest.kt index 140638120..9a22c516d 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/tracing/details/TracingDetailsStateTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/tracing/details/TracingDetailsStateTest.kt @@ -5,6 +5,7 @@ import android.content.res.Resources import de.rki.coronawarnapp.R import de.rki.coronawarnapp.risk.RiskLevelConstants import de.rki.coronawarnapp.tracing.GeneralTracingStatus +import de.rki.coronawarnapp.tracing.TracingProgress import io.kotest.matchers.shouldBe import io.mockk.MockKAnnotations import io.mockk.clearAllMocks @@ -38,7 +39,7 @@ class TracingDetailsStateTest : BaseTest() { private fun createInstance( tracingStatus: GeneralTracingStatus.Status = mockk(), riskLevelScore: Int = 0, - isRefreshing: Boolean = false, + tracingProgress: TracingProgress = TracingProgress.Idle, riskLevelLastSuccessfulCalculation: Int = 0, matchedKeyCount: Int = 3, daysSinceLastExposure: Int = 2, @@ -52,7 +53,7 @@ class TracingDetailsStateTest : BaseTest() { ) = TracingDetailsState( tracingStatus = tracingStatus, riskLevelScore = riskLevelScore, - isRefreshing = isRefreshing, + tracingProgress = tracingProgress, lastRiskLevelScoreCalculated = riskLevelLastSuccessfulCalculation, matchedKeyCount = matchedKeyCount, daysSinceLastExposure = daysSinceLastExposure, -- GitLab