diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/TimeAndDateExtensions.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/TimeAndDateExtensions.kt index 93c8ddc25ba94ff27f0aac1141b7dfa6a135101f..6206d2a139526fc87a79dafe8353e4951c540b13 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/TimeAndDateExtensions.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/TimeAndDateExtensions.kt @@ -1,5 +1,6 @@ package de.rki.coronawarnapp.util +import android.content.Context import org.joda.time.DateTime import org.joda.time.DateTimeZone import org.joda.time.Instant @@ -21,6 +22,9 @@ object TimeAndDateExtensions { .withZoneUTC() .print(this.time) + fun Date.toUIFormat(context: Context): String = + android.text.format.DateFormat.getDateFormat(context).format(this) + fun Date.logUTCFormat(): String = DateTime(this, DateTimeZone.UTC).toString() fun Long.millisecondsToSeconds(): Long { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSubmissionHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSubmissionHelper.kt index 55b9a454c9e8859e0b411bb6a79182136c621a18..5f9c0139a264ebacd9df24f928cee0ca100569bf 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSubmissionHelper.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSubmissionHelper.kt @@ -3,11 +3,16 @@ package de.rki.coronawarnapp.util.formatter import android.graphics.drawable.Drawable +import android.text.Spannable +import android.text.SpannableString +import android.text.SpannableStringBuilder +import android.text.style.ForegroundColorSpan import android.view.View import de.rki.coronawarnapp.CoronaWarnApplication import de.rki.coronawarnapp.R import de.rki.coronawarnapp.ui.submission.ApiRequestState import de.rki.coronawarnapp.util.DeviceUIState +import de.rki.coronawarnapp.util.TimeAndDateExtensions.toUIFormat import java.util.Date fun formatTestResultSpinnerVisible(uiStateState: ApiRequestState?): Int = @@ -16,24 +21,6 @@ fun formatTestResultSpinnerVisible(uiStateState: ApiRequestState?): Int = fun formatTestResultVisible(uiStateState: ApiRequestState?): Int = formatVisibility(uiStateState == ApiRequestState.SUCCESS) -fun formatTestResultVirusNameTextVisible(uiState: DeviceUIState?): Int { - return when (uiState) { - DeviceUIState.PAIRED_POSITIVE, - DeviceUIState.PAIRED_POSITIVE_TELETAN, - DeviceUIState.PAIRED_NEGATIVE -> View.VISIBLE - else -> View.GONE - } -} - -fun formatTestResultStatusTextVisible(uiState: DeviceUIState?): Int { - return when (uiState) { - DeviceUIState.PAIRED_POSITIVE, - DeviceUIState.PAIRED_POSITIVE_TELETAN, - DeviceUIState.PAIRED_NEGATIVE -> View.VISIBLE - else -> View.GONE - } -} - fun formatTestResultStatusText(uiState: DeviceUIState?): String { val appContext = CoronaWarnApplication.getAppContext() return when (uiState) { @@ -54,9 +41,35 @@ fun formatTestResultStatusColor(uiState: DeviceUIState?): Int { } } +fun formatTestResult(uiState: DeviceUIState?): Spannable { + val appContext = CoronaWarnApplication.getAppContext() + return SpannableStringBuilder() + .append(appContext.getString(R.string.test_result_card_virus_name_text)) + .append(" ") + .append( + formatTestResultStatusText(uiState), + ForegroundColorSpan(formatTestResultStatusColor(uiState)), + Spannable.SPAN_EXCLUSIVE_INCLUSIVE + ) +} + +fun formatTestResultCardContent(uiState: DeviceUIState?): Spannable { + val appContext = CoronaWarnApplication.getAppContext() + return when (uiState) { + DeviceUIState.PAIRED_NO_RESULT -> + SpannableString(appContext.getString(R.string.test_result_card_status_pending)) + DeviceUIState.PAIRED_ERROR -> + SpannableString(appContext.getString(R.string.test_result_card_status_invalid)) + + DeviceUIState.PAIRED_POSITIVE, + DeviceUIState.PAIRED_POSITIVE_TELETAN, + DeviceUIState.PAIRED_NEGATIVE -> formatTestResult(uiState) + else -> SpannableString("") + } +} + fun formatTestStatusIcon(uiState: DeviceUIState?): Drawable? { val appContext = CoronaWarnApplication.getAppContext() - // TODO Replace with real drawables when design is finished return when (uiState) { DeviceUIState.PAIRED_NO_RESULT -> appContext.getDrawable(R.drawable.ic_test_result_illustration_pending) DeviceUIState.PAIRED_POSITIVE_TELETAN, @@ -67,15 +80,10 @@ fun formatTestStatusIcon(uiState: DeviceUIState?): Drawable? { } } -fun formatTestResultInvalidStatusTextVisible(uiState: DeviceUIState?): Int = - formatVisibility(uiState == DeviceUIState.PAIRED_ERROR) - -fun formatTestResultPendingStatusTextVisible(uiState: DeviceUIState?): Int = - formatVisibility(uiState == DeviceUIState.PAIRED_NO_RESULT) - fun formatTestResultRegisteredAtText(registeredAt: Date?): String { val appContext = CoronaWarnApplication.getAppContext() - return appContext.getString(R.string.test_result_card_registered_at_text).format(registeredAt) + return appContext.getString(R.string.test_result_card_registered_at_text) + .format(registeredAt?.toUIFormat(appContext)) } fun formatTestResultPendingStepsVisible(uiState: DeviceUIState?): Int = diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_status_card_content.xml b/Corona-Warn-App/src/main/res/layout/include_submission_status_card_content.xml index d865fc4c82881333e4ce227de95b47b4a063abab..140873894b9194d43d671c441293ee47a2dcf0c7 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_status_card_content.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_status_card_content.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> @@ -22,53 +23,67 @@ style="@style/textTitleLarger" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" + android:layout_marginEnd="@dimen/spacing_tiny" android:text="@{FormatterSubmissionHelper.formatSubmissionStatusCardContentTitleText(deviceUIState)}" - app:layout_constraintEnd_toStartOf="@+id/submission_status_card_unregistered_icon" + app:layout_constraintEnd_toStartOf="@+id/submission_status_card_content_icon" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + tools:text="@string/submission_status_card_title_available" /> <TextView android:id="@+id/submission_status_card_content_subtitle" style="@style/textSubTitle" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" - android:layout_marginVertical="@dimen/spacing_tiny" + android:layout_marginTop="@dimen/spacing_normal" + android:layout_marginEnd="@dimen/spacing_tiny" android:text="@{FormatterSubmissionHelper.formatTestResultStatusText(deviceUIState)}" android:textColor="@{FormatterSubmissionHelper.formatTestResultStatusColor(deviceUIState)}" android:visibility="@{FormatterSubmissionHelper.formatSubmissionStatusCardContentStatusTextVisible(deviceUIState)}" - app:layout_constraintBottom_toTopOf="@+id/submission_status_card_content_body" - app:layout_constraintEnd_toStartOf="@+id/submission_status_card_unregistered_icon" - app:layout_constraintStart_toStartOf="@+id/submission_status_card_content_title" - app:layout_constraintTop_toBottomOf="@+id/submission_status_card_content_title" /> + app:layout_constraintEnd_toStartOf="@+id/submission_status_card_content_icon" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/submission_status_card_content_title" + tools:text="@string/test_result_card_status_positive" /> <TextView android:id="@+id/submission_status_card_content_body" style="@style/textMultiline" android:layout_width="@dimen/match_constraint" - android:layout_marginBottom="@dimen/spacing_normal" android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_tiny" + android:layout_marginEnd="@dimen/spacing_tiny" android:text="@{FormatterSubmissionHelper.formatSubmissionStatusCardContentBodyText(deviceUIState)}" - app:layout_constraintBottom_toTopOf="@+id/submission_status_card_content_button" - app:layout_constraintEnd_toStartOf="@+id/submission_status_card_unregistered_icon" - app:layout_constraintStart_toStartOf="@+id/submission_status_card_content_title" /> + app:layout_constraintEnd_toStartOf="@+id/submission_status_card_content_icon" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/submission_status_card_content_subtitle" + tools:text="@string/submission_status_card_body_negative" /> + + <androidx.constraintlayout.widget.Barrier + android:id="@+id/submission_status_card_content_barrier" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + app:barrierDirection="bottom" + app:constraint_referenced_ids="submission_status_card_content_body,submission_status_card_content_icon" /> <Button android:id="@+id/submission_status_card_content_button" + style="@style/buttonPrimary" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" - style="@style/buttonPrimary" android:layout_marginTop="@dimen/spacing_normal" android:text="@{FormatterSubmissionHelper.formatSubmissionStatusCardContentButtonText(deviceUIState)}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/submission_status_card_unregistered_icon" /> + app:layout_constraintTop_toBottomOf="@+id/submission_status_card_content_barrier" + tools:text="@string/submission_status_card_button_show_results" /> <ImageView - android:id="@+id/submission_status_card_unregistered_icon" + android:id="@+id/submission_status_card_content_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" - app:layout_constraintEnd_toEndOf="parent" android:background="@{FormatterSubmissionHelper.formatSubmissionStatusCardContentIcon(deviceUIState)}" - app:layout_constraintTop_toTopOf="@+id/submission_status_card_content_title" /> + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:src="@drawable/ic_main_illustration_negative" /> </androidx.constraintlayout.widget.ConstraintLayout> </layout> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/layout/include_test_result_card.xml b/Corona-Warn-App/src/main/res/layout/include_test_result_card.xml index 4bf8e10242f33c9f3fc91249971396d24b6a889a..a51ace56cb54b246d5eec521cc1aae1a36b2886c 100644 --- a/Corona-Warn-App/src/main/res/layout/include_test_result_card.xml +++ b/Corona-Warn-App/src/main/res/layout/include_test_result_card.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> <import type="de.rki.coronawarnapp.util.formatter.FormatterSubmissionHelper" /> @@ -16,88 +17,53 @@ <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@color/colorGreyLight"> + android:background="@color/colorGreyLight" + android:padding="@dimen/card_padding"> - <androidx.constraintlayout.widget.ConstraintLayout - android:layout_width="match_parent" - android:layout_height="@dimen/test_result_card_body_height" - android:layout_margin="@dimen/card_padding" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" + <TextView + android:id="@+id/test_result_card_headline" + style="@style/textMultiline" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginEnd="@dimen/spacing_tiny" + android:text="@string/test_result_card_headline" + app:layout_constraintEnd_toStartOf="@id/test_result_card_status_icon" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent"> - - <ImageView - android:id="@+id/test_result_card_status_icon" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - app:layout_constraintBottom_toBottomOf="parent" - android:background="@{FormatterSubmissionHelper.formatTestStatusIcon(deviceUIState)}" - app:layout_constraintEnd_toEndOf="parent" /> - - <TextView - android:id="@+id/test_result_card_headline" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/test_result_card_headline" - style="@style/textMultiline" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - - <TextView - android:id="@+id/test_result_card_virus_name" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - style="@style/testResultCardLargeText" - android:text="@string/test_result_card_virus_name_text" - android:visibility="@{FormatterSubmissionHelper.formatTestResultVirusNameTextVisible(deviceUIState)}" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/test_result_card_headline" /> + app:layout_constraintTop_toTopOf="parent" /> - <TextView - android:id="@+id/test_result_card_invalid_status_text" - style="@style/testResultCardLargeText" - android:layout_height="wrap_content" - android:layout_width="@dimen/match_constraint" - android:text="@string/test_result_card_status_invalid" - android:layout_marginEnd="@dimen/spacing_large" - android:visibility="@{FormatterSubmissionHelper.formatTestResultInvalidStatusTextVisible(deviceUIState)}" - app:layout_constraintEnd_toStartOf="@+id/test_result_card_status_icon" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/test_result_card_headline" /> - - <TextView - android:id="@+id/test_result_card_pending_status_text" - style="@style/testResultCardLargeText" - android:layout_width="@dimen/match_constraint" - android:layout_height="wrap_content" - android:layout_marginEnd="@dimen/spacing_large" - android:text="@string/test_result_card_status_pending" - android:visibility="@{FormatterSubmissionHelper.formatTestResultPendingStatusTextVisible(deviceUIState)}" - app:layout_constraintEnd_toStartOf="@+id/test_result_card_status_icon" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/test_result_card_headline" /> + <TextView + android:id="@+id/test_result_card_content" + style="@style/textTitleLarger" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginEnd="@dimen/spacing_tiny" + android:text="@{FormatterSubmissionHelper.formatTestResultCardContent(deviceUIState)}" + app:layout_constraintEnd_toStartOf="@id/test_result_card_status_icon" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/test_result_card_headline" + tools:text="SARS-CoV-2 Negativ" /> - <TextView - android:id="@+id/test_result_card_status_text" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - style="@style/testResultCardLargeText" - android:text="@{FormatterSubmissionHelper.formatTestResultStatusText(deviceUIState)}" - android:textColor="@{FormatterSubmissionHelper.formatTestResultStatusColor(deviceUIState)}" - android:visibility="@{FormatterSubmissionHelper.formatTestResultStatusTextVisible(deviceUIState)}" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/test_result_card_virus_name" /> + <ImageView + android:id="@+id/test_result_card_status_icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:background="@{FormatterSubmissionHelper.formatTestStatusIcon(deviceUIState)}" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:src="@drawable/ic_main_illustration_negative" /> - <TextView - android:id="@+id/test_result_card_registered_at_text" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@{FormatterSubmissionHelper.formatTestResultRegisteredAtText(registerDate)}" - style="@style/textMultiline" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" /> - </androidx.constraintlayout.widget.ConstraintLayout> + <TextView + android:id="@+id/test_result_card_registered_at_text" + style="@style/textMultiline" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_normal" + android:layout_marginEnd="@dimen/spacing_tiny" + android:text="@{FormatterSubmissionHelper.formatTestResultRegisteredAtText(registerDate)}" + app:layout_constraintEnd_toStartOf="@id/test_result_card_status_icon" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/test_result_card_content" + tools:text="@string/test_result_card_registered_at_text" /> </androidx.constraintlayout.widget.ConstraintLayout> </layout> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index 15c559b77e70a80004c808fbb2f16b80ce971f73..04c86c5dca92fa20448608ed6669b73e4e59ce67 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -821,7 +821,7 @@ <!-- YTXT: virus name text --> <string name="test_result_card_virus_name_text">SARS-CoV-2</string> <!-- YTXT: registered at text --> - <string name="test_result_card_registered_at_text">Registriert am %tF</string> + <string name="test_result_card_registered_at_text">Registriert am %s</string> <!-- YTXT: negative status text --> <string name="test_result_card_status_negative">Negativ</string> <!-- YTXT: positive status text -->