From 4511c4c919703308520b58092ca0580b8e936ac9 Mon Sep 17 00:00:00 2001
From: Fabian-K <fabian.kajzar@sap.com>
Date: Tue, 2 Jun 2020 16:12:46 +0200
Subject: [PATCH] Submission Contact Fragment & StepView Custom View (#102)

* - submission-contact fragment added
- StepEntry custom view added to unify various step entry views
- SimpleStepEntry as a simple implementation of a StepEntry with title and text added

* - apply naming conventions for ids
- use CallHelper to trigger a call
- access views using kotlinx.android.synthetic

Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com>
---
 .../submission/SubmissionContactFragment.kt   |  51 ++++++++
 .../SubmissionDispatcherFragment.kt           |   6 +-
 .../coronawarnapp/ui/view/SimpleStepEntry.kt  |  29 +++++
 .../de/rki/coronawarnapp/ui/view/StepEntry.kt |  51 ++++++++
 .../src/main/res/drawable/ic_step_1.xml       |   6 +
 .../src/main/res/drawable/ic_step_2.xml       |   6 +
 .../main/res/drawable/ic_step_background.xml  |  19 +++
 .../layout/fragment_submission_contact.xml    |  72 ++++++++++++
 .../layout/include_step_entry_simple_body.xml |  28 +++++
 .../res/layout/include_submission_contact.xml | 109 ++++++++++++++++++
 .../src/main/res/layout/view_step_entry.xml   |  49 ++++++++
 .../src/main/res/navigation/nav_graph.xml     |  11 ++
 Corona-Warn-App/src/main/res/values/attrs.xml |  10 ++
 .../src/main/res/values/strings.xml           |   9 ++
 14 files changed, 454 insertions(+), 2 deletions(-)
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionContactFragment.kt
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/SimpleStepEntry.kt
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/StepEntry.kt
 create mode 100644 Corona-Warn-App/src/main/res/drawable/ic_step_1.xml
 create mode 100644 Corona-Warn-App/src/main/res/drawable/ic_step_2.xml
 create mode 100644 Corona-Warn-App/src/main/res/drawable/ic_step_background.xml
 create mode 100644 Corona-Warn-App/src/main/res/layout/fragment_submission_contact.xml
 create mode 100644 Corona-Warn-App/src/main/res/layout/include_step_entry_simple_body.xml
 create mode 100644 Corona-Warn-App/src/main/res/layout/include_submission_contact.xml
 create mode 100644 Corona-Warn-App/src/main/res/layout/view_step_entry.xml

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionContactFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionContactFragment.kt
new file mode 100644
index 000000000..14607969a
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionContactFragment.kt
@@ -0,0 +1,51 @@
+package de.rki.coronawarnapp.ui.submission
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import de.rki.coronawarnapp.R
+import de.rki.coronawarnapp.databinding.FragmentSubmissionContactBinding
+import de.rki.coronawarnapp.ui.BaseFragment
+import de.rki.coronawarnapp.ui.main.MainActivity
+import de.rki.coronawarnapp.util.CallHelper
+
+/**
+ * The [SubmissionContactFragment] allows requesting a teletan via phone
+ */
+class SubmissionContactFragment : BaseFragment() {
+
+    private lateinit var binding: FragmentSubmissionContactBinding
+
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        // get the binding reference by inflating it with the current layout
+        binding = FragmentSubmissionContactBinding.inflate(inflater)
+        return binding.root
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+        setButtonOnClickListener()
+    }
+
+    private fun setButtonOnClickListener() {
+        binding.submissionContactHeader.headerButtonBack.buttonIcon.setOnClickListener {
+            (activity as MainActivity).goBack()
+        }
+        binding.submissionContactButtonCall.setOnClickListener {
+            dial()
+        }
+        binding.submissionContactButtonEnter.setOnClickListener {
+            doNavigate(SubmissionContactFragmentDirections.actionSubmissionContactFragmentToSubmissionTanFragment())
+        }
+    }
+
+    private fun dial() = context?.let {
+        val number = getString(R.string.submission_contact_number)
+        CallHelper.call(this, "tel:$number")
+    }
+}
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionDispatcherFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionDispatcherFragment.kt
index 6b6778e38..f362685be 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionDispatcherFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionDispatcherFragment.kt
@@ -3,7 +3,6 @@ package de.rki.coronawarnapp.ui.submission
 import android.Manifest
 import android.content.pm.PackageManager
 import android.os.Bundle
-import android.util.Log
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
@@ -48,7 +47,10 @@ class SubmissionDispatcherFragment : BaseFragment() {
             )
         }
         binding.submissionDispatcherTanTele.dispatcherCard.setOnClickListener {
-            Log.i(TAG, "TAN tele pressed")
+            doNavigate(
+                SubmissionDispatcherFragmentDirections
+                    .actionSubmissionDispatcherFragmentToSubmissionContactFragment()
+            )
         }
     }
 
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/SimpleStepEntry.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/SimpleStepEntry.kt
new file mode 100644
index 000000000..6194d713a
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/SimpleStepEntry.kt
@@ -0,0 +1,29 @@
+package de.rki.coronawarnapp.ui.view
+
+import android.content.Context
+import android.util.AttributeSet
+import androidx.core.content.withStyledAttributes
+import de.rki.coronawarnapp.R
+import kotlinx.android.synthetic.main.include_step_entry_simple_body.view.*
+
+/**
+ * The [SimpleStepEntry] is a step entry with title and text as content.
+ */
+class SimpleStepEntry @JvmOverloads constructor(
+    context: Context,
+    attrs: AttributeSet? = null,
+    defStyleAttr: Int = 0
+) : StepEntry(context, attrs, defStyleAttr) {
+
+    init {
+        inflate(context, R.layout.include_step_entry_simple_body, this)
+
+        context.withStyledAttributes(attrs, R.styleable.SimpleStepEntry) {
+            simple_step_entry_title.text =
+                getText(R.styleable.SimpleStepEntry_simple_step_entry_title)
+
+            simple_step_entry_body.text =
+                getText(R.styleable.SimpleStepEntry_simple_step_entry_text)
+        }
+    }
+}
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/StepEntry.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/StepEntry.kt
new file mode 100644
index 000000000..0b1f13a3d
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/StepEntry.kt
@@ -0,0 +1,51 @@
+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.FrameLayout
+import androidx.core.content.withStyledAttributes
+import de.rki.coronawarnapp.R
+import kotlinx.android.synthetic.main.view_step_entry.view.*
+
+/**
+ * The [StepEntry] displays one step in a sequence. Children can be added to define the content.
+ */
+open class StepEntry @JvmOverloads constructor(
+    context: Context,
+    attrs: AttributeSet? = null,
+    defStyleAttr: Int = 0
+) : FrameLayout(context, attrs, defStyleAttr) {
+
+    val body: FrameLayout?
+
+    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/res/drawable/ic_step_1.xml b/Corona-Warn-App/src/main/res/drawable/ic_step_1.xml
new file mode 100644
index 000000000..45b761981
--- /dev/null
+++ b/Corona-Warn-App/src/main/res/drawable/ic_step_1.xml
@@ -0,0 +1,6 @@
+<vector android:height="40dp" android:viewportHeight="24"
+    android:viewportWidth="24" android:width="40dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="#007FAD" android:fillType="nonZero"
+        android:pathData="M13,17C12.45,17 12,16.55 12,16L12,9L11,9C10.45,9 10,8.55 10,8C10,7.45 10.45,7 11,7L13,7C13.55,7 14,7.45 14,8L14,16C14,16.55 13.55,17 13,17Z"
+        android:strokeColor="#00000000" android:strokeWidth="1"/>
+</vector>
diff --git a/Corona-Warn-App/src/main/res/drawable/ic_step_2.xml b/Corona-Warn-App/src/main/res/drawable/ic_step_2.xml
new file mode 100644
index 000000000..64729728a
--- /dev/null
+++ b/Corona-Warn-App/src/main/res/drawable/ic_step_2.xml
@@ -0,0 +1,6 @@
+<vector android:height="40dp" android:viewportHeight="24"
+    android:viewportWidth="24" android:width="40dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="#007FAD" android:fillType="nonZero"
+        android:pathData="M15,11C15,12.1 14.1,13 13,13L11,13L11,15L14,15C14.55,15 15,15.45 15,16C15,16.55 14.55,17 14,17L10,17C9.45,17 9,16.55 9,16L9,13C9,11.9 9.9,11 11,11L13,11L13,9L10,9C9.45,9 9,8.55 9,8C9,7.45 9.45,7 10,7L13,7C14.1,7 15,7.9 15,9L15,11Z"
+        android:strokeColor="#00000000" android:strokeWidth="1"/>
+</vector>
diff --git a/Corona-Warn-App/src/main/res/drawable/ic_step_background.xml b/Corona-Warn-App/src/main/res/drawable/ic_step_background.xml
new file mode 100644
index 000000000..b1270b99f
--- /dev/null
+++ b/Corona-Warn-App/src/main/res/drawable/ic_step_background.xml
@@ -0,0 +1,19 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="40dp"
+    android:height="40dp"
+    android:viewportWidth="40"
+    android:viewportHeight="40">
+    <path
+        android:fillAlpha="0.1"
+        android:fillColor="#17191A"
+        android:fillType="evenOdd"
+        android:pathData="M20,32L20,32A0.5,0.5 0,0 1,20.5 32.5L20.5,151.5A0.5,0.5 0,0 1,20 152L20,152A0.5,0.5 0,0 1,19.5 151.5L19.5,32.5A0.5,0.5 0,0 1,20 32z"
+        android:strokeWidth="1"
+        android:strokeColor="#00000000" />
+    <path
+        android:fillColor="#F5F5F5"
+        android:fillType="evenOdd"
+        android:pathData="M20,20m-20,0a20,20 0,1 1,40 0a20,20 0,1 1,-40 0"
+        android:strokeWidth="1"
+        android:strokeColor="#00000000" />
+</vector>
diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_contact.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_contact.xml
new file mode 100644
index 000000000..18b6108f6
--- /dev/null
+++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_contact.xml
@@ -0,0 +1,72 @@
+<?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:tools="http://schemas.android.com/tools">
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:fillViewport="true"
+        tools:context=".ui.submission.SubmissionContactFragment">
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+
+            <include
+                android:id="@+id/submission_contact_header"
+                layout="@layout/include_header"
+                android:layout_width="@dimen/match_constraint"
+                android:layout_height="wrap_content"
+                app:icon="@{@drawable/ic_back}"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent"
+                app:title="@{@string/submission_contact_title}" />
+
+            <include
+                layout="@layout/include_submission_contact"
+                android:layout_width="@dimen/match_constraint"
+                android:layout_height="@dimen/match_constraint"
+                app:layout_constraintBottom_toTopOf="@id/guideline_bottom"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@+id/submission_contact_header" />
+
+            <Button
+                android:id="@+id/submission_contact_button_call"
+                style="@style/buttonPrimary"
+                android:layout_width="@dimen/match_constraint"
+                android:layout_height="wrap_content"
+                android:text="@string/submission_contact_button_call"
+                android:textAllCaps="true"
+                app:layout_constraintBottom_toTopOf="@+id/submission_contact_button_enter"
+                app:layout_constraintEnd_toStartOf="@+id/guideline_end"
+                app:layout_constraintStart_toStartOf="@id/guideline_start"
+                app:layout_constraintTop_toBottomOf="@+id/guideline_bottom" />
+
+            <Button
+                android:id="@+id/submission_contact_button_enter"
+                style="@style/buttonGrey"
+                android:layout_width="@dimen/match_constraint"
+                android:layout_height="wrap_content"
+                android:text="@string/submission_contact_button_enter"
+                android:textAllCaps="true"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintEnd_toStartOf="@+id/guideline_end"
+                app:layout_constraintStart_toStartOf="@id/guideline_start"
+                app:layout_constraintTop_toBottomOf="@+id/submission_contact_button_call" />
+
+            <androidx.constraintlayout.widget.Guideline
+                android:id="@+id/guideline_bottom"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal"
+                app:layout_constraintGuide_end="@dimen/guideline_action_large" />
+
+            <include layout="@layout/merge_guidelines_common" />
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+    </ScrollView>
+</layout>
\ No newline at end of file
diff --git a/Corona-Warn-App/src/main/res/layout/include_step_entry_simple_body.xml b/Corona-Warn-App/src/main/res/layout/include_step_entry_simple_body.xml
new file mode 100644
index 000000000..37b841fb0
--- /dev/null
+++ b/Corona-Warn-App/src/main/res/layout/include_step_entry_simple_body.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <TextView
+        android:id="@+id/simple_step_entry_title"
+        style="@style/textTitle"
+        android:layout_width="@dimen/match_constraint"
+        android:layout_height="wrap_content"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:text="Title" />
+
+    <TextView
+        android:id="@+id/simple_step_entry_body"
+        android:layout_width="@dimen/match_constraint"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="@dimen/spacing_small"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/simple_step_entry_title"
+        tools:text="Text" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_contact.xml b/Corona-Warn-App/src/main/res/layout/include_submission_contact.xml
new file mode 100644
index 000000000..29e22f986
--- /dev/null
+++ b/Corona-Warn-App/src/main/res/layout/include_submission_contact.xml
@@ -0,0 +1,109 @@
+<?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">
+
+    <ScrollView
+        style="@style/fadingScrollView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+
+            <ImageView
+                android:id="@+id/submission_contact_illustration"
+                android:layout_width="@dimen/match_constraint"
+                android:layout_height="wrap_content"
+                android:src="@drawable/ic_information_illustration_contact"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <TextView
+                android:id="@+id/submission_contact_body"
+                style="@style/textMultiline"
+                android:layout_width="@dimen/match_constraint"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/spacing_small"
+                android:text="@string/submission_contact_body"
+                app:layout_constraintEnd_toStartOf="@+id/guideline_end"
+                app:layout_constraintStart_toStartOf="@+id/guideline_start"
+                app:layout_constraintTop_toBottomOf="@id/submission_contact_illustration" />
+
+            <TextView
+                android:id="@+id/submission_contact_headline"
+                style="@style/textTitle"
+                android:layout_width="@dimen/match_constraint"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/spacing_normal"
+                android:text="@string/submission_contact_headline"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="@id/guideline_start"
+                app:layout_constraintTop_toBottomOf="@+id/submission_contact_body" />
+
+
+            <de.rki.coronawarnapp.ui.view.StepEntry
+                android:id="@+id/submission_contact_step_1"
+                android:layout_width="@dimen/match_constraint"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/spacing_normal"
+                app:layout_constraintEnd_toStartOf="@+id/guideline_end"
+                app:layout_constraintStart_toStartOf="@+id/guideline_start"
+                app:layout_constraintTop_toBottomOf="@id/submission_contact_headline"
+                app:step_entry_final="false"
+                app:step_entry_icon="@drawable/ic_step_1">
+
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content">
+
+                    <TextView
+                        android:id="@+id/submission_contact_step_1_body"
+                        android:layout_width="@dimen/match_constraint"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="@dimen/button_icon_margin"
+                        android:text="@string/submission_contact_step_1_body"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent" />
+
+                    <TextView
+                        android:id="@+id/submission_contact_step_1_number"
+                        style="@style/textTitle"
+                        android:layout_width="@dimen/match_constraint"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="@dimen/spacing_small"
+                        android:text="@string/submission_contact_number"
+                        android:textColor="@color/textColorBlue"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toBottomOf="@id/submission_contact_step_1_body" />
+
+                </androidx.constraintlayout.widget.ConstraintLayout>
+
+            </de.rki.coronawarnapp.ui.view.StepEntry>
+
+            <de.rki.coronawarnapp.ui.view.StepEntry
+                android:id="@+id/submission_contact_step_2"
+                android:layout_width="@dimen/match_constraint"
+                android:layout_height="wrap_content"
+                app:layout_constraintEnd_toStartOf="@+id/guideline_end"
+                app:layout_constraintStart_toStartOf="@+id/guideline_start"
+                app:layout_constraintTop_toBottomOf="@+id/submission_contact_step_1"
+                app:step_entry_final="true"
+                app:step_entry_icon="@drawable/ic_step_2">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/submission_contact_step_2_body" />
+
+            </de.rki.coronawarnapp.ui.view.StepEntry>
+
+            <include layout="@layout/merge_guidelines_common" />
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+    </ScrollView>
+</layout>
\ No newline at end of file
diff --git a/Corona-Warn-App/src/main/res/layout/view_step_entry.xml b/Corona-Warn-App/src/main/res/layout/view_step_entry.xml
new file mode 100644
index 000000000..bcde333ba
--- /dev/null
+++ b/Corona-Warn-App/src/main/res/layout/view_step_entry.xml
@@ -0,0 +1,49 @@
+<?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">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <ImageView
+            android:id="@+id/step_entry_icon"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@drawable/ic_step_background"
+            android:src="@drawable/ic_step_1"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <FrameLayout
+            android:id="@+id/step_entry_wrapper_children"
+            android:layout_width="@dimen/match_constraint"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/spacing_small"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toEndOf="@id/step_entry_icon"
+            app:layout_constraintTop_toTopOf="parent">
+
+        </FrameLayout>
+
+        <View
+            android:id="@+id/step_entry_placeholder"
+            android:layout_width="@dimen/match_constraint"
+            android:layout_height="@dimen/spacing_large"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="@id/step_entry_icon"
+            app:layout_constraintTop_toBottomOf="@id/step_entry_wrapper_children" />
+
+        <View
+            android:id="@+id/step_entry_line"
+            android:layout_width="@dimen/test_result_step_progress_line_width"
+            android:layout_height="@dimen/match_constraint"
+            android:background="@color/colorGreyLight"
+            app:layout_constraintBottom_toBottomOf="@+id/step_entry_placeholder"
+            app:layout_constraintEnd_toEndOf="@id/step_entry_icon"
+            app:layout_constraintStart_toStartOf="@id/step_entry_icon"
+            app:layout_constraintTop_toBottomOf="@id/step_entry_icon" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</merge>
\ No newline at end of file
diff --git a/Corona-Warn-App/src/main/res/navigation/nav_graph.xml b/Corona-Warn-App/src/main/res/navigation/nav_graph.xml
index 79d7f72c4..34de99e14 100644
--- a/Corona-Warn-App/src/main/res/navigation/nav_graph.xml
+++ b/Corona-Warn-App/src/main/res/navigation/nav_graph.xml
@@ -186,6 +186,9 @@
         <action
             android:id="@+id/action_submissionDispatcherFragment_to_submissionQRCodeScanFragment"
             app:destination="@id/submissionQRCodeScanFragment" />
+        <action
+            android:id="@+id/action_submissionDispatcherFragment_to_submissionContactFragment"
+            app:destination="@id/submissionContactFragment" />
     </fragment>
     <fragment
         android:id="@+id/submissionResultPositiveOtherWarningFragment"
@@ -289,4 +292,12 @@
             app:popUpTo="@id/mainFragment"
             app:popUpToInclusive="true" />
     </fragment>
+    <fragment
+        android:id="@+id/submissionContactFragment"
+        android:name="de.rki.coronawarnapp.ui.submission.SubmissionContactFragment"
+        android:label="SubmissionContactFragment">
+        <action
+            android:id="@+id/action_submissionContactFragment_to_submissionTanFragment"
+            app:destination="@id/submissionTanFragment" />
+    </fragment>
 </navigation>
diff --git a/Corona-Warn-App/src/main/res/values/attrs.xml b/Corona-Warn-App/src/main/res/values/attrs.xml
index 1219d8118..afb0e6a41 100644
--- a/Corona-Warn-App/src/main/res/values/attrs.xml
+++ b/Corona-Warn-App/src/main/res/values/attrs.xml
@@ -7,4 +7,14 @@
         <attr name="onboarding_exchangeable_body" format="string" />
         <attr name="onboarding_exchangeable_body_notifications" format="string" />
     </declare-styleable> -->
+
+    <declare-styleable name="StepEntry">
+        <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>
 </resources>
\ 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 edb0c0125..af8406452 100644
--- a/Corona-Warn-App/src/main/res/values/strings.xml
+++ b/Corona-Warn-App/src/main/res/values/strings.xml
@@ -445,6 +445,15 @@
     <string name="submission_done_contagious">Sie sind ansteckend.</string>
     <string name="submission_done_isolate">Bitte isolieren Sie sich von anderen Personen.</string>
     <string name="submission_done_button_done">Fertig</string>
+    <!-- Submission Contact -->
+    <string name="submission_contact_title">TAN anfragen</string>
+    <string name="submission_contact_headline">Info zum Ablauf:</string>
+    <string name="submission_contact_body">Wir teilen Ihnen Ihren TAN-Code gerne per Telefon mit.</string>
+    <string name="submission_contact_button_call">Anrufen</string>
+    <string name="submission_contact_button_enter">TAN-Code eingeben</string>
+    <string name="submission_contact_step_1_body"><![CDATA[Hotline anrufen & TAN erfragen:]]></string>
+    <string name="submission_contact_number">0800 7540002</string>
+    <string name="submission_contact_step_2_body">Test per TAN-Eingabe in der App registrieren</string>
 
     <!-- ####################################
            Just for Development
-- 
GitLab