From 3c08e38c6a8d38bacd0bed027a6bdbd7a92c8475 Mon Sep 17 00:00:00 2001 From: Oliver Zimmerman <oezimmerman@gmail.com> Date: Tue, 24 Nov 2020 15:59:18 +0000 Subject: [PATCH] Created Custom View, adjusted layout to implement custom view, created required declared stylables. --- .../SubmissionTestResultFragment.kt | 2 +- .../rki/coronawarnapp/ui/view/TestResult.kt | 53 ---------------- .../coronawarnapp/ui/view/TestResultCard.kt | 45 ++++++++++++++ .../layout/include_submission_test_result.xml | 13 ++-- .../res/layout/include_test_result_card.xml | 2 - .../main/res/layout/view_test_result_card.xml | 61 +++++++++++++++++++ Corona-Warn-App/src/main/res/values/attrs.xml | 8 ++- 7 files changed, 119 insertions(+), 65 deletions(-) delete mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TestResult.kt create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TestResultCard.kt create mode 100644 Corona-Warn-App/src/main/res/layout/view_test_result_card.xml diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultFragment.kt index a1d42d396..0af9186ec 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultFragment.kt @@ -149,7 +149,7 @@ class SubmissionTestResultFragment : Fragment(R.layout.fragment_submission_test_ private fun setButtonOnClickListener() { binding.submissionTestResultButtonPendingRefresh.setOnClickListener { SubmissionRepository.refreshDeviceUIState() - binding.submissionTestResultContent.submissionTestResultCard.testResultCard + binding.submissionTestResultContent.submissionTestResultCard .sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TestResult.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TestResult.kt deleted file mode 100644 index 2e5fddde8..000000000 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TestResult.kt +++ /dev/null @@ -1,53 +0,0 @@ -package de.rki.coronawarnapp.ui.view - -import android.content.Context -import android.util.AttributeSet -import android.view.View -import android.view.ViewGroup -import android.widget.ScrollView -import androidx.constraintlayout.widget.ConstraintLayout -import androidx.core.content.withStyledAttributes -import de.rki.coronawarnapp.R -import kotlinx.android.synthetic.main.view_step_entry.view.step_entry_icon -import kotlinx.android.synthetic.main.view_step_entry.view.step_entry_line - -/** - * The [TestResult] Displays the appropriate test result. - */ -open class TestResult @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : ScrollView(context, attrs, defStyleAttr) { - - val body: ConstraintLayout? - - init { - inflate(context, R.layout.view_step_entry, this) - - body = findViewById(R.id.step_entry_wrapper_children) - - context.withStyledAttributes(attrs, R.styleable.StepEntry) { - val icon = getDrawable(R.styleable.StepEntry_step_entry_icon) - step_entry_icon.setImageDrawable(icon) - - val isFinal = getBoolean(R.styleable.StepEntry_step_entry_final, false) - step_entry_line.visibility = if (isFinal) { - View.INVISIBLE - } else { - View.VISIBLE - } - } - } - - override fun addView( - child: View?, - index: Int, - params: ViewGroup.LayoutParams? - ) { - if (body == null) - super.addView(child, index, params) - else - body.addView(child, index, params) - } -} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TestResultCard.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TestResultCard.kt new file mode 100644 index 000000000..38861204b --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TestResultCard.kt @@ -0,0 +1,45 @@ +package de.rki.coronawarnapp.ui.view + +import android.content.Context +import android.text.SpannableString +import android.util.AttributeSet +import android.view.View +import androidx.appcompat.content.res.AppCompatResources.getDrawable +import androidx.constraintlayout.widget.ConstraintLayout +import de.rki.coronawarnapp.R +import kotlinx.android.synthetic.main.view_test_result_card.view.* + +/** + * The [TestResultCard] Displays the appropriate test result. + */ +open class TestResultCard @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr) { + + init { + init(attrs) + } + + private fun init(attrs: AttributeSet?) { + View.inflate(context, R.layout.view_test_result_card, this) + val testResultCard = context.obtainStyledAttributes(attrs, R.styleable.TestResultCard) + try { + val headlineText = testResultCard.getString(R.styleable.TestResultCard_test_result_card_headline) + val contentText= SpannableString(testResultCard.getString(R.styleable.TestResultCard_test_result_card_content)) + val registeredAtText = testResultCard.getString(R.styleable.TestResultCard_test_result_card_registered_at_text) + val resultIconId = testResultCard.getResourceId(R.styleable.TestResultCard_test_result_card_status_icon, 0) + if (resultIconId != 0) { + val drawable = getDrawable(context, resultIconId) + test_result_card_status_icon.setImageDrawable(drawable) + } + test_result_card_headline.text = headlineText + test_result_card_content.text = contentText + test_result_card_registered_at_text.text = registeredAtText + } finally { + testResultCard.recycle() + } + } +} + + + diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_test_result.xml b/Corona-Warn-App/src/main/res/layout/include_submission_test_result.xml index a564e5c96..119554708 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_test_result.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_test_result.xml @@ -3,9 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> <data> - <import type="de.rki.coronawarnapp.util.formatter.FormatterSubmissionHelper" /> - <variable name="uiState" type="de.rki.coronawarnapp.ui.submission.testresult.TestResultUIState" /> @@ -20,19 +18,20 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - <include + <de.rki.coronawarnapp.ui.view.TestResultCard android:id="@+id/submission_test_result_card" - layout="@layout/include_test_result_card" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:focusable="true" android:importantForAccessibility="yes" - app:deviceUIState="@{uiState.deviceUiState}" + app:test_result_card_headline="@string/test_result_card_headline" + app:test_result_card_content="@{FormatterSubmissionHelper.formatTestResultCardContent(uiState.deviceUiState)}" + app:test_result_card_status_icon="@{FormatterSubmissionHelper.formatTestStatusIcon(uiState.deviceUiState)}" + app:test_result_card_registered_at_text="@{FormatterSubmissionHelper.formatTestResultRegisteredAtText(uiState.testResultReceivedDate)}" app:layout_constraintEnd_toEndOf="@+id/guideline_card_end" app:layout_constraintStart_toStartOf="@+id/guideline_card_start" - app:layout_constraintTop_toTopOf="parent" - app:registerDate="@{uiState.testResultReceivedDate}" /> + app:layout_constraintTop_toTopOf="parent"/> <TextView android:id="@+id/submission_test_result_subtitle" 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 dcdcdea37..8e95f4550 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 @@ -4,9 +4,7 @@ xmlns:tools="http://schemas.android.com/tools"> <data> - <import type="de.rki.coronawarnapp.util.formatter.FormatterSubmissionHelper" /> - <variable name="registerDate" type="java.util.Date" /> diff --git a/Corona-Warn-App/src/main/res/layout/view_test_result_card.xml b/Corona-Warn-App/src/main/res/layout/view_test_result_card.xml new file mode 100644 index 000000000..9e8414baf --- /dev/null +++ b/Corona-Warn-App/src/main/res/layout/view_test_result_card.xml @@ -0,0 +1,61 @@ +<?xml version="1.0" encoding="utf-8"?> +<merge xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/test_result_card" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/card_dark" + android:focusable="true" + android:padding="@dimen/card_padding"> + + <TextView + android:id="@+id/test_result_card_headline" + style="@style/body2" + android:accessibilityHeading="true" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginEnd="@dimen/spacing_small" + app:layout_constraintEnd_toStartOf="@id/test_result_card_status_icon" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:text="Ihr Befund"/> + + <TextView + android:id="@+id/test_result_card_content" + style="@style/headline5" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginEnd="@dimen/spacing_small" + android:layout_marginBottom="@dimen/spacing_normal" + app:layout_constraintBottom_toTopOf="@id/test_result_card_registered_at_text" + 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" /> + + <ImageView + android:id="@+id/test_result_card_status_icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:importantForAccessibility="no" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:src="@drawable/ic_test_result_illustration_negative" /> + + <TextView + android:id="@+id/test_result_card_registered_at_text" + style="@style/body2" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_normal" + android:layout_marginEnd="@dimen/spacing_small" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toStartOf="@id/test_result_card_status_icon" + app:layout_constraintStart_toStartOf="parent" + tools:text="@string/test_result_card_registered_at_text" /> + + </androidx.constraintlayout.widget.ConstraintLayout> +</merge> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/values/attrs.xml b/Corona-Warn-App/src/main/res/values/attrs.xml index b7e436417..382ee2730 100644 --- a/Corona-Warn-App/src/main/res/values/attrs.xml +++ b/Corona-Warn-App/src/main/res/values/attrs.xml @@ -12,13 +12,17 @@ <attr name="step_entry_icon" format="integer" /> <attr name="step_entry_final" format="boolean" /> </declare-styleable> - <declare-styleable name="SimpleStepEntry"> <attr name="simple_step_entry_title" format="string" /> <attr name="simple_step_entry_text" format="string" /> </declare-styleable> - <declare-styleable name="BulletPointList"> <attr name="entries" format="reference" /> </declare-styleable> + <declare-styleable name="TestResultCard"> + <attr name="test_result_card_headline" format="string" /> + <attr name="test_result_card_content" format="string" /> + <attr name="test_result_card_status_icon" format="reference" /> + <attr name="test_result_card_registered_at_text" format="string" /> + </declare-styleable> </resources> \ No newline at end of file -- GitLab