From e1ab02f13bbfd7cf7c9ab12595c63c537451ee85 Mon Sep 17 00:00:00 2001
From: Philipp Nowak <10376534+PhilippNowak96@users.noreply.github.com>
Date: Fri, 20 Nov 2020 15:37:29 +0100
Subject: [PATCH] Fix scrolling for SubmissionQRCodeInfoFragment and refactor
 layout code structure to match the other layouts (EXPOSUREAPP-3436) (#1607)
 (#1662)

Co-authored-by: Katharina Seiz <Katharina.Seiz@sap.com>
Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com>
Co-authored-by: AlexanderAlferov <64849422+AlexanderAlferov@users.noreply.github.com>
---
 .../fragment_submission_qr_code_info.xml      | 228 +-----------------
 .../include_submission_qr_code_info.xml       | 219 +++++++++++++++++
 2 files changed, 229 insertions(+), 218 deletions(-)
 create mode 100644 Corona-Warn-App/src/main/res/layout/include_submission_qr_code_info.xml

diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_qr_code_info.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_qr_code_info.xml
index d5a9a1cd1..1c9774776 100644
--- a/Corona-Warn-App/src/main/res/layout/fragment_submission_qr_code_info.xml
+++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_qr_code_info.xml
@@ -5,9 +5,9 @@
 
     <androidx.constraintlayout.widget.ConstraintLayout
         android:id="@+id/submission_done_container"
-        android:contentDescription="@string/submission_done_title"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
+        android:contentDescription="@string/submission_done_title"
         android:fillViewport="true"
         tools:context=".ui.submission.fragment.SubmissionQRCodeInfo">
 
@@ -17,228 +17,20 @@
             android:layout_width="@dimen/match_constraint"
             android:layout_height="wrap_content"
             app:icon="@{@drawable/ic_back}"
-            app:title="@string/submission_qr_info_headline"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintBottom_toTopOf="@id/submission_qr_code_info_scrollview" />
+            app:layout_constraintTop_toTopOf="parent"
+            app:title="@string/submission_qr_info_headline" />
 
-        <ScrollView
-            android:id="@+id/submission_qr_code_info_scrollview"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
+        <include
+            android:id="@+id/include_submission_qr_code_info"
+            layout="@layout/include_submission_qr_code_info"
+            android:layout_width="@dimen/match_constraint"
+            android:layout_height="@dimen/match_constraint"
+            app:layout_constraintBottom_toTopOf="@id/guideline_action"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/submission_qr_code_info_header">
-
-            <androidx.constraintlayout.widget.ConstraintLayout
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:focusable="true">
-
-                <ImageView
-                    android:id="@+id/submission_qr_info_illustration"
-                    android:layout_width="@dimen/match_constraint"
-                    android:layout_height="wrap_content"
-                    android:focusable="true"
-                    android:src="@drawable/ic_illustrations_qr_code_scan_info"
-                    app:layout_constraintEnd_toEndOf="parent"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toTopOf="parent" />
-
-                <androidx.constraintlayout.widget.ConstraintLayout
-                    android:id="@+id/qr_info_step_1"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:focusable="true"
-                    android:layout_marginTop="@dimen/bullet_point_spacing_after"
-                    android:layout_marginHorizontal="@dimen/guideline_card"
-                    app:layout_constraintEnd_toEndOf="parent"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toBottomOf="@id/submission_qr_info_illustration">
-
-                    <androidx.constraintlayout.widget.ConstraintLayout
-                        android:id="@+id/qr_info_step_1_icon"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:background="@drawable/circle"
-                        android:backgroundTint="@color/card_dark"
-                        app:layout_constraintBottom_toBottomOf="parent"
-                        app:layout_constraintStart_toStartOf="parent"
-                        app:layout_constraintTop_toTopOf="parent">
-
-                        <ImageView
-                            style="@style/icon"
-                            android:layout_width="@dimen/icon_size_risk_details_behavior"
-                            android:layout_height="@dimen/icon_size_risk_details_behavior"
-                            android:layout_margin="@dimen/icon_margin_risk_details_behavior"
-                            android:focusable="false"
-                            android:importantForAccessibility="no"
-                            android:src="@drawable/ic_qr_icon_personal_result"
-                            android:tint="@color/button_primary"
-                            app:layout_constraintBottom_toBottomOf="parent"
-                            app:layout_constraintEnd_toEndOf="parent"
-                            app:layout_constraintStart_toStartOf="parent"
-                            app:layout_constraintTop_toTopOf="parent" />
-                    </androidx.constraintlayout.widget.ConstraintLayout>
-
-                    <TextView
-                        style="@style/subtitle"
-                        android:layout_width="0dp"
-                        android:layout_height="wrap_content"
-                        android:layout_marginStart="@dimen/spacing_small"
-                        android:text="@string/submission_qr_info_point_1_body"
-                        app:layout_constraintBottom_toBottomOf="parent"
-                        app:layout_constraintEnd_toEndOf="parent"
-                        app:layout_constraintStart_toEndOf="@+id/qr_info_step_1_icon"
-                        app:layout_constraintTop_toTopOf="parent" />
-                </androidx.constraintlayout.widget.ConstraintLayout>
-
-                <androidx.constraintlayout.widget.ConstraintLayout
-                    android:id="@+id/qr_info_step_2"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:focusable="true"
-                    android:layout_marginTop="@dimen/bullet_point_spacing_after"
-                    android:layout_marginHorizontal="@dimen/guideline_card"
-                    app:layout_constraintEnd_toEndOf="parent"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toBottomOf="@id/qr_info_step_1">
-
-                    <androidx.constraintlayout.widget.ConstraintLayout
-                        android:id="@+id/qr_info_step_2_icon"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:background="@drawable/circle"
-                        android:backgroundTint="@color/card_dark"
-                        app:layout_constraintBottom_toBottomOf="parent"
-                        app:layout_constraintStart_toStartOf="parent"
-                        app:layout_constraintTop_toTopOf="parent">
-
-                        <ImageView
-                            style="@style/icon"
-                            android:layout_width="@dimen/icon_size_risk_details_behavior"
-                            android:layout_height="@dimen/icon_size_risk_details_behavior"
-                            android:layout_margin="@dimen/icon_margin_risk_details_behavior"
-                            android:focusable="false"
-                            android:importantForAccessibility="no"
-                            android:src="@drawable/ic_qr_icon_test_scan"
-                            android:tint="@color/button_primary"
-                            app:layout_constraintBottom_toBottomOf="parent"
-                            app:layout_constraintEnd_toEndOf="parent"
-                            app:layout_constraintStart_toStartOf="parent"
-                            app:layout_constraintTop_toTopOf="parent" />
-                    </androidx.constraintlayout.widget.ConstraintLayout>
-
-                    <TextView
-                        style="@style/subtitle"
-                        android:layout_width="0dp"
-                        android:layout_height="wrap_content"
-                        android:layout_marginStart="@dimen/spacing_small"
-                        android:text="@string/submission_qr_info_point_2_body"
-                        app:layout_constraintBottom_toBottomOf="parent"
-                        app:layout_constraintEnd_toEndOf="parent"
-                        app:layout_constraintStart_toEndOf="@+id/qr_info_step_2_icon"
-                        app:layout_constraintTop_toTopOf="parent" />
-                </androidx.constraintlayout.widget.ConstraintLayout>
-
-                <androidx.constraintlayout.widget.ConstraintLayout
-                    android:id="@+id/qr_info_step_3"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:focusable="true"
-                    android:layout_marginTop="@dimen/bullet_point_spacing_after"
-                    android:layout_marginHorizontal="@dimen/guideline_card"
-                    app:layout_constraintEnd_toEndOf="parent"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toBottomOf="@id/qr_info_step_2">
-
-                    <androidx.constraintlayout.widget.ConstraintLayout
-                        android:id="@+id/qr_info_step_3_icon"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:background="@drawable/circle"
-                        android:backgroundTint="@color/card_dark"
-                        app:layout_constraintBottom_toBottomOf="parent"
-                        app:layout_constraintStart_toStartOf="parent"
-                        app:layout_constraintTop_toTopOf="parent">
-
-                        <ImageView
-                            style="@style/icon"
-                            android:layout_width="@dimen/icon_size_risk_details_behavior"
-                            android:layout_height="@dimen/icon_size_risk_details_behavior"
-                            android:layout_margin="@dimen/icon_margin_risk_details_behavior"
-                            android:focusable="false"
-                            android:importantForAccessibility="no"
-                            android:src="@drawable/ic_qr_icon_multiple_tests"
-                            android:tint="@color/button_primary"
-                            app:layout_constraintBottom_toBottomOf="parent"
-                            app:layout_constraintEnd_toEndOf="parent"
-                            app:layout_constraintStart_toStartOf="parent"
-                            app:layout_constraintTop_toTopOf="parent" />
-                    </androidx.constraintlayout.widget.ConstraintLayout>
-
-                    <TextView
-                        style="@style/subtitle"
-                        android:layout_width="0dp"
-                        android:layout_height="wrap_content"
-                        android:layout_marginStart="@dimen/spacing_small"
-                        android:text="@string/submission_qr_info_point_3_body"
-                        app:layout_constraintBottom_toBottomOf="parent"
-                        app:layout_constraintEnd_toEndOf="parent"
-                        app:layout_constraintStart_toEndOf="@+id/qr_info_step_3_icon"
-                        app:layout_constraintTop_toTopOf="parent" />
-                </androidx.constraintlayout.widget.ConstraintLayout>
-
-                <androidx.constraintlayout.widget.ConstraintLayout
-                    android:id="@+id/qr_info_step_4"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:focusable="true"
-                    android:layout_marginTop="@dimen/bullet_point_spacing_after"
-                    android:layout_marginHorizontal="@dimen/guideline_card"
-                    app:layout_constraintEnd_toEndOf="parent"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toBottomOf="@id/qr_info_step_3">
-
-                    <androidx.constraintlayout.widget.ConstraintLayout
-                        android:id="@+id/qr_info_step_4_icon"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:background="@drawable/circle"
-                        android:backgroundTint="@color/card_dark"
-                        app:layout_constraintBottom_toBottomOf="parent"
-                        app:layout_constraintStart_toStartOf="parent"
-                        app:layout_constraintTop_toTopOf="parent">
-
-                        <ImageView
-                            style="@style/icon"
-                            android:layout_width="@dimen/icon_size_risk_details_behavior"
-                            android:layout_height="@dimen/icon_size_risk_details_behavior"
-                            android:layout_margin="@dimen/icon_margin_risk_details_behavior"
-                            android:focusable="false"
-                            android:importantForAccessibility="no"
-                            android:src="@drawable/ic_qr_icon_info"
-                            android:tint="@color/button_primary"
-                            app:layout_constraintBottom_toBottomOf="parent"
-                            app:layout_constraintEnd_toEndOf="parent"
-                            app:layout_constraintStart_toStartOf="parent"
-                            app:layout_constraintTop_toTopOf="parent" />
-                    </androidx.constraintlayout.widget.ConstraintLayout>
-
-                    <TextView
-                        style="@style/subtitle"
-                        android:layout_width="0dp"
-                        android:layout_height="wrap_content"
-                        android:layout_marginStart="@dimen/spacing_small"
-                        android:text="@string/submission_qr_info_point_4_body"
-                        app:layout_constraintBottom_toBottomOf="parent"
-                        app:layout_constraintEnd_toEndOf="parent"
-                        app:layout_constraintStart_toEndOf="@+id/qr_info_step_4_icon"
-                        app:layout_constraintTop_toTopOf="parent" />
-                </androidx.constraintlayout.widget.ConstraintLayout>
-            </androidx.constraintlayout.widget.ConstraintLayout>
-
-        </ScrollView>
+            app:layout_constraintTop_toBottomOf="@+id/submission_qr_code_info_header" />
 
         <Button
             android:id="@+id/submission_qr_info_button_next"
diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_qr_code_info.xml b/Corona-Warn-App/src/main/res/layout/include_submission_qr_code_info.xml
new file mode 100644
index 000000000..2f68632b6
--- /dev/null
+++ b/Corona-Warn-App/src/main/res/layout/include_submission_qr_code_info.xml
@@ -0,0 +1,219 @@
+<?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
+        android:id="@+id/submission_qr_code_info_scrollview"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:focusable="true">
+
+            <ImageView
+                android:id="@+id/submission_qr_info_illustration"
+                android:layout_width="@dimen/match_constraint"
+                android:layout_height="wrap_content"
+                android:focusable="true"
+                android:src="@drawable/ic_illustrations_qr_code_scan_info"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:id="@+id/qr_info_step_1"
+                android:layout_width="@dimen/match_constraint"
+                android:layout_height="wrap_content"
+                android:layout_marginHorizontal="@dimen/guideline_card"
+                android:layout_marginTop="@dimen/bullet_point_spacing_after"
+                android:focusable="true"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@id/submission_qr_info_illustration">
+
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/qr_info_step_1_icon"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:background="@drawable/circle"
+                    android:backgroundTint="@color/card_dark"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent">
+
+                    <ImageView
+                        style="@style/icon"
+                        android:layout_width="@dimen/icon_size_risk_details_behavior"
+                        android:layout_height="@dimen/icon_size_risk_details_behavior"
+                        android:layout_margin="@dimen/icon_margin_risk_details_behavior"
+                        android:focusable="false"
+                        android:importantForAccessibility="no"
+                        android:src="@drawable/ic_qr_icon_personal_result"
+                        android:tint="@color/button_primary"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent" />
+                </androidx.constraintlayout.widget.ConstraintLayout>
+
+                <TextView
+                    style="@style/subtitle"
+                    android:layout_width="@dimen/match_constraint"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="@dimen/spacing_small"
+                    android:text="@string/submission_qr_info_point_1_body"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toEndOf="@+id/qr_info_step_1_icon"
+                    app:layout_constraintTop_toTopOf="parent" />
+            </androidx.constraintlayout.widget.ConstraintLayout>
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:id="@+id/qr_info_step_2"
+                android:layout_width="@dimen/match_constraint"
+                android:layout_height="wrap_content"
+                android:layout_marginHorizontal="@dimen/guideline_card"
+                android:layout_marginTop="@dimen/bullet_point_spacing_after"
+                android:focusable="true"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@id/qr_info_step_1">
+
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/qr_info_step_2_icon"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:background="@drawable/circle"
+                    android:backgroundTint="@color/card_dark"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent">
+
+                    <ImageView
+                        style="@style/icon"
+                        android:layout_width="@dimen/icon_size_risk_details_behavior"
+                        android:layout_height="@dimen/icon_size_risk_details_behavior"
+                        android:layout_margin="@dimen/icon_margin_risk_details_behavior"
+                        android:focusable="false"
+                        android:importantForAccessibility="no"
+                        android:src="@drawable/ic_qr_icon_test_scan"
+                        android:tint="@color/button_primary"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent" />
+                </androidx.constraintlayout.widget.ConstraintLayout>
+
+                <TextView
+                    style="@style/subtitle"
+                    android:layout_width="@dimen/match_constraint"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="@dimen/spacing_small"
+                    android:text="@string/submission_qr_info_point_2_body"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toEndOf="@+id/qr_info_step_2_icon"
+                    app:layout_constraintTop_toTopOf="parent" />
+            </androidx.constraintlayout.widget.ConstraintLayout>
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:id="@+id/qr_info_step_3"
+                android:layout_width="@dimen/match_constraint"
+                android:layout_height="wrap_content"
+                android:layout_marginHorizontal="@dimen/guideline_card"
+                android:layout_marginTop="@dimen/bullet_point_spacing_after"
+                android:focusable="true"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@id/qr_info_step_2">
+
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/qr_info_step_3_icon"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:background="@drawable/circle"
+                    android:backgroundTint="@color/card_dark"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent">
+
+                    <ImageView
+                        style="@style/icon"
+                        android:layout_width="@dimen/icon_size_risk_details_behavior"
+                        android:layout_height="@dimen/icon_size_risk_details_behavior"
+                        android:layout_margin="@dimen/icon_margin_risk_details_behavior"
+                        android:focusable="false"
+                        android:importantForAccessibility="no"
+                        android:src="@drawable/ic_qr_icon_multiple_tests"
+                        android:tint="@color/button_primary"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent" />
+                </androidx.constraintlayout.widget.ConstraintLayout>
+
+                <TextView
+                    style="@style/subtitle"
+                    android:layout_width="@dimen/match_constraint"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="@dimen/spacing_small"
+                    android:text="@string/submission_qr_info_point_3_body"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toEndOf="@+id/qr_info_step_3_icon"
+                    app:layout_constraintTop_toTopOf="parent" />
+            </androidx.constraintlayout.widget.ConstraintLayout>
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:id="@+id/qr_info_step_4"
+                android:layout_width="@dimen/match_constraint"
+                android:layout_height="wrap_content"
+                android:layout_marginHorizontal="@dimen/guideline_card"
+                android:layout_marginTop="@dimen/bullet_point_spacing_after"
+                android:focusable="true"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@id/qr_info_step_3">
+
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/qr_info_step_4_icon"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:background="@drawable/circle"
+                    android:backgroundTint="@color/card_dark"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent">
+
+                    <ImageView
+                        style="@style/icon"
+                        android:layout_width="@dimen/icon_size_risk_details_behavior"
+                        android:layout_height="@dimen/icon_size_risk_details_behavior"
+                        android:layout_margin="@dimen/icon_margin_risk_details_behavior"
+                        android:focusable="false"
+                        android:importantForAccessibility="no"
+                        android:src="@drawable/ic_qr_icon_info"
+                        android:tint="@color/button_primary"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent" />
+                </androidx.constraintlayout.widget.ConstraintLayout>
+
+                <TextView
+                    style="@style/subtitle"
+                    android:layout_width="@dimen/match_constraint"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="@dimen/spacing_small"
+                    android:text="@string/submission_qr_info_point_4_body"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toEndOf="@+id/qr_info_step_4_icon"
+                    app:layout_constraintTop_toTopOf="parent" />
+            </androidx.constraintlayout.widget.ConstraintLayout>
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+    </ScrollView>
+</layout>
\ No newline at end of file
-- 
GitLab