From 7ae775bb8aeee65e4ed48728a8910a14a90e3a13 Mon Sep 17 00:00:00 2001
From: axelherbstreith <75120552+axelherbstreith@users.noreply.github.com>
Date: Thu, 4 Mar 2021 13:37:29 +0100
Subject: [PATCH] Share Consent Screen for Debug Log (EXPOSUREAPP-5481) (#2513)

* added basic layout

* updated naming of ids

* added strings

* added navigation

* Updated navigation

* linting

* formatting

* updated header font size

* Updated string

* Rename DebugLogShare to DebugLogUpload

Co-authored-by: Matthias Urhahn <matthias.urhahn@sap.com>
---
 .../debuglog/ui/DebugLogFragment.kt           |   6 +-
 .../debuglog/ui/DebugLogNavigationEvents.kt   |   1 +
 .../debuglog/ui/DebugLogViewModel.kt          |   4 +
 .../ui/upload/DebugLogUploadFragment.kt       |  52 ++++++
 .../ui/upload/DebugLogUploadFragmentModule.kt |  20 +++
 .../upload/DebugLogUploadNavigationEvents.kt  |   5 +
 .../ui/upload/DebugLogUploadViewModel.kt      |  21 +++
 .../information/InformationFragmentModule.kt  |   4 +-
 .../bugreporting_debuglog_upload_fragment.xml | 158 ++++++++++++++++++
 ..._debugging_debuglog_share_privacy_card.xml | 115 +++++++++++++
 .../src/main/res/navigation/nav_graph.xml     |   8 +
 .../src/main/res/values-de/strings.xml        |  20 +++
 .../src/main/res/values/strings.xml           |  21 +++
 13 files changed, 433 insertions(+), 2 deletions(-)
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/upload/DebugLogUploadFragment.kt
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/upload/DebugLogUploadFragmentModule.kt
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/upload/DebugLogUploadNavigationEvents.kt
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/upload/DebugLogUploadViewModel.kt
 create mode 100644 Corona-Warn-App/src/main/res/layout/bugreporting_debuglog_upload_fragment.xml
 create mode 100644 Corona-Warn-App/src/main/res/layout/include_debugging_debuglog_share_privacy_card.xml

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogFragment.kt
index 7e1135d10..867383a62 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogFragment.kt
@@ -83,7 +83,7 @@ class DebugLogFragment : Fragment(R.layout.bugreporting_debuglog_fragment), Auto
                 toggleSendErrorLog.apply {
                     isGone = !it.isRecording
                     isEnabled = it.currentSize > 0L && !it.isActionInProgress
-                    setOnClickListener { vm.onUploadLog() }
+                    setOnClickListener { vm.onShareButtonPress() }
                 }
 
                 toggleStoreLog.apply {
@@ -119,6 +119,10 @@ class DebugLogFragment : Fragment(R.layout.bugreporting_debuglog_fragment), Auto
                 DebugLogNavigationEvents.NavigateToUploadHistory -> doNavigate(
                     DebugLogFragmentDirections.actionDebuglogFragmentToLogUploadHistoryFragment()
                 )
+
+                DebugLogNavigationEvents.NavigateToShareFragment -> doNavigate(
+                    DebugLogFragmentDirections.actionDebuglogFragmentToDebugLogUploadFragment()
+                )
             }
         }
 
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogNavigationEvents.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogNavigationEvents.kt
index 4162b7b18..76d9704a1 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogNavigationEvents.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogNavigationEvents.kt
@@ -3,4 +3,5 @@ package de.rki.coronawarnapp.bugreporting.debuglog.ui
 sealed class DebugLogNavigationEvents {
     object NavigateToPrivacyFragment : DebugLogNavigationEvents()
     object NavigateToUploadHistory : DebugLogNavigationEvents()
+    object NavigateToShareFragment : DebugLogNavigationEvents()
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogViewModel.kt
index 542d5ff9f..5ead8f2fd 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogViewModel.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/DebugLogViewModel.kt
@@ -58,6 +58,10 @@ class DebugLogViewModel @AssistedInject constructor(
         routeToScreen.postValue(DebugLogNavigationEvents.NavigateToPrivacyFragment)
     }
 
+    fun onShareButtonPress() {
+        routeToScreen.postValue(DebugLogNavigationEvents.NavigateToShareFragment)
+    }
+
     fun onIdHistoryPress() {
         routeToScreen.postValue(DebugLogNavigationEvents.NavigateToUploadHistory)
     }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/upload/DebugLogUploadFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/upload/DebugLogUploadFragment.kt
new file mode 100644
index 000000000..f4760fbef
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/upload/DebugLogUploadFragment.kt
@@ -0,0 +1,52 @@
+package de.rki.coronawarnapp.bugreporting.debuglog.ui.upload
+
+import android.os.Bundle
+import android.view.View
+import android.view.accessibility.AccessibilityEvent
+import androidx.fragment.app.Fragment
+import de.rki.coronawarnapp.R
+import de.rki.coronawarnapp.databinding.BugreportingDebuglogUploadFragmentBinding
+import de.rki.coronawarnapp.util.di.AutoInject
+import de.rki.coronawarnapp.util.ui.observe2
+import de.rki.coronawarnapp.util.ui.popBackStack
+import de.rki.coronawarnapp.util.ui.viewBindingLazy
+import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider
+import de.rki.coronawarnapp.util.viewmodel.cwaViewModels
+import javax.inject.Inject
+
+class DebugLogUploadFragment : Fragment(R.layout.bugreporting_debuglog_upload_fragment), AutoInject {
+
+    @Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory
+    private val vm: DebugLogUploadViewModel by cwaViewModels { viewModelFactory }
+    private val binding: BugreportingDebuglogUploadFragmentBinding by viewBindingLazy()
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+        binding.apply {
+
+            debugLogShareButton.setOnClickListener {
+                vm.onUploadLog()
+            }
+
+            debugLogSharePrivacyInformation.setOnClickListener {
+                // TODO Add navigation to new screen
+            }
+
+            toolbar.setNavigationOnClickListener { popBackStack() }
+        }
+
+        vm.routeToScreen.observe2(this) {
+            when (it) {
+
+                DebugLogUploadNavigationEvents.NavigateToMoreInformationFragment -> {
+                    // TODO Add navigation to new screen
+                }
+            }
+        }
+    }
+
+    override fun onResume() {
+        super.onResume()
+        binding.contentContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT)
+    }
+}
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/upload/DebugLogUploadFragmentModule.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/upload/DebugLogUploadFragmentModule.kt
new file mode 100644
index 000000000..a92282daf
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/upload/DebugLogUploadFragmentModule.kt
@@ -0,0 +1,20 @@
+package de.rki.coronawarnapp.bugreporting.debuglog.ui.upload
+
+import dagger.Binds
+import dagger.Module
+import dagger.android.ContributesAndroidInjector
+import dagger.multibindings.IntoMap
+import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
+import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory
+import de.rki.coronawarnapp.util.viewmodel.CWAViewModelKey
+
+@Module
+abstract class DebugLogUploadFragmentModule {
+    @Binds
+    @IntoMap
+    @CWAViewModelKey(DebugLogUploadViewModel::class)
+    abstract fun debugLogViewModel(factory: DebugLogUploadViewModel.Factory): CWAViewModelFactory<out CWAViewModel>
+
+    @ContributesAndroidInjector
+    abstract fun debugLogFragment(): DebugLogUploadFragment
+}
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/upload/DebugLogUploadNavigationEvents.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/upload/DebugLogUploadNavigationEvents.kt
new file mode 100644
index 000000000..e4da0d1ed
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/upload/DebugLogUploadNavigationEvents.kt
@@ -0,0 +1,5 @@
+package de.rki.coronawarnapp.bugreporting.debuglog.ui.upload
+
+sealed class DebugLogUploadNavigationEvents {
+    object NavigateToMoreInformationFragment : DebugLogUploadNavigationEvents()
+}
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/upload/DebugLogUploadViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/upload/DebugLogUploadViewModel.kt
new file mode 100644
index 000000000..d14e063a8
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/debuglog/ui/upload/DebugLogUploadViewModel.kt
@@ -0,0 +1,21 @@
+package de.rki.coronawarnapp.bugreporting.debuglog.ui.upload
+
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
+import de.rki.coronawarnapp.ui.SingleLiveEvent
+import de.rki.coronawarnapp.util.coroutine.DispatcherProvider
+import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
+import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory
+
+class DebugLogUploadViewModel @AssistedInject constructor(
+    dispatcherProvider: DispatcherProvider,
+) : CWAViewModel(dispatcherProvider = dispatcherProvider) {
+    val routeToScreen: SingleLiveEvent<DebugLogUploadNavigationEvents> = SingleLiveEvent()
+
+    fun onUploadLog() {
+        // TODO Implement Uploading
+    }
+
+    @AssistedFactory
+    interface Factory : SimpleCWAViewModelFactory<DebugLogUploadViewModel>
+}
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragmentModule.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragmentModule.kt
index edcc87d63..96ee712dd 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragmentModule.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/information/InformationFragmentModule.kt
@@ -5,6 +5,7 @@ import dagger.Module
 import dagger.android.ContributesAndroidInjector
 import dagger.multibindings.IntoMap
 import de.rki.coronawarnapp.bugreporting.debuglog.ui.DebugLogFragmentModule
+import de.rki.coronawarnapp.bugreporting.debuglog.ui.upload.DebugLogUploadFragmentModule
 import de.rki.coronawarnapp.bugreporting.uploadhistory.ui.LogUploadHistoryModule
 import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
 import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory
@@ -13,7 +14,8 @@ import de.rki.coronawarnapp.util.viewmodel.CWAViewModelKey
 @Module(
     includes = [
         DebugLogFragmentModule::class,
-        LogUploadHistoryModule::class
+        LogUploadHistoryModule::class,
+        DebugLogUploadFragmentModule::class
     ]
 )
 abstract class InformationFragmentModule {
diff --git a/Corona-Warn-App/src/main/res/layout/bugreporting_debuglog_upload_fragment.xml b/Corona-Warn-App/src/main/res/layout/bugreporting_debuglog_upload_fragment.xml
new file mode 100644
index 000000000..54b9737f1
--- /dev/null
+++ b/Corona-Warn-App/src/main/res/layout/bugreporting_debuglog_upload_fragment.xml
@@ -0,0 +1,158 @@
+<?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:bind="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/content_container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:contentDescription="@string/debugging_debuglog_share_log_title"
+        android:focusable="true">
+
+        <Toolbar
+            android:id="@+id/toolbar"
+            style="@style/CWAToolbar"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:navigationIcon="@drawable/ic_back"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <ScrollView
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:layout_marginBottom="@dimen/spacing_small"
+            app:layout_constraintBottom_toTopOf="@id/debug_log_share_button"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/toolbar">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content">
+
+                <TextView
+                    android:id="@+id/bugreporting_share_log_headline"
+                    style="@style/headline4"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="@dimen/spacing_normal"
+                    android:accessibilityHeading="true"
+                    android:focusable="true"
+                    android:text="@string/debugging_debuglog_share_log_title"
+                    app:layout_constraintEnd_toEndOf="@id/guideline_end"
+                    app:layout_constraintStart_toStartOf="@id/guideline_start"
+                    app:layout_constraintTop_toTopOf="parent"
+                    tools:text="@string/debugging_debuglog_share_log_title" />
+
+                <TextView
+                    android:id="@+id/bugreporting_share_log_body_one"
+                    style="@style/subtitle"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="@dimen/spacing_normal"
+                    android:focusable="true"
+                    android:text="@string/debugging_debuglog_share_log_section_one"
+                    app:layout_constraintEnd_toEndOf="@id/guideline_end"
+                    app:layout_constraintStart_toStartOf="@id/guideline_start"
+                    app:layout_constraintTop_toBottomOf="@id/bugreporting_share_log_headline"
+                    tools:text="@string/debugging_debuglog_share_log_section_one" />
+
+                <TextView
+                    android:id="@+id/bugreporting_share_log_body_two"
+                    style="@style/subtitle"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="@dimen/spacing_normal"
+                    android:focusable="true"
+                    android:text="@string/debugging_debuglog_share_log_section_two"
+                    app:layout_constraintEnd_toEndOf="@id/guideline_end"
+                    app:layout_constraintStart_toStartOf="@id/guideline_start"
+                    app:layout_constraintTop_toBottomOf="@id/bugreporting_share_log_body_one"
+                    tools:text="@string/debugging_debuglog_share_log_section_two" />
+
+                <include
+                    android:id="@+id/bugreporting_share_log_privacy_card"
+                    layout="@layout/include_debugging_debuglog_share_privacy_card"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginHorizontal="@dimen/guideline_card"
+                    android:layout_marginTop="@dimen/spacing_normal"
+                    android:focusable="true"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/bugreporting_share_log_body_two" />
+
+                <View
+                    android:id="@+id/bugreporting_share_log_first_divider"
+                    android:layout_width="0dp"
+                    android:layout_height="@dimen/card_divider"
+                    android:layout_marginTop="@dimen/spacing_small"
+                    android:background="?android:attr/listDivider"
+                    app:layout_constraintEnd_toStartOf="@id/guideline_end"
+                    app:layout_constraintStart_toStartOf="@id/guideline_start"
+                    app:layout_constraintTop_toBottomOf="@id/bugreporting_share_log_privacy_card" />
+
+                <TextView
+                    android:id="@+id/debug_log_share_privacy_information"
+                    style="@style/subtitle"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:background="?selectableItemBackground"
+                    android:clickable="true"
+                    android:focusable="true"
+                    android:paddingVertical="@dimen/spacing_tiny"
+                    android:text="@string/debugging_debuglog_share_log_privacy_information"
+                    app:layout_constraintEnd_toEndOf="@id/guideline_end"
+                    app:layout_constraintStart_toStartOf="@id/guideline_start"
+                    app:layout_constraintTop_toBottomOf="@id/bugreporting_share_log_first_divider"
+                    tools:text="@string/debugging_debuglog_share_log_privacy_information" />
+
+                <View
+                    android:id="@+id/bugreporting_share_log_second_divider"
+                    android:layout_width="0dp"
+                    android:layout_height="@dimen/card_divider"
+                    android:background="?android:attr/listDivider"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    bind:layout_constraintEnd_toStartOf="@id/guideline_end"
+                    bind:layout_constraintStart_toStartOf="@id/guideline_start"
+                    bind:layout_constraintTop_toBottomOf="@id/debug_log_share_privacy_information" />
+
+                <androidx.constraintlayout.widget.Guideline
+                    android:id="@+id/guideline_start"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:orientation="vertical"
+                    app:layout_constraintGuide_begin="@dimen/guideline_start" />
+
+                <androidx.constraintlayout.widget.Guideline
+                    android:id="@+id/guideline_end"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:orientation="vertical"
+                    app:layout_constraintGuide_end="@dimen/guideline_end" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+
+        </ScrollView>
+
+        <android.widget.Button
+            android:id="@+id/debug_log_share_button"
+            style="@style/buttonPrimary"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/spacing_normal"
+            android:layout_marginEnd="@dimen/spacing_normal"
+            android:layout_marginBottom="@dimen/spacing_small"
+            android:text="@string/debugging_debuglog_share_log_button"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            tools:text="@string/debugging_debuglog_share_log_button" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</layout>
diff --git a/Corona-Warn-App/src/main/res/layout/include_debugging_debuglog_share_privacy_card.xml b/Corona-Warn-App/src/main/res/layout/include_debugging_debuglog_share_privacy_card.xml
new file mode 100644
index 000000000..11e4b7383
--- /dev/null
+++ b/Corona-Warn-App/src/main/res/layout/include_debugging_debuglog_share_privacy_card.xml
@@ -0,0 +1,115 @@
+<?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">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/debug_log_share_privacy_card"
+        style="@style/GreyCard"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="@dimen/spacing_normal"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <TextView
+            android:id="@+id/debug_log_share_privacy_card_title"
+            style="@style/headline5"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:accessibilityHeading="true"
+            android:focusable="true"
+            android:text="@string/debugging_debuglog_share_privacy_card_title"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <TextView
+            android:id="@+id/debug_log_share_privacy_card_section_one"
+            style="@style/subtitle"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/spacing_normal"
+            android:accessibilityHeading="true"
+            android:focusable="true"
+            android:text="@string/debugging_debuglog_share_privacy_card_body_1"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/debug_log_share_privacy_card_title" />
+
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:id="@+id/debug_log_share_privacy_card_bullet_point_container_one"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/spacing_normal"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/debug_log_share_privacy_card_section_one">
+
+            <include
+                android:id="@+id/debug_log_share_privacy_card_bulletpoint_one"
+                layout="@layout/include_bullet_point"
+                android:layout_width="@dimen/bullet_point_size"
+                android:layout_height="@dimen/bullet_point_size"
+                app:layout_constraintBaseline_toBaselineOf="@id/debug_log_share_privacy_card_bullet_point_text_one" />
+
+            <TextView
+                android:id="@+id/debug_log_share_privacy_card_bullet_point_text_one"
+                style="@style/subtitle"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/spacing_normal"
+                android:focusable="true"
+                android:text="@string/debugging_debuglog_share_privacy_card_bullet_point_1"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toEndOf="@+id/debug_log_share_privacy_card_bulletpoint_one"
+                app:layout_constraintTop_toTopOf="parent" />
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:id="@+id/debug_log_share_privacy_card_bullet_point_container_two"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/spacing_normal"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/debug_log_share_privacy_card_bullet_point_container_one">
+
+            <include
+                android:id="@+id/debug_log_share_privacy_card_bulletpoint_two"
+                layout="@layout/include_bullet_point"
+                android:layout_width="@dimen/bullet_point_size"
+                android:layout_height="@dimen/bullet_point_size"
+                app:layout_constraintBaseline_toBaselineOf="@id/debug_log_share_privacy_card_bullet_point_text_two" />
+
+            <TextView
+                android:id="@+id/debug_log_share_privacy_card_bullet_point_text_two"
+                style="@style/subtitle"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/spacing_normal"
+                android:focusable="true"
+                android:text="@string/debugging_debuglog_share_privacy_card_bullet_point_2"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toEndOf="@+id/debug_log_share_privacy_card_bulletpoint_two"
+                app:layout_constraintTop_toTopOf="parent" />
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+        <TextView
+            android:id="@+id/debug_log_share_privacy_card_section_two"
+            style="@style/subtitle"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/spacing_normal"
+            android:accessibilityHeading="true"
+            android:focusable="true"
+            android:text="@string/debugging_debuglog_share_privacy_card_body_2"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/debug_log_share_privacy_card_bullet_point_container_two" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</layout>
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 dcdff0e2a..c869b4673 100644
--- a/Corona-Warn-App/src/main/res/navigation/nav_graph.xml
+++ b/Corona-Warn-App/src/main/res/navigation/nav_graph.xml
@@ -509,6 +509,9 @@
         <action
             android:id="@+id/action_debuglogFragment_to_logUploadHistoryFragment"
             app:destination="@id/logUploadHistoryFragment" />
+        <action
+            android:id="@+id/action_debuglogFragment_to_debugLogUploadFragment"
+            app:destination="@id/debugLogUploadFragment" />
     </fragment>
 
     <!-- New Release -->
@@ -588,4 +591,9 @@
         android:name="de.rki.coronawarnapp.bugreporting.uploadhistory.ui.LogUploadHistoryFragment"
         android:label="LogUploadHistoryFragment"
         tools:layout="@layout/bugreporting_upload_history_fragment" />
+    <fragment
+        android:id="@+id/debugLogUploadFragment"
+        android:name="de.rki.coronawarnapp.bugreporting.debuglog.ui.upload.DebugLogUploadFragment"
+        android:label="DebugLogUploadFragment"
+        tools:layout="@layout/bugreporting_debuglog_upload_fragment" />
 </navigation>
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 52d2dcbcf..62a4902c0 100644
--- a/Corona-Warn-App/src/main/res/values-de/strings.xml
+++ b/Corona-Warn-App/src/main/res/values-de/strings.xml
@@ -901,6 +901,26 @@
     <!-- XHED: Title for native sharing dialog -->
     <string name="debugging_debuglog_sharing_dialog_title">"CWA Fehlerbericht teilen"</string>
 
+    <!-- XHED: Title for Bugreporting share log screen -->
+    <string name="debugging_debuglog_share_log_title">"Fehlerbericht senden"</string>
+    <!-- YTXT: First body section for bugreporting share log screen -->
+    <string name="debugging_debuglog_share_log_section_one">"Bevor Sie den aufgezeichneten Fehlerbericht an den technischen Support des RKI übersenden können, ist Ihr Einverständnis erforderlich."</string>
+    <!-- YTXT: Second body section for bugreporting share log screen -->
+    <string name="debugging_debuglog_share_log_section_two">"Nach der Übersendung erhalten Sie eine Fehlerbericht-ID. Diese können Sie angeben, um dem technischen Support z.B. weitere Informationen zukommen zu lassen und dabei eine Zuordnung zu Ihrem Fehlerbericht zu ermöglichen. Wenn Sie die Fehlerbericht-ID nicht mitteilen, ist dem RKI eine Zuordnung zu Ihrer Person nicht möglich."</string>
+    <!-- YTXT: Privacy Information section for bugreporting share log screen -->
+    <string name="debugging_debuglog_share_log_privacy_information">"Ausführliche Informationen zu dieser Datenverarbeitung und den Datenschutzrisiken in den USA und anderen Drittländern."</string>
+    <!-- XBUT: Button for bugreporting share log screen -->
+    <string name="debugging_debuglog_share_log_button">"Einverstanden und senden"</string>
+    <!-- XHED: Title for Bugreporting share log Privacy Card -->
+    <string name="debugging_debuglog_share_privacy_card_title">"Ihr Einverständnis"</string>
+    <!-- YTXT: First body section for Bugreporting share log Privacy Card -->
+    <string name="debugging_debuglog_share_privacy_card_body_1">"Durch Antippen von „Einverstanden und senden“ willigen Sie in folgende Schritte ein:"</string>
+    <!-- YTXT: First bullet point for Bugreporting share log Privacy Card -->
+    <string name="debugging_debuglog_share_privacy_card_bullet_point_1">"Der von Ihnen erstellte Fehlerbericht wird zu Zwecken der Fehleranalyse an das RKI übermittelt. Das RKI wird den Fehlerbericht auswerten, um mögliche Ursachen der in Ihrer App auftretenden Fehler erkennen und beheben zu können. Wenn Sie dem technischen Support die Fehlerbericht-ID mitteilen, kann das RKI den Fehlerbericht Ihrer Person zuordnen."</string>
+    <!-- YTXT: Second bullet point for Bugreporting share log Privacy Card -->
+    <string name="debugging_debuglog_share_privacy_card_bullet_point_2">"Bevor der Bericht an das RKI übersendet wird, wird die Echtheit Ihrer App einmalig geprüft. Dazu wird durch Ihr Smartphone eine eindeutige Kennung erzeugt und an Google in die USA oder andere Drittländer übermittelt, damit Google die Echtheit Ihrer App gegenüber dem RKI bestätigen kann. Die Kennung enthält Informationen über die Version Ihres Smartphones und der App. Google kann damit möglicherweise auf Ihre Identität schließen und nachvollziehen, dass die Echtheitsprüfung Ihres Smartphones stattgefunden hat. Weitere Angaben aus der App oder dem Fehlerbericht erhält Google hierbei nicht."</string>
+    <!-- YTXT: Second body section for Bugreporting share log Privacy Card -->
+    <string name="debugging_debuglog_share_privacy_card_body_2">"Sollten Sie dem technischen Support nach der Übersendung Ihre Fehlerbericht-ID mitgeteilt haben, können Sie auch jederzeit die Löschung der weiteren mitgeteilten Informationen, der Fehlerbericht-ID und des Fehlerberichtes verlangen. Andernfalls wird der Fehlerbericht automatisch nach 14 Tagen gelöscht."</string>
     <!-- XHED: Title for log upload history -->
     <string name="debugging_debuglog_uploadhistory_title">"ID Historie"</string>
     <!-- YTXT: Description for log upload history -->
diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml
index b381fe6e3..e5f16b2d3 100644
--- a/Corona-Warn-App/src/main/res/values/strings.xml
+++ b/Corona-Warn-App/src/main/res/values/strings.xml
@@ -915,11 +915,32 @@
     <!-- XHED: Title for native sharing dialog -->
     <string name="debugging_debuglog_sharing_dialog_title">"Share CWA Error Report"</string>
 
+    <!-- XHED: Title for Bugreporting share log screen -->
+    <string name="debugging_debuglog_share_log_title">"Fehlerbericht senden"</string>
+    <!-- YTXT: First body section for bugreporting share log screen -->
+    <string name="debugging_debuglog_share_log_section_one">"Bevor Sie den aufgezeichneten Fehlerbericht an den technischen Support des RKI übersenden können, ist Ihr Einverständnis erforderlich."</string>
+    <!-- YTXT: Second body section for bugreporting share log screen -->
+    <string name="debugging_debuglog_share_log_section_two">"Nach der Übersendung erhalten Sie eine Fehlerbericht-ID. Diese können Sie angeben, um dem technischen Support z.B. weitere Informationen zukommen zu lassen und dabei eine Zuordnung zu Ihrem Fehlerbericht zu ermöglichen. Wenn Sie die Fehlerbericht-ID nicht mitteilen, ist dem RKI eine Zuordnung zu Ihrer Person nicht möglich."</string>
+    <!-- YTXT: Privacy Information section for bugreporting share log screen -->
+    <string name="debugging_debuglog_share_log_privacy_information">"Ausführliche Informationen zu dieser Datenverarbeitung und den Datenschutzrisiken in den USA und anderen Drittländern."</string>
+    <!-- XBUT: Button for bugreporting share log screen -->
+    <string name="debugging_debuglog_share_log_button">"Einverstanden und senden"</string>
+    <!-- XHED: Title for Bugreporting share log Privacy Card -->
+    <string name="debugging_debuglog_share_privacy_card_title">"Ihr Einverständnis"</string>
+    <!-- YTXT: First body section for Bugreporting share log Privacy Card -->
+    <string name="debugging_debuglog_share_privacy_card_body_1">"Durch Antippen von „Einverstanden und senden“ willigen Sie in folgende Schritte ein:"</string>
+    <!-- YTXT: First bullet point for Bugreporting share log Privacy Card -->
+    <string name="debugging_debuglog_share_privacy_card_bullet_point_1">"Der von Ihnen erstellte Fehlerbericht wird zu Zwecken der Fehleranalyse an das RKI übermittelt. Das RKI wird den Fehlerbericht auswerten, um mögliche Ursachen der in Ihrer App auftretenden Fehler erkennen und beheben zu können. Wenn Sie dem technischen Support die Fehlerbericht-ID mitteilen, kann das RKI den Fehlerbericht Ihrer Person zuordnen."</string>
+    <!-- YTXT: Second bullet point for Bugreporting share log Privacy Card -->
+    <string name="debugging_debuglog_share_privacy_card_bullet_point_2">"Bevor der Bericht an das RKI übersendet wird, wird die Echtheit Ihrer App einmalig geprüft. Dazu wird durch Ihr Smartphone eine eindeutige Kennung erzeugt und an Google in die USA oder andere Drittländer übermittelt, damit Google die Echtheit Ihrer App gegenüber dem RKI bestätigen kann. Die Kennung enthält Informationen über die Version Ihres Smartphones und der App. Google kann damit möglicherweise auf Ihre Identität schließen und nachvollziehen, dass die Echtheitsprüfung Ihres Smartphones stattgefunden hat. Weitere Angaben aus der App oder dem Fehlerbericht erhält Google hierbei nicht."</string>
+    <!-- YTXT: Second body section for Bugreporting share log Privacy Card -->
+    <string name="debugging_debuglog_share_privacy_card_body_2">"Sollten Sie dem technischen Support nach der Übersendung Ihre Fehlerbericht-ID mitgeteilt haben, können Sie auch jederzeit die Löschung der weiteren mitgeteilten Informationen, der Fehlerbericht-ID und des Fehlerberichtes verlangen. Andernfalls wird der Fehlerbericht automatisch nach 14 Tagen gelöscht."</string>
     <!-- XHED: Title for log upload history -->
     <string name="debugging_debuglog_uploadhistory_title">"ID Historie"</string>
     <!-- YTXT: Description for log upload history -->
     <string name="debugging_debuglog_uploadhistory_description">"Hier sehen Sie die IDs Ihrer Fehleranalyse-Protokolle."</string>
 
+
     <string name="debugging_debuglog_privacy_card_title">"Datenschutz und Datensicherheit"</string>
     <string name="debug_log_privacy_card_section_body_one">"Die Aufzeichnung des Fehlerberichts ist freiwillig."</string>
     <string name="debug_log_privacy_card_container_section_two">"Auf den Fehlerbericht haben zunächst nur Sie Zugriff. Sie können im Anschluss entscheiden, ob Sie den Fehlerbericht an den technischen Support senden, ob Sie den Fehlerbericht zunächst auf Ihrem Smartphone speichern oder die Aufzeichnung stoppen und löschen wollen. Wenn Sie den Fehlerbericht zunächst lokal speichern, haben Sie die Möglichkeit, sich den Fehlerbericht selbst anzuschauen, bevor Sie diesen an den Support übermitteln."</string>
-- 
GitLab