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