From e481f2440e3da4818e79ec5ecff5d8ca99d5d006 Mon Sep 17 00:00:00 2001 From: Juraj Kusnier <jurajkusnier@users.noreply.github.com> Date: Wed, 5 May 2021 13:40:02 +0200 Subject: [PATCH] Home Screen - Registration card (EXPOSUREAPP-6724) (#3061) * Vaccination Certificate Register Home Card * Lint format * Update CreateVaccinationHomeCard * Update card layout --- .../coronawarnapp/ui/main/home/HomeAdapter.kt | 2 + .../ui/main/home/HomeFragmentViewModel.kt | 9 +++ .../ui/homecards/CreateVaccinationHomeCard.kt | 36 ++++++++++ .../ic_card_impfzertifikat_registrieren.xml | 30 ++++++++ .../home_vaccination_registration_card.xml | 72 +++++++++++++++++++ .../src/main/res/values-de/strings.xml | 7 ++ .../src/main/res/values/strings.xml | 7 ++ 7 files changed, 163 insertions(+) create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/homecards/CreateVaccinationHomeCard.kt create mode 100644 Corona-Warn-App/src/main/res/drawable/ic_card_impfzertifikat_registrieren.xml create mode 100644 Corona-Warn-App/src/main/res/layout/home_vaccination_registration_card.xml diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeAdapter.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeAdapter.kt index 66c65f4a5..6424e86df 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeAdapter.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeAdapter.kt @@ -38,6 +38,7 @@ import de.rki.coronawarnapp.util.lists.modular.mods.DataBinderMod import de.rki.coronawarnapp.util.lists.modular.mods.SavedStateMod import de.rki.coronawarnapp.util.lists.modular.mods.StableIdMod import de.rki.coronawarnapp.util.lists.modular.mods.TypedVHCreatorMod +import de.rki.coronawarnapp.vaccination.ui.homecards.CreateVaccinationHomeCard class HomeAdapter : ModularAdapter<HomeAdapter.HomeItemVH<HomeItem, ViewBinding>>(), @@ -76,6 +77,7 @@ class HomeAdapter : TypedVHCreatorMod({ data[it] is RapidTestOutdatedCard.Item }) { RapidTestOutdatedCard(it) }, TypedVHCreatorMod({ data[it] is TestUnregisteredCard.Item }) { TestUnregisteredCard(it) }, TypedVHCreatorMod({ data[it] is StatisticsHomeCard.Item }) { StatisticsHomeCard(it) }, + TypedVHCreatorMod({ data[it] is CreateVaccinationHomeCard.Item }) { CreateVaccinationHomeCard(it) }, SavedStateMod<HomeItemVH<HomeItem, ViewBinding>>() // For statistics card scroll position ) ) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentViewModel.kt index 922423eaa..6ce3d21e2 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentViewModel.kt @@ -70,6 +70,7 @@ import de.rki.coronawarnapp.util.shortcuts.AppShortcutsHelper import de.rki.coronawarnapp.util.ui.SingleLiveEvent import de.rki.coronawarnapp.util.viewmodel.CWAViewModel import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory +import de.rki.coronawarnapp.vaccination.ui.homecards.CreateVaccinationHomeCard import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map @@ -332,6 +333,14 @@ class HomeFragmentViewModel @AssistedInject constructor( } } + add( + CreateVaccinationHomeCard.Item( + onClickAction = { + // TODO: implement in another PR + } + ) + ) + if (statsData.isDataAvailable) { add( StatisticsHomeCard.Item( diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/homecards/CreateVaccinationHomeCard.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/homecards/CreateVaccinationHomeCard.kt new file mode 100644 index 000000000..6c180b859 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/homecards/CreateVaccinationHomeCard.kt @@ -0,0 +1,36 @@ +package de.rki.coronawarnapp.vaccination.ui.homecards + +import android.view.ViewGroup +import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.databinding.HomeVaccinationRegistrationCardBinding +import de.rki.coronawarnapp.ui.main.home.HomeAdapter +import de.rki.coronawarnapp.ui.main.home.items.HomeItem +import de.rki.coronawarnapp.util.lists.diffutil.HasPayloadDiffer + +class CreateVaccinationHomeCard(parent: ViewGroup) : + HomeAdapter.HomeItemVH<CreateVaccinationHomeCard.Item, HomeVaccinationRegistrationCardBinding>( + R.layout.home_card_container_layout, + parent + ) { + + override val viewBinding = lazy { + HomeVaccinationRegistrationCardBinding.inflate(layoutInflater, itemView.findViewById(R.id.card_container), true) + } + + override val onBindData: HomeVaccinationRegistrationCardBinding.( + item: Item, + payloads: List<Any> + ) -> Unit = { item, payloads -> + + itemView.setOnClickListener { + val curItem = payloads.filterIsInstance<Item>().singleOrNull() ?: item + curItem.onClickAction(item) + } + } + + data class Item(val onClickAction: (Item) -> Unit) : HomeItem, HasPayloadDiffer { + override val stableId: Long = Item::class.java.name.hashCode().toLong() + + override fun diffPayload(old: Any, new: Any): Any? = if (old::class == new::class) new else null + } +} diff --git a/Corona-Warn-App/src/main/res/drawable/ic_card_impfzertifikat_registrieren.xml b/Corona-Warn-App/src/main/res/drawable/ic_card_impfzertifikat_registrieren.xml new file mode 100644 index 000000000..c09ec8966 --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable/ic_card_impfzertifikat_registrieren.xml @@ -0,0 +1,30 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="96dp" + android:height="80dp" + android:viewportWidth="96" + android:viewportHeight="80"> + <group> + <clip-path + android:pathData="M14,15C14,12.7909 15.7909,11 18,11H346C348.209,11 350,12.7909 350,15V322C350,324.209 348.209,326 346,326H18C15.7909,326 14,324.209 14,322V15Z" + android:fillType="evenOdd"/> + </group> + <path + android:pathData="m55.3966,16.0397c0,-0.873 -1.013,-1.582 -2.26,-1.582 -1.247,0 -2.26,0.709 -2.26,1.582 0,0.874 1.013,1.583 2.26,1.583 1.247,0 2.26,-0.709 2.26,-1.583zM40.2356,19.2917c0.506,-0.068 0.985,0.045 1.315,0.355 0.663,0.618 0.482,1.786 -0.401,2.609 -0.884,0.825 -2.134,0.993 -2.794,0.375 -0.662,-0.616 -0.482,-1.784 0.401,-2.609 0.442,-0.412 0.973,-0.662 1.479,-0.73zM55.3966,22.8997c0,-1.165 -1.013,-2.111 -2.26,-2.111 -1.247,0 -2.26,0.946 -2.26,2.111 0,1.165 1.013,2.11 2.26,2.11 1.247,0 2.26,-0.945 2.26,-2.11zM67.5176,20.0217c-0.441,-0.413 -0.973,-0.662 -1.479,-0.73 -0.506,-0.067 -0.984,0.045 -1.315,0.355 -0.662,0.618 -0.482,1.786 0.402,2.609 0.881,0.825 2.131,0.993 2.794,0.375 0.662,-0.616 0.481,-1.784 -0.402,-2.609zM46.7466,24.4977c-0.441,-0.413 -1.019,-0.618 -1.598,-0.618 -0.578,0 -1.157,0.207 -1.598,0.618 -0.883,0.823 -0.881,2.159 0,2.984 0.882,0.825 2.312,0.825 3.196,0 0.881,-0.825 0.881,-2.159 0,-2.984zM61.1256,23.8797c0.578,0 1.156,0.206 1.598,0.618 0.884,0.825 0.884,2.161 0,2.984 -0.884,0.825 -2.314,0.825 -3.196,0 -0.881,-0.823 -0.883,-2.161 0,-2.984 0.441,-0.412 1.02,-0.618 1.598,-0.618zM36.1876,33.4497c0,-1.165 -0.759,-2.11 -1.695,-2.11 -0.935,0 -1.694,0.945 -1.694,2.11 0,1.165 0.759,2.111 1.694,2.111 0.936,0 1.695,-0.946 1.695,-2.111zM41.8376,31.3417c1.248,0 2.26,0.945 2.26,2.11 0,1.165 -1.012,2.111 -2.26,2.111 -1.247,0 -2.26,-0.946 -2.26,-2.111 0,-1.165 1.013,-2.11 2.26,-2.11zM55.3966,33.4517c0,-1.165 -1.012,-2.11 -2.26,-2.11 -1.247,0 -2.259,0.945 -2.259,2.11 0,1.165 1.012,2.111 2.259,2.111 1.248,0 2.26,-0.946 2.26,-2.111zM64.4356,31.3417c1.248,0 2.26,0.945 2.26,2.11 0,1.165 -1.012,2.111 -2.26,2.111 -1.247,0 -2.26,-0.946 -2.26,-2.111 0,-1.165 1.013,-2.11 2.26,-2.11zM73.4756,33.4517c0,-1.165 -0.759,-2.11 -1.695,-2.11 -0.935,0 -1.694,0.945 -1.694,2.11 0,1.165 0.759,2.111 1.694,2.111 0.936,0 1.695,-0.946 1.695,-2.111zM45.1476,38.7997c0.579,0 1.156,0.207 1.598,0.618 0.884,0.825 0.884,2.161 0,2.985 -0.883,0.825 -2.314,0.825 -3.195,0 -0.882,-0.824 -0.884,-2.162 0,-2.985 0.44,-0.411 1.019,-0.618 1.597,-0.618zM62.7246,39.4177c-0.441,-0.412 -1.02,-0.618 -1.598,-0.618 -0.579,0 -1.157,0.207 -1.598,0.618 -0.884,0.823 -0.884,2.159 0,2.985 0.881,0.825 2.312,0.825 3.196,0 0.881,-0.826 0.881,-2.162 0,-2.985zM53.1366,41.8917c1.248,0 2.26,0.945 2.26,2.11 0,1.165 -1.012,2.111 -2.26,2.111 -1.247,0 -2.259,-0.946 -2.259,-2.111 0,-1.165 1.012,-2.11 2.259,-2.11zM41.1486,44.6467c-0.44,-0.413 -0.972,-0.662 -1.478,-0.73 -0.506,-0.067 -0.984,0.045 -1.315,0.355 -0.663,0.616 -0.48,1.784 0.401,2.609 0.882,0.825 2.132,0.993 2.794,0.375 0.662,-0.616 0.482,-1.784 -0.402,-2.609zM66.6026,43.9167c0.506,-0.067 0.985,0.045 1.316,0.355 0.662,0.618 0.482,1.786 -0.402,2.609 -0.883,0.825 -2.134,0.993 -2.794,0.375 -0.662,-0.619 -0.482,-1.786 0.402,-2.609 0.441,-0.413 0.973,-0.662 1.478,-0.73zM55.3966,50.8617c0,-0.874 -1.012,-1.583 -2.26,-1.583 -1.247,0 -2.259,0.709 -2.259,1.583 0,0.873 1.012,1.583 2.259,1.583 1.248,0 2.26,-0.71 2.26,-1.583z" + android:fillColor="#83d2f2" + android:fillAlpha="0.5" + android:fillType="evenOdd"/> + <path + android:pathData="M50.4455,4.9911A1.9904,2.0095 49.0092,0 0,50.1592 4.9959C49.2723,5.0764 48.3874,5.1935 47.5084,5.3492A1.9904,2.0095 49.0092,0 0,45.8659 7.6669A1.9904,2.0095 49.0092,0 0,48.1713 9.2854C48.9369,9.1498 49.7087,9.0469 50.484,8.9765A1.9904,2.0095 49.0092,0 0,52.3153 6.8042A1.9904,2.0095 49.0092,0 0,50.4455 4.9911zM65.0893,7.2665A1.9904,2.0095 49.0092,0 0,63.1476 8.4804A1.9904,2.0095 49.0092,0 0,64.1812 11.102C64.8912,11.4043 65.5902,11.7396 66.2743,12.1038A1.9904,2.0095 49.0092,0 0,68.9882 11.275A1.9904,2.0095 49.0092,0 0,68.1838 8.5724C67.4021,8.1562 66.5995,7.7718 65.7806,7.4232A1.9904,2.0095 49.0092,0 0,65.0893 7.2665zM34.4084,11.5162A1.9904,2.0095 49.0092,0 0,33.0344 11.9745C32.3395,12.5458 31.6721,13.1474 31.0328,13.7795A1.9904,2.0095 49.0092,0 0,31.0051 16.6078A1.9904,2.0095 49.0092,0 0,33.8351 16.6086C34.3865,16.0634 34.9632,15.542 35.5617,15.0499A1.9904,2.0095 49.0092,0 0,35.8507 12.2367A1.9904,2.0095 49.0092,0 0,34.4084 11.5162zM78.1376,18.4506A1.9904,2.0095 49.0092,0 0,76.9489 18.737A1.9904,2.0095 49.0092,0 0,76.2574 21.4848C76.6535,22.1434 77.0176,22.8183 77.3457,23.5072A1.9904,2.0095 49.0092,0 0,80.0105 24.4327A1.9904,2.0095 49.0092,0 0,80.9644 21.7628C80.5789,20.9532 80.1527,20.1667 79.6938,19.4036A1.9904,2.0095 49.0092,0 0,78.1376 18.4506zM25.416,26.1755A1.9904,2.0095 49.0092,0 0,23.2719 27.7637C23.081,28.6457 22.9341,29.5351 22.8333,30.4302A1.9904,2.0095 49.0092,0 0,24.5982 32.6239A1.9904,2.0095 49.0092,0 0,26.8117 30.8407C26.8974,30.0791 27.0211,29.322 27.1832,28.573A1.9904,2.0095 49.0092,0 0,25.6503 26.2104A1.9904,2.0095 49.0092,0 0,25.416 26.1755zM81.692,33.3108A1.9904,2.0095 49.0092,0 0,79.545 35.1747C79.4872,35.9424 79.3938,36.704 79.2606,37.4559A1.9904,2.0095 49.0092,0 0,80.8822 39.7577A1.9904,2.0095 49.0092,0 0,83.2025 38.1165C83.3603,37.2258 83.469,36.3316 83.5363,35.4373A1.9904,2.0095 49.0092,0 0,81.692 33.3108zM27.7088,43.1317A1.9904,2.0095 49.0092,0 0,26.6262 43.3605A1.9904,2.0095 49.0092,0 0,25.7737 46.0625C26.1887,46.8559 26.6415,47.6264 27.1284,48.3724A1.9904,2.0095 49.0092,0 0,29.8964 48.9387A1.9904,2.0095 49.0092,0 0,30.4877 46.1687C30.0678,45.5255 29.6781,44.8635 29.3239,44.1864A1.9904,2.0095 49.0092,0 0,27.7088 43.1317zM74.6091,49.0167A1.9904,2.0095 49.0092,0 0,73.0652 49.6517C72.5332,50.2161 71.9757,50.7552 71.3951,51.267A1.9904,2.0095 49.0092,0 0,71.2054 54.0886A1.9904,2.0095 49.0092,0 0,74.029 54.2534C74.7046,53.6579 75.3508,53.0317 75.9673,52.3778A1.9904,2.0095 49.0092,0 0,75.8949 49.5527A1.9904,2.0095 49.0092,0 0,74.6091 49.0167zM39.9986,55.0042A1.9904,2.0095 49.0092,0 0,38.1111 56.1218A1.9904,2.0095 49.0092,0 0,39.0036 58.7968C39.8005,59.1884 40.6129,59.5446 41.4403,59.866A1.9904,2.0095 49.0092,0 0,44.0405 58.7245A1.9904,2.0095 49.0092,0 0,42.9219 56.1384C42.2,55.8579 41.492,55.548 40.7981,55.2071A1.9904,2.0095 49.0092,0 0,39.9986 55.0042zM59.5115,57.4057A1.9904,2.0095 49.0092,0 0,58.9875 57.4459C58.2263,57.6058 57.4591,57.7319 56.6851,57.8279A1.9904,2.0095 49.0092,0 0,54.9238 60.0595A1.9904,2.0095 49.0092,0 0,57.1401 61.7955C58.0229,61.686 58.9039,61.5407 59.7777,61.3571A1.9904,2.0095 49.0092,0 0,61.3455 58.9895A1.9904,2.0095 49.0092,0 0,59.5115 57.4057z" + android:strokeLineJoin="round" + android:fillColor="#83d2f2" + android:strokeColor="#00000000" + android:fillType="nonZero" + android:fillAlpha="0.5" + android:strokeLineCap="round"/> + <path + android:pathData="m27.1986,23.9497 l-22,9.818v14.727c0,13.623 9.387,26.362 22,29.455 12.613,-3.093 22,-15.832 22,-29.455v-14.727z" + android:fillColor="#007fad"/> + <path + android:pathData="m16.4886,49.7407 l-3.29,3.443 9.333,9.766 18.667,-19.533 -3.29,-3.467 -15.377,16.09z" + android:fillColor="#ffffff"/> +</vector> diff --git a/Corona-Warn-App/src/main/res/layout/home_vaccination_registration_card.xml b/Corona-Warn-App/src/main/res/layout/home_vaccination_registration_card.xml new file mode 100644 index 000000000..d2ac24a8c --- /dev/null +++ b/Corona-Warn-App/src/main/res/layout/home_vaccination_registration_card.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"> + + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + tools:showIn="@layout/home_card_container_layout"> + + <TextView + android:id="@+id/title" + style="@style/headline5" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/card_padding" + android:layout_marginTop="@dimen/card_padding" + android:layout_marginEnd="@dimen/spacing_small" + android:accessibilityHeading="true" + android:focusable="false" + android:text="@string/vaccination_card_registration_title" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <TextView + android:id="@+id/body" + style="@style/subtitleMedium" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/card_padding" + android:layout_marginTop="@dimen/spacing_normal" + android:layout_marginEnd="@dimen/spacing_small" + android:focusable="false" + android:text="@string/vaccination_card_registration_body" + app:layout_constraintEnd_toStartOf="@id/icon" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/title" /> + + <androidx.appcompat.widget.AppCompatImageView + android:id="@+id/icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="@dimen/spacing_small" + android:importantForAccessibility="no" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="@id/body" + app:srcCompat="@drawable/ic_card_impfzertifikat_registrieren" /> + + <androidx.constraintlayout.widget.Barrier + android:id="@+id/button_barrier" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + app:barrierDirection="bottom" + app:constraint_referenced_ids="icon,body" /> + + <Button + android:id="@+id/next_steps_action" + style="@style/buttonPrimary" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/card_padding" + android:layout_marginTop="@dimen/spacing_small" + android:layout_marginEnd="@dimen/card_padding" + android:layout_marginBottom="@dimen/card_padding" + android:text="@string/vaccination_card_register" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/button_barrier" /> + </androidx.constraintlayout.widget.ConstraintLayout> +</layout> \ No newline at end of file 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 5a269d05f..da4ee40f7 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -2000,6 +2000,13 @@ <!-- XBUT: Trace location check-ins invalid qr code dialog negative button --> <string name="trace_location_attendee_invalid_qr_code_dialog_negative_button">Abbrechen</string> + <!-- XHED: Title for Vaccination Certificate Registration Home Card --> + <string name="vaccination_card_registration_title">"Impfzertifikat registrieren"</string> + <!-- YTXT: Body text for Vaccination Certificate Registration Home Card --> + <string name="vaccination_card_registration_body">"Scannen Sie den QR-Code auf Ihrem Impfzertifikat, um Ihre Impfung zu registrieren und einen digitalen Impfnachweis zu erhalten."</string> + <!-- XBUT: button for Vaccination Certificate Registration Home Card --> + <string name="vaccination_card_register">"Registrieren"</string> + <!-- #################################### Incompatibility warning card ###################################### --> diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index 136d57769..3c90cee6d 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -2015,4 +2015,11 @@ <string name="trace_location_attendee_invalid_qr_code_dialog_positive_button">"OK"</string> <!-- XBUT: Trace location check-ins invalid qr code dialog negative button --> <string name="trace_location_attendee_invalid_qr_code_dialog_negative_button">"Cancel"</string> + + <!-- XHED: Title for Vaccination Certificate Registration Home Card --> + <string name="vaccination_card_registration_title">"Impfzertifikat registrieren"</string> + <!-- YTXT: Body text for Vaccination Certificate Registration Home Card --> + <string name="vaccination_card_registration_body">"Scannen Sie den QR-Code auf Ihrem Impfzertifikat, um Ihre Impfung zu registrieren und einen digitalen Impfnachweis zu erhalten."</string> + <!-- XBUT: button for Vaccination Certificate Registration Home Card --> + <string name="vaccination_card_register">"Registrieren"</string> </resources> -- GitLab