diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultConsentGivenFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultConsentGivenFragmentTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..efa8c183172a97117b9699750c27a696c82feea0 --- /dev/null +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultConsentGivenFragmentTest.kt @@ -0,0 +1,69 @@ +package de.rki.coronawarnapp.ui.submission + +import androidx.fragment.app.testing.launchFragment +import androidx.fragment.app.testing.launchFragmentInContainer +import androidx.navigation.NavController +import androidx.navigation.Navigation +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.action.ViewActions +import androidx.test.espresso.matcher.ViewMatchers +import androidx.test.ext.junit.runners.AndroidJUnit4 +import dagger.Module +import dagger.android.ContributesAndroidInjector +import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.ui.submission.testresult.SubmissionTestResultConsentGivenFragment +import de.rki.coronawarnapp.ui.submission.testresult.SubmissionTestResultConsentGivenViewModel +import io.mockk.MockKAnnotations +import io.mockk.impl.annotations.MockK +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mockito.mock +import org.mockito.Mockito.verify +import testhelpers.BaseUITest + +@RunWith(AndroidJUnit4::class) +class SubmissionTestResultConsentGivenFragmentTest : BaseUITest() { + + @MockK lateinit var viewModel: SubmissionTestResultConsentGivenViewModel + + @Before + fun setup() { + MockKAnnotations.init(this, relaxed = true) + setupMockViewModel(object : SubmissionTestResultConsentGivenViewModel.Factory { + override fun create(): SubmissionTestResultConsentGivenViewModel = viewModel + }) + } + + @After + fun teardown() { + clearAllViewModels() + } + + @Test + fun launch_fragment() { + launchFragment<SubmissionTestResultConsentGivenFragment>() + } + + @Test + fun testEventConsentGivenContinueWithSymptomsClicked() { + + val mockNavController = mock(NavController::class.java) + val scenario = launchFragmentInContainer<SubmissionTestResultConsentGivenFragment>() + + scenario.onFragment { fragment -> + Navigation.setViewNavController(fragment.requireView(), mockNavController) + } + // Verify that performing a click prompts the correct Navigation action + onView(ViewMatchers.withId(R.id.submission_test_result_button_consent_given_continue)).perform(ViewActions.click()) + verify(mockNavController).navigate(R.id.action_submissionTestResultConsentGivenFragment_to_submissionSymptomIntroductionFragment) + } + +} + +@Module +abstract class SubmissionTestResultConsentGivenTestModule { + @ContributesAndroidInjector + abstract fun submissionTestResultScreen(): SubmissionTestResultConsentGivenViewModel +} diff --git a/Corona-Warn-App/src/androidTest/java/testhelpers/FragmentTestModuleRegistrar.kt b/Corona-Warn-App/src/androidTest/java/testhelpers/FragmentTestModuleRegistrar.kt index e50180f6ccf93867a659830bf1b655a25e592831..0fce202eef347669311b3d540ae1949728ed57f8 100644 --- a/Corona-Warn-App/src/androidTest/java/testhelpers/FragmentTestModuleRegistrar.kt +++ b/Corona-Warn-App/src/androidTest/java/testhelpers/FragmentTestModuleRegistrar.kt @@ -13,12 +13,13 @@ import de.rki.coronawarnapp.ui.submission.SubmissionDispatcherTestModule import de.rki.coronawarnapp.ui.submission.SubmissionDoneTestModule import de.rki.coronawarnapp.ui.submission.SubmissionIntroTestModule import de.rki.coronawarnapp.ui.submission.SubmissionOtherWarningTestModule -import de.rki.coronawarnapp.ui.submission.SubmissionQRInfoFragmentModule import de.rki.coronawarnapp.ui.submission.SubmissionQRScanFragmentModule import de.rki.coronawarnapp.ui.submission.SubmissionSymptomCalendarFragmentTestModule import de.rki.coronawarnapp.ui.submission.SubmissionSymptomIntroFragmentTestModule import de.rki.coronawarnapp.ui.submission.SubmissionTanTestModule +import de.rki.coronawarnapp.ui.submission.SubmissionTestResultConsentGivenTestModule import de.rki.coronawarnapp.ui.submission.SubmissionTestResultTestModule +import de.rki.coronawarnapp.ui.submission.testresult.SubmissionTestResultConsentGivenModule @Module( includes = [ @@ -35,13 +36,13 @@ import de.rki.coronawarnapp.ui.submission.SubmissionTestResultTestModule SubmissionDispatcherTestModule::class, SubmissionTanTestModule::class, SubmissionTestResultTestModule::class, + SubmissionTestResultConsentGivenTestModule::class, SubmissionOtherWarningTestModule::class, SubmissionSymptomIntroFragmentTestModule::class, SubmissionSymptomCalendarFragmentTestModule::class, SubmissionContactTestModule::class, SubmissionDoneTestModule::class, - SubmissionQRInfoFragmentModule::class, - SubmissionQRScanFragmentModule::class + SubmissionQRScanFragmentModule::class, ] ) class FragmentTestModuleRegistrar diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultConsentGivenFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultConsentGivenFragment.kt new file mode 100644 index 0000000000000000000000000000000000000000..340274ecb9399bb6b7c95d5672dd184d7a42cbff --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultConsentGivenFragment.kt @@ -0,0 +1,133 @@ +package de.rki.coronawarnapp.ui.submission.testresult + +import android.app.AlertDialog +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.FragmentSubmissionTestResultConsentGivenBinding +import de.rki.coronawarnapp.exception.http.CwaClientError +import de.rki.coronawarnapp.exception.http.CwaServerError +import de.rki.coronawarnapp.exception.http.CwaWebException +import de.rki.coronawarnapp.ui.submission.viewmodel.SubmissionNavigationEvents +import de.rki.coronawarnapp.util.DialogHelper +import de.rki.coronawarnapp.util.NetworkRequestWrapper.Companion.withFailure +import de.rki.coronawarnapp.util.di.AutoInject +import de.rki.coronawarnapp.util.ui.doNavigate +import de.rki.coronawarnapp.util.ui.observe2 +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 SubmissionTestResultConsentGivenFragment : Fragment(R.layout.fragment_submission_test_result_consent_given), + AutoInject { + + @Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory + private val viewModel: SubmissionTestResultConsentGivenViewModel by cwaViewModels { viewModelFactory } + + private val binding: FragmentSubmissionTestResultConsentGivenBinding by viewBindingLazy() + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + viewModel.uiState.observe2(this) { + binding.uiState = it + with(binding) { + submissionTestResultSection + .setTestResultSection(uiState?.deviceUiState, uiState?.testResultReceivedDate) + } + it.deviceUiState.withFailure { + if (it is CwaWebException) { + DialogHelper.showDialog(buildErrorDialog(it)) + } + } + } + + setButtonOnClickListener() + + viewModel.showCancelDialog.observe2(this) { + showCancelDialog() + } + + viewModel.routeToScreen.observe2(this) { + when (it) { + is SubmissionNavigationEvents.NavigateToSymptomIntroduction -> + doNavigate( + SubmissionTestResultConsentGivenFragmentDirections + .actionSubmissionTestResultConsentGivenFragmentToSubmissionSymptomIntroductionFragment() + ) + is SubmissionNavigationEvents.NavigateToMainActivity -> + doNavigate( + SubmissionTestResultConsentGivenFragmentDirections + .actionSubmissionTestResultConsentGivenFragmentToHomeFragment() + ) + } + } + } + + private fun navigateToMainScreen() = + doNavigate( + SubmissionTestResultConsentGivenFragmentDirections + .actionSubmissionTestResultConsentGivenFragmentToHomeFragment() + ) + + private fun buildErrorDialog(exception: CwaWebException): DialogHelper.DialogInstance { + return when (exception) { + is CwaClientError, is CwaServerError -> DialogHelper.DialogInstance( + requireActivity(), + R.string.submission_error_dialog_web_generic_error_title, + getString( + R.string.submission_error_dialog_web_generic_network_error_body, + exception.statusCode + ), + R.string.submission_error_dialog_web_generic_error_button_positive, + null, + true, + ::navigateToMainScreen + ) + else -> DialogHelper.DialogInstance( + requireActivity(), + R.string.submission_error_dialog_web_generic_error_title, + R.string.submission_error_dialog_web_generic_error_body, + R.string.submission_error_dialog_web_generic_error_button_positive, + null, + true, + ::navigateToMainScreen + ) + } + } + + override fun onResume() { + super.onResume() + binding.submissionTestResultContainer.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) + } + + private fun setButtonOnClickListener() { + binding.submissionTestResultButtonConsentGivenContinue.setOnClickListener { + viewModel.onContinuePressed() + } + + binding.submissionTestResultButtonConsentGivenContinueWithoutSymptoms.setOnClickListener { + viewModel.onShowCancelDialog() + } + + binding.submissionTestResultConsentGivenHeader.headerButtonBack.buttonIcon.setOnClickListener { + viewModel.onShowCancelDialog() + } + } + + private fun showCancelDialog() { + AlertDialog.Builder(requireContext()).apply { + setTitle(R.string.submission_error_dialog_confirm_cancellation_title) + setMessage(R.string.submission_error_dialog_confirm_cancellation_body) + setPositiveButton(R.string.submission_error_dialog_confirm_cancellation_button_positive) { _, _ -> + viewModel.cancelTestSubmission() + } + setNegativeButton(R.string.submission_error_dialog_confirm_cancellation_button_negative) { _, _ -> + // NOOP + } + }.show() + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultConsentGivenModule.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultConsentGivenModule.kt new file mode 100644 index 0000000000000000000000000000000000000000..da01d964c0ea6c9a1e6b852d164c2e8dcb851ed5 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultConsentGivenModule.kt @@ -0,0 +1,18 @@ +package de.rki.coronawarnapp.ui.submission.testresult + +import dagger.Binds +import dagger.Module +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 SubmissionTestResultConsentGivenModule { + @Binds + @IntoMap + @CWAViewModelKey(SubmissionTestResultConsentGivenViewModel::class) + abstract fun submissionTestResultConsentGivenFragment( + factory: SubmissionTestResultConsentGivenViewModel.Factory + ): CWAViewModelFactory<out CWAViewModel> +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultConsentGivenViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultConsentGivenViewModel.kt new file mode 100644 index 0000000000000000000000000000000000000000..17013ae991af3588be656b4018911dd43a58285e --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultConsentGivenViewModel.kt @@ -0,0 +1,69 @@ +package de.rki.coronawarnapp.ui.submission.testresult + +import androidx.lifecycle.LiveData +import androidx.lifecycle.asLiveData +import com.squareup.inject.assisted.AssistedInject +import de.rki.coronawarnapp.storage.SubmissionRepository +import de.rki.coronawarnapp.ui.submission.viewmodel.SubmissionNavigationEvents +import de.rki.coronawarnapp.util.DeviceUIState +import de.rki.coronawarnapp.util.NetworkRequestWrapper.Companion.withSuccess +import de.rki.coronawarnapp.util.ui.SingleLiveEvent +import de.rki.coronawarnapp.util.viewmodel.CWAViewModel +import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.combineTransform +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import timber.log.Timber + +class SubmissionTestResultConsentGivenViewModel @AssistedInject constructor( + private val submissionRepository: SubmissionRepository +) : CWAViewModel() { + + private val showRedeemedTokenWarning = SingleLiveEvent<Unit>() + private var wasRedeemedTokenErrorShown = false + private val tokenErrorMutex = Mutex() + + val uiState: LiveData<TestResultUIState> = combineTransform( + submissionRepository.deviceUIStateFlow, + submissionRepository.testResultReceivedDateFlow + ) { deviceUiState, resultDate -> + + tokenErrorMutex.withLock { + if (!wasRedeemedTokenErrorShown) { + deviceUiState.withSuccess { + if (it == DeviceUIState.PAIRED_REDEEMED) { + wasRedeemedTokenErrorShown = true + showRedeemedTokenWarning.postValue(Unit) + } + } + } + } + + TestResultUIState( + deviceUiState = deviceUiState, + testResultReceivedDate = resultDate + ).let { emit(it) } + }.asLiveData(context = Dispatchers.Default) + + val routeToScreen: SingleLiveEvent<SubmissionNavigationEvents> = SingleLiveEvent() + + val showCancelDialog = SingleLiveEvent<Unit>() + + fun onContinuePressed() { + Timber.d("Beginning symptom flow") + routeToScreen.postValue(SubmissionNavigationEvents.NavigateToSymptomIntroduction) + } + + fun onShowCancelDialog() { + showCancelDialog.postValue(Unit) + } + + fun cancelTestSubmission() { + Timber.d("Submission was cancelled.") + routeToScreen.postValue(SubmissionNavigationEvents.NavigateToMainActivity) + } + + @AssistedInject.Factory + interface Factory : SimpleCWAViewModelFactory<SubmissionTestResultConsentGivenViewModel> +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultFragment.kt index 7f84c13b03b80093910b1d6bf50a9364696aa39a..7aa2716938965569330dd8f33f38e051a01cae1e 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultFragment.kt @@ -76,6 +76,10 @@ class SubmissionTestResultFragment : Fragment(R.layout.fragment_submission_test_ viewModel.uiState.observe2(this) { binding.uiState = it + with(binding) { + submissionTestResultContent.submissionTestResultSection + .setTestResultSection(uiState?.deviceUiState, uiState?.testResultReceivedDate) + } it.deviceUiState.withFailure { if (it is CwaWebException) { DialogHelper.showDialog(buildErrorDialog(it)) @@ -147,7 +151,7 @@ class SubmissionTestResultFragment : Fragment(R.layout.fragment_submission_test_ private fun setButtonOnClickListener() { binding.submissionTestResultButtonPendingRefresh.setOnClickListener { viewModel.refreshDeviceUIState() - binding.submissionTestResultContent.submissionTestResultCard.testResultCard + binding.submissionTestResultContent.submissionTestResultSection .sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/viewmodel/SubmissionFragmentModule.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/viewmodel/SubmissionFragmentModule.kt index 667755dd48337165a64ecef61d7b6bcc668b5e56..7473b283054fc66bfa14faba6180813f95d4d946 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/viewmodel/SubmissionFragmentModule.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/viewmodel/SubmissionFragmentModule.kt @@ -16,6 +16,8 @@ import de.rki.coronawarnapp.ui.submission.symptoms.introduction.SubmissionSympto import de.rki.coronawarnapp.ui.submission.symptoms.introduction.SubmissionSymptomIntroductionModule import de.rki.coronawarnapp.ui.submission.tan.SubmissionTanFragment import de.rki.coronawarnapp.ui.submission.tan.SubmissionTanModule +import de.rki.coronawarnapp.ui.submission.testresult.SubmissionTestResultConsentGivenFragment +import de.rki.coronawarnapp.ui.submission.testresult.SubmissionTestResultConsentGivenModule import de.rki.coronawarnapp.ui.submission.testresult.SubmissionTestResultFragment import de.rki.coronawarnapp.ui.submission.testresult.SubmissionTestResultModule import de.rki.coronawarnapp.ui.submission.warnothers.SubmissionResultPositiveOtherWarningFragment @@ -62,4 +64,7 @@ internal abstract class SubmissionFragmentModule { @ContributesAndroidInjector(modules = [SubmissionConsentModule::class]) abstract fun submissionConsentScreen(): SubmissionConsentFragment + + @ContributesAndroidInjector(modules = [SubmissionTestResultConsentGivenModule::class]) + abstract fun submissionTestResultConsentGivenScreen(): SubmissionTestResultConsentGivenFragment } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TestResultSectionView.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TestResultSectionView.kt new file mode 100644 index 0000000000000000000000000000000000000000..0a84f8e0bd59961c871258307db6645fbc1e50aa --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/view/TestResultSectionView.kt @@ -0,0 +1,89 @@ +package de.rki.coronawarnapp.ui.view + +import android.content.Context +import android.graphics.drawable.Drawable +import android.text.Spannable +import android.text.SpannableString +import android.util.AttributeSet +import androidx.appcompat.content.res.AppCompatResources.getDrawable +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.withStyledAttributes +import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.util.DeviceUIState +import de.rki.coronawarnapp.util.NetworkRequestWrapper +import de.rki.coronawarnapp.util.NetworkRequestWrapper.Companion.withSuccess +import de.rki.coronawarnapp.util.TimeAndDateExtensions.toUIFormat +import de.rki.coronawarnapp.util.formatter.formatTestResult +import kotlinx.android.synthetic.main.view_test_result_section.view.* +import java.util.Date + +/** + * The [TestResultSectionView] Displays the appropriate test result. + */ +class TestResultSectionView @JvmOverloads +constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr) { + + init { + inflate(context, R.layout.view_test_result_section, this) + context.withStyledAttributes(attrs, R.styleable.TestResultSection) { + test_result_section_headline.text = + getText(R.styleable.TestResultSection_test_result_section_headline) + test_result_section_content.text = + getText(R.styleable.TestResultSection_test_result_section_content) + test_result_section_registered_at_text.text = + getText(R.styleable.TestResultSection_test_result_section_registered_at_text) + val resultIconId = getResourceId(R.styleable.TestResultSection_test_result_section_status_icon, 0) + if (resultIconId != 0) { + val drawable = getDrawable(context, resultIconId) + test_result_section_status_icon.setImageDrawable(drawable) + } + } + } + + fun setTestResultSection(uiState: NetworkRequestWrapper<DeviceUIState, Throwable>?, registeredAt: Date?) { + test_result_section_registered_at_text.text = formatTestResultRegisteredAtText(registeredAt) + val testResultIcon = formatTestStatusIcon(uiState) + test_result_section_status_icon.setImageDrawable(testResultIcon) + test_result_section_content.text = formatTestResultSectionContent(uiState) + } + + private fun formatTestStatusIcon(uiState: NetworkRequestWrapper<DeviceUIState, Throwable>?): Drawable? { + return uiState.withSuccess(R.drawable.ic_test_result_illustration_invalid) { + when (it) { + DeviceUIState.PAIRED_NO_RESULT -> R.drawable.ic_test_result_illustration_pending + DeviceUIState.PAIRED_POSITIVE_TELETAN, + DeviceUIState.PAIRED_POSITIVE -> R.drawable.ic_test_result_illustration_positive + DeviceUIState.PAIRED_NEGATIVE -> R.drawable.ic_test_result_illustration_negative + DeviceUIState.PAIRED_ERROR, + DeviceUIState.PAIRED_REDEEMED -> R.drawable.ic_test_result_illustration_invalid + else -> R.drawable.ic_test_result_illustration_invalid + } + }.let { context.getDrawable(it) } + } + + private fun formatTestResultRegisteredAtText(registeredAt: Date?): String { + return context.getString(R.string.test_result_card_registered_at_text) + .format(registeredAt?.toUIFormat(context)) + } + + private fun formatTestResultSectionContent(uiState: NetworkRequestWrapper<DeviceUIState, Throwable>?): Spannable { + return uiState.withSuccess(SpannableString("")) { + when (it) { + DeviceUIState.PAIRED_NO_RESULT -> + SpannableString(context.getString(R.string.test_result_card_status_pending)) + DeviceUIState.PAIRED_ERROR, + DeviceUIState.PAIRED_REDEEMED -> + SpannableString(context.getString(R.string.test_result_card_status_invalid)) + + DeviceUIState.PAIRED_POSITIVE, + DeviceUIState.PAIRED_POSITIVE_TELETAN, + DeviceUIState.PAIRED_NEGATIVE -> formatTestResult(uiState) + else -> SpannableString("") + } + } + } +} diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_consent_given.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_consent_given.xml new file mode 100644 index 0000000000000000000000000000000000000000..1ef59dcf819b7e3fe1a26d4f6287281cea6ddf40 --- /dev/null +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_test_result_consent_given.xml @@ -0,0 +1,130 @@ +<?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"> + + <data> + + <import type="de.rki.coronawarnapp.util.formatter.FormatterSubmissionHelper" /> + + <variable + name="uiState" + type="de.rki.coronawarnapp.ui.submission.testresult.TestResultUIState" /> + </data> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/submission_test_result_container" + android:contentDescription="@string/submission_test_result_headline" + android:accessibilityLiveRegion="assertive" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <include + android:id="@+id/submission_test_result_consent_given_header" + layout="@layout/include_header" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + app:icon="@{@drawable/ic_close}" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:title="@{@string/submission_test_result_consent_given_heading}" /> + + <ScrollView + android:layout_width="@dimen/match_constraint" + android:layout_height="@dimen/match_constraint" + app:layout_constraintEnd_toEndOf="@+id/guideline_end" + app:layout_constraintStart_toStartOf="@+id/guideline_start" + android:fillViewport="true" + app:layout_constraintTop_toBottomOf="@+id/submission_test_result_consent_given_header" + app:layout_constraintBottom_toTopOf="@+id/include_submission_test_result_consent_given_buttons" + app:layout_constraintVertical_bias="1.0"> + + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:focusable="true"> + + <de.rki.coronawarnapp.ui.view.TestResultSectionView + android:id="@+id/submission_test_result_section" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_small" + android:focusable="true" + android:importantForAccessibility="yes" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <TextView + android:id="@+id/submission_test_result_consent_given_subtitle" + style="@style/headline6" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_medium" + android:accessibilityHeading="true" + android:text="@string/submission_test_result_consent_given_subtitle" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/submission_test_result_section" /> + + <TextView + android:id="@+id/submission_test_result_consent_given_body" + style="@style/body1" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_medium" + android:accessibilityHeading="true" + android:text="@string/submission_test_result_consent_given_body" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/submission_test_result_consent_given_subtitle" /> + </androidx.constraintlayout.widget.ConstraintLayout> + </ScrollView> + + <androidx.constraintlayout.widget.Barrier + android:id="@+id/include_submission_test_result_consent_given_buttons" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + app:barrierAllowsGoneWidgets="false" + app:barrierDirection="top" + app:constraint_referenced_ids="submission_test_result_button_consent_given_continue" /> + + <Button + android:id="@+id/submission_test_result_button_consent_given_continue" + style="@style/buttonPrimary" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:text="@string/submission_test_result_positive_continue_button_with_symptoms" + app:layout_constraintBottom_toTopOf="@+id/submission_test_result_button__consent_given_continue_without_symptoms" + app:layout_constraintEnd_toStartOf="@+id/guideline_end" + app:layout_constraintStart_toStartOf="@id/guideline_start" + app:layout_constraintTop_toBottomOf="@+id/guideline_action_large" /> + + <Button + android:id="@+id/submission_test_result_button_consent_given_continue_without_symptoms" + style="@style/buttonPrimary" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:text="@string/submission_test_result_consent_given_breakup_button" + 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_test_result_button_consent_given_continue" /> + + <include layout="@layout/merge_guidelines_side" /> + + <androidx.constraintlayout.widget.Guideline + android:id="@+id/guideline_action_large" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="horizontal" + app:layout_constraintGuide_end="@dimen/guideline_action_large" /> + + <androidx.constraintlayout.widget.Guideline + android:id="@+id/guideline_action" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="horizontal" + app:layout_constraintGuide_end="@dimen/guideline_action" /> + </androidx.constraintlayout.widget.ConstraintLayout> +</layout> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_consent_body.xml b/Corona-Warn-App/src/main/res/layout/include_submission_consent_body.xml index 2531e8dc114346c9b70f5a4645f29ad03b37f8e9..614f2551624d31249258d6721de3bd784e9e31e7 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_consent_body.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_consent_body.xml @@ -15,7 +15,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/submission_consent_your_consent_subsection_headline" - app:layout_constraintBottom_toBottomOf="@id/submission_consent_main_fourth_point" + app:layout_constraintBottom_toBottomOf="@id/submission_consent_your_consent_subsection_third_point" style="@style/cardGrey"/> <TextView @@ -101,6 +101,7 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/bullet_point_size" android:paddingStart="@dimen/spacing_normal" + android:paddingBottom="@dimen/spacing_normal" app:layout_constraintEnd_toEndOf="@id/guideline_end" app:layout_constraintStart_toStartOf="@id/guideline_start" app:layout_constraintTop_toBottomOf="@id/submission_consent_your_consent_subsection_second_point" diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_test_result.xml b/Corona-Warn-App/src/main/res/layout/include_submission_test_result.xml index a564e5c9632c893c096db4b4829bc72603ab5550..8089131c01cb6182307d3e144b576bedcfa8afd3 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_test_result.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_test_result.xml @@ -3,9 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> <data> - <import type="de.rki.coronawarnapp.util.formatter.FormatterSubmissionHelper" /> - <variable name="uiState" type="de.rki.coronawarnapp.ui.submission.testresult.TestResultUIState" /> @@ -20,19 +18,17 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - <include - android:id="@+id/submission_test_result_card" - layout="@layout/include_test_result_card" + <de.rki.coronawarnapp.ui.view.TestResultSectionView + android:id="@+id/submission_test_result_section" android:layout_width="@dimen/match_constraint" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_small" android:focusable="true" android:importantForAccessibility="yes" - app:deviceUIState="@{uiState.deviceUiState}" + app:test_result_section_headline="@string/test_result_card_headline" app:layout_constraintEnd_toEndOf="@+id/guideline_card_end" app:layout_constraintStart_toStartOf="@+id/guideline_card_start" - app:layout_constraintTop_toTopOf="parent" - app:registerDate="@{uiState.testResultReceivedDate}" /> + app:layout_constraintTop_toTopOf="parent"/> <TextView android:id="@+id/submission_test_result_subtitle" @@ -44,7 +40,7 @@ android:text="@string/submission_test_result_subtitle" app:layout_constraintEnd_toEndOf="@+id/guideline_end" app:layout_constraintStart_toStartOf="@+id/guideline_start" - app:layout_constraintTop_toBottomOf="@+id/submission_test_result_card" /> + app:layout_constraintTop_toBottomOf="@+id/submission_test_result_section" /> <include android:id="@+id/submission_test_result_pending_steps" diff --git a/Corona-Warn-App/src/main/res/layout/include_test_result_card.xml b/Corona-Warn-App/src/main/res/layout/include_test_result_card.xml index 01364c7898c6942746da48f840b496513e186caf..a55bff2725d226ff13def243c9238e5718276169 100644 --- a/Corona-Warn-App/src/main/res/layout/include_test_result_card.xml +++ b/Corona-Warn-App/src/main/res/layout/include_test_result_card.xml @@ -4,9 +4,7 @@ xmlns:tools="http://schemas.android.com/tools"> <data> - <import type="de.rki.coronawarnapp.util.formatter.FormatterSubmissionHelper" /> - <variable name="registerDate" type="java.util.Date" /> diff --git a/Corona-Warn-App/src/main/res/layout/view_test_result_section.xml b/Corona-Warn-App/src/main/res/layout/view_test_result_section.xml new file mode 100644 index 0000000000000000000000000000000000000000..946edfe5923246f02a31e235f5c7831296bd108c --- /dev/null +++ b/Corona-Warn-App/src/main/res/layout/view_test_result_section.xml @@ -0,0 +1,61 @@ +<?xml version="1.0" encoding="utf-8"?> +<merge xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/test_result_card" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/card_dark" + android:focusable="true" + android:padding="@dimen/card_padding"> + + <TextView + android:id="@+id/test_result_section_headline" + style="@style/body2" + android:accessibilityHeading="true" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginEnd="@dimen/spacing_small" + app:layout_constraintEnd_toStartOf="@id/test_result_section_status_icon" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:text="Ihr Befund"/> + + <TextView + android:id="@+id/test_result_section_content" + style="@style/headline5" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginEnd="@dimen/spacing_small" + android:layout_marginBottom="@dimen/spacing_normal" + app:layout_constraintBottom_toTopOf="@id/test_result_section_registered_at_text" + app:layout_constraintEnd_toStartOf="@id/test_result_section_status_icon" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/test_result_section_headline" + tools:text="SARS-CoV-2 Negativ" /> + + <ImageView + android:id="@+id/test_result_section_status_icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:importantForAccessibility="no" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:src="@drawable/ic_test_result_illustration_negative" /> + + <TextView + android:id="@+id/test_result_section_registered_at_text" + style="@style/body2" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_normal" + android:layout_marginEnd="@dimen/spacing_small" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toStartOf="@id/test_result_section_status_icon" + app:layout_constraintStart_toStartOf="parent" + tools:text="@string/test_result_card_registered_at_text" /> + + </androidx.constraintlayout.widget.ConstraintLayout> +</merge> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/navigation/nav_graph.xml b/Corona-Warn-App/src/main/res/navigation/nav_graph.xml index 6504b4320f74afcef0cf088db168861b14f5d35d..79905c44a608b0849ac5530887c3426bec918c0b 100644 --- a/Corona-Warn-App/src/main/res/navigation/nav_graph.xml +++ b/Corona-Warn-App/src/main/res/navigation/nav_graph.xml @@ -395,4 +395,16 @@ app:destination="@id/informationPrivacyFragment" /> </fragment> + <fragment + android:id="@+id/submissionTestResultConsentGivenFragment" + android:name="de.rki.coronawarnapp.ui.submission.testresult.SubmissionTestResultConsentGivenFragment" + android:label="SubmissionTestResultConsentFragment" > + <action + android:id="@+id/action_submissionTestResultConsentGivenFragment_to_homeFragment" + app:popUpTo="@id/mainFragment" + app:popUpToInclusive="false"/> + <action + android:id="@+id/action_submissionTestResultConsentGivenFragment_to_submissionSymptomIntroductionFragment" + app:destination="@id/submissionSymptomIntroductionFragment" /> + </fragment> </navigation> diff --git a/Corona-Warn-App/src/main/res/values-de/legal_strings.xml b/Corona-Warn-App/src/main/res/values-de/legal_strings.xml index 02e0a21c7223a9c03c7f3b85d90373e607159e40..35cc3a54d3bfbd95207e9d8eb479899cea23bbee 100644 --- a/Corona-Warn-App/src/main/res/values-de/legal_strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/legal_strings.xml @@ -22,14 +22,6 @@ <string name="submission_consent_your_consent_subsection_second_point">"<b>Wenn Sie positiv auf Corona getestet wurden, teilt die App Ihr Testergebnis, um Nutzer, denen Sie begegnet sind, zu warnen. Dies betrifft Nutzer von offiziellen Corona-Apps der oben genannten Länder. Wenn Sie zusätzlich Angaben zum Beginn Ihrer Symptome machen, werden auch diese geteilt.</b>"</string> <!-- YTXT: Body for consent sub section your consent subtext third point --> <string name="submission_consent_your_consent_subsection_third_point">"Sie können Ihr Einverständnis jederzeit zurücknehmen. Die Einstellung hierfür finden Sie unter „Test anzeigen“. Vor dem Teilen werden Sie nochmal auf Ihr Einverständnis hingewiesen und um Freigabe Ihres Testergebnisses gebeten."</string> - <!-- YTXT: Body for consent main section first point --> - <string name="submission_consent_main_first_point">"Ihr Einverständnis ist freiwillig."</string> - <!-- YTXT: Body for consent main section second point --> - <string name="submission_consent_main_second_point">"Sie können Ihr Testergebnis auch abrufen, wenn Sie dies nicht teilen. Wenn Sie ihr Testergebnis teilen, helfen Sie jedoch mit, Ihre Mitmenschen vor Ansteckungen zu schützen."</string> - <!-- YTXT: Body for consent main section third point --> - <string name="submission_consent_main_third_point">"Ihre Identität bleibt geheim. Andere Nutzer erfahren nicht, wer sein Testergebnis geteilt hat."</string> - <!-- YTXT: Body for consent main section fourth point --> - <string name="submission_consent_main_fourth_point">"Sie können Ihr Einverständnis abgeben, wenn Sie mindestens 16 Jahre alt sind."</string> <!-- YTXT: Body for your consent screen agreement share test results --> <string name="submission_your_consent_agreement_share_test_results">"<b>Wenn Sie positiv auf Corona getestet wurden, teilt die App Ihr Testergebnis, um Nutzer zu warnen, denen Sie begegnet sind.</b>\n\n<b>Die Warnung erreicht Nutzer von offiziellen Corona-Apps der folgenden teilnehmenden Länder:</b>"</string> <!-- YTXT: Body for your consent screen agreement share symptoms --> 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 3df815452531e193db77cd23fa939caceaec3e62..b9b156ba817e2a87ba22428f273226805a0d29b8 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -845,6 +845,14 @@ <string name="submission_consent_help_by_warning_others_body">"Wenn Sie positiv auf Corona getestet wurden, können Sie Ihre Mitmenschen über die App warnen. Die Warnung funktioniert in mehreren Ländern. Derzeit nehmen folgende Länder teil:"</string> <!-- YTXT: Page bottom text for consent screen --> <string name="submission_consent_main_bottom_body">"Ausführliche Informationen zur Datenverarbeitung und Ihrem Einverständnis"</string> + <!-- YTXT: Body for consent main section first point --> + <string name="submission_consent_main_first_point">"Ihr Einverständnis ist freiwillig."</string> + <!-- YTXT: Body for consent main section second point --> + <string name="submission_consent_main_second_point">"Sie können Ihr Testergebnis auch abrufen, wenn Sie dies nicht teilen. Wenn Sie ihr Testergebnis teilen, helfen Sie jedoch mit, Ihre Mitmenschen vor Ansteckungen zu schützen."</string> + <!-- YTXT: Body for consent main section third point --> + <string name="submission_consent_main_third_point">"Ihre Identität bleibt geheim. Andere Nutzer erfahren nicht, wer sein Testergebnis geteilt hat."</string> + <!-- YTXT: Body for consent main section fourth point --> + <string name="submission_consent_main_fourth_point">"Sie können Ihr Einverständnis abgeben, wenn Sie mindestens 16 Jahre alt sind."</string> <!-- Submission Test Result --> <!-- XHED: Page headline for test result --> @@ -903,6 +911,16 @@ <string name="submission_test_result_card_positive_title">"SARS-CoV-2 positiv"</string> <!-- YTXT: Body text for test result card positive --> <string name="submission_test_result_card_positive_body">"Das Virus SARS-CoV-2 wurde bei Ihnen nachgewiesen."</string> + <!-- XHED: Page headline for test result with consent given --> + <string name="submission_test_result_consent_given_heading">"Ihr Testergebnis"</string> + <!-- XHED: Subtitle text for test result card with consent given --> + <string name="submission_test_result_consent_given_subtitle">"Vielen Dank, dass Sie mithelfen, die Verbreitung von Corona zu bekämpfen."</string> + <!-- YTXT: body text for test result card with consent given --> + <string name="submission_test_result_consent_given_body">"<b>Ihre Mitmenschen werden jetzt gewarnt.</b> <br/><br/>Bitte helfen Sie nun, die Genauigkeit der Warnungen zu verbessern. Geben Sie hierfür im nächsten Schritt an, wann Sie erstmals Symptome hatten. Sie können diesen Schritt jederzeit abbrechen."</string> + <!-- XBUT: button text for the 'break up' button option on test result consent given page --> + <string name="submission_test_result_consent_given_breakup_button">"Beenden"</string> + + <!-- Submission Tan --> <!-- XHED: Page title for TAN submission pge --> @@ -978,6 +996,18 @@ <!-- XHED: Title for the interop country list--> <string name="submission_interoperability_list_title">"Folgende Länder nehmen derzeit an der länderübergreifenden Risiko-Ermittlung teil:"</string> + <!-- Test result positive and no consent given --> + <!-- XHED: Title for test result positive and no consent given--> + <string name="submission_test_result_positive_no_consent_subtitle">Bitte helfen Sie mit!</string> + <!-- XTXT: First bullet point when test result is positive and consent is requested for key sharing--> + <string name="submission_test_result_positive_no_consent_text_1"><b>Helfen Sie mit, Ihre Mitmenschen vor Ansteckungen zu schützen und teilen Sie Ihr Testergebnis.</b></string> + <!-- XTXT: Second bullet point when test result is positive and consent is requested for key sharing--> + <string name="submission_test_result_positive_no_consent_text_2">Ihre Identität bleibt dabei geheim. Andere Nutzer erfahren nicht, wer das Testergebnis geteilt hat.</string> + <!-- XTXT: Third bullet point when test result is positive and consent is requested for key sharing--> + <string name="submission_test_result_positive_no_consent_text_3">Bitte beachten Sie unbedingt die Hinweise des zuständigen Gesundheitsamtes und bleiben Sie zuhause, um andere Personen nicht anzustecken.</string> + <!-- XBUT: Button for giving consent for key sharing --> + <string name="submission_test_result_positive_no_consent_button_warn_others">Andere warnen</string> + <!-- Submission Country Selector --> <!-- XHED: Page title for the submission country selection page --> <string name="submission_positive_country_selection_title">"Europaweit warnen"</string> @@ -1098,9 +1128,9 @@ <!-- XHED: Page title for the various submission status: unregistered --> <string name="submission_status_card_title_unregistered">"Wurden Sie getestet?"</string> <!-- XHED: Page title for the various submission status: pending --> - <string name="submission_status_card_title_pending">"Ergebnis liegt noch nicht vor"</string> + <string name="submission_status_card_title_pending">"Testergebnis liegt noch nicht vor"</string> <!-- XHED: Page title for the various submission status: available --> - <string name="submission_status_card_title_available">"Ihr Ergebnis liegt vor"</string> + <string name="submission_status_card_title_available">"Ihr Testergebnis liegt vor"</string> <!-- XHED: Page title for the various submission status: positive --> <string name="submission_status_card_title_positive">"Befund positiv"</string> <!-- XHED: Page title for the various submission status fetch failed --> diff --git a/Corona-Warn-App/src/main/res/values-tr/legal_strings.xml b/Corona-Warn-App/src/main/res/values-tr/legal_strings.xml index 6b044f685f5c72047460ac9ee7b07d4337877962..e55d14e7c9165e3a0073ff427386e6c7e5ceb4cb 100644 --- a/Corona-Warn-App/src/main/res/values-tr/legal_strings.xml +++ b/Corona-Warn-App/src/main/res/values-tr/legal_strings.xml @@ -22,12 +22,4 @@ <string name="submission_consent_your_consent_subsection_second_point"></string> <!-- YTXT: Body for consent sub section your consent subtext third point --> <string name="submission_consent_your_consent_subsection_third_point"></string> - <!-- YTXT: Body for consent main section first point --> - <string name="submission_consent_main_first_point"></string> - <!-- YTXT: Body for consent main section second point --> - <string name="submission_consent_main_second_point"></string> - <!-- YTXT: Body for consent main section third point --> - <string name="submission_consent_main_third_point"></string> - <!-- YTXT: Body for consent main section fourth point --> - <string name="submission_consent_main_fourth_point"></string> </resources> diff --git a/Corona-Warn-App/src/main/res/values/attrs.xml b/Corona-Warn-App/src/main/res/values/attrs.xml index b7e4364179abe0e2572a1b164430e7011644c3b8..02f64f4b6df4ba6192a85f936900df20a1d6ce7a 100644 --- a/Corona-Warn-App/src/main/res/values/attrs.xml +++ b/Corona-Warn-App/src/main/res/values/attrs.xml @@ -12,13 +12,17 @@ <attr name="step_entry_icon" format="integer" /> <attr name="step_entry_final" format="boolean" /> </declare-styleable> - <declare-styleable name="SimpleStepEntry"> <attr name="simple_step_entry_title" format="string" /> <attr name="simple_step_entry_text" format="string" /> </declare-styleable> - <declare-styleable name="BulletPointList"> <attr name="entries" format="reference" /> </declare-styleable> + <declare-styleable name="TestResultSection"> + <attr name="test_result_section_headline" format="string" /> + <attr name="test_result_section_content" format="string" /> + <attr name="test_result_section_status_icon" format="reference" /> + <attr name="test_result_section_registered_at_text" format="string" /> + </declare-styleable> </resources> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/values/legal_strings.xml b/Corona-Warn-App/src/main/res/values/legal_strings.xml index 3e80f3942ecbe85ffc6006018b2b80d2f8a663ec..442caf74f7afe63260437ddf3f25b7794ab8cd88 100644 --- a/Corona-Warn-App/src/main/res/values/legal_strings.xml +++ b/Corona-Warn-App/src/main/res/values/legal_strings.xml @@ -23,14 +23,6 @@ <string name="submission_consent_your_consent_subsection_second_point" translatable="false"></string> <!-- YTXT: Body for consent sub section your consent subtext third point --> <string name="submission_consent_your_consent_subsection_third_point" translatable="false"></string> - <!-- YTXT: Body for consent main section first point --> - <string name="submission_consent_main_first_point" translatable="false"></string> - <!-- YTXT: Body for consent main section second point --> - <string name="submission_consent_main_second_point" translatable="false"></string> - <!-- YTXT: Body for consent main section third point --> - <string name="submission_consent_main_third_point" translatable="false"></string> - <!-- YTXT: Body for consent main section fourth point --> - <string name="submission_consent_main_fourth_point" translatable="false"></string> <!-- YTXT: Your consent screen agreement share test results --> <string name="submission_your_consent_agreement_share_test_results" translatable="false">""</string> <!-- YTXT: Your consent screen agreement share symptoms --> diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index 5080e0ad08571819f0077898676ba7acd9fc12d4..77f5d6e104b9cc1499bb34f56e3d121ef8e0d273 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -849,6 +849,14 @@ <string name="submission_consent_help_by_warning_others_body"></string> <!-- YTXT: Page bottom text for consent screen --> <string name="submission_consent_main_bottom_body"></string> + <!-- YTXT: Body for consent main section first point --> + <string name="submission_consent_main_first_point"></string> + <!-- YTXT: Body for consent main section second point --> + <string name="submission_consent_main_second_point"></string> + <!-- YTXT: Body for consent main section third point --> + <string name="submission_consent_main_third_point"></string> + <!-- YTXT: Body for consent main section fourth point --> + <string name="submission_consent_main_fourth_point"></string> <!-- Submission Test Result --> <!-- XHED: Page headline for test result --> @@ -907,6 +915,15 @@ <string name="submission_test_result_card_positive_title">"SARS-CoV-2 positive"</string> <!-- YTXT: Body text for test result card positive --> <string name="submission_test_result_card_positive_body">"You have been diagnosed with the SARS-CoV-2 virus."</string> + <!-- XHED: Page headline for test result with consent given --> + <string name="submission_test_result_consent_given_heading">""</string> + <!-- YTXT: Subtitle text for test result card with consent given --> + <string name="submission_test_result_consent_given_subtitle">""</string> + <!-- YTXT: body text for test result card with consent given --> + <string name="submission_test_result_consent_given_body">""</string> + <!-- XBUT: button text for the 'break up' button option on test result consent given page --> + <string name="submission_test_result_consent_given_breakup_button">""</string> + <!-- Submission Tan --> <!-- XHED: Page title for TAN submission pge --> @@ -981,6 +998,18 @@ <!-- XHED: Title for the interop country list--> <string name="submission_interoperability_list_title">"The following countries currently participate in transnational exposure logging:"</string> + <!-- Test result positive and no consent given --> + <!-- XHED: Title for test result positive and no consent given--> + <string name="submission_test_result_positive_no_consent_subtitle"></string> + <!-- XTXT: First bullet point when test result is positive and consent is requested for key sharing--> + <string name="submission_test_result_positive_no_consent_text_1"></string> + <!-- XTXT: Second bullet point when test result is positive and consent is requested for key sharing--> + <string name="submission_test_result_positive_no_consent_text_2"></string> + <!-- XTXT: Third bullet point when test result is positive and consent is requested for key sharing--> + <string name="submission_test_result_positive_no_consent_text_3"></string> + <!-- XBUT: Button for giving consent for key sharing --> + <string name="submission_test_result_positive_no_consent_button_warn_others"></string> + <!-- Submission Country Selector --> <!-- XHED: Page title for the submission country selection page --> <string name="submission_positive_country_selection_title"></string> @@ -1426,5 +1455,4 @@ <!-- XBUT: Title for the interoperability onboarding Settings-Button if no network is available --> <string name="interoperability_onboarding_list_button_title_no_network">"Open Device Settings"</string> - </resources> diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultConsentGivenViewModelTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultConsentGivenViewModelTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..13b2daaca059c2fc35e2c52104e971f9ad1025be --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/testresult/SubmissionTestResultConsentGivenViewModelTest.kt @@ -0,0 +1,41 @@ +package de.rki.coronawarnapp.ui.submission.testresult + +import de.rki.coronawarnapp.storage.SubmissionRepository +import de.rki.coronawarnapp.ui.submission.viewmodel.SubmissionNavigationEvents +import io.kotest.matchers.shouldBe +import io.mockk.MockKAnnotations +import io.mockk.impl.annotations.MockK +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith +import testhelpers.BaseTest +import testhelpers.extensions.InstantExecutorExtension + +@ExtendWith(InstantExecutorExtension::class) +class SubmissionTestResultConsentGivenViewModelTest : BaseTest() { + @MockK + lateinit var submissionRepository: SubmissionRepository + lateinit var viewModel: SubmissionTestResultConsentGivenViewModel + + @BeforeEach + fun setUp() { + MockKAnnotations.init(this, relaxed = true) + } + + private fun createViewModel() = SubmissionTestResultConsentGivenViewModel(submissionRepository) + + @Test + fun testOnConsentProvideSymptomsButtonClick() { + viewModel = createViewModel() + viewModel.onContinuePressed() + viewModel.routeToScreen.value shouldBe SubmissionNavigationEvents.NavigateToSymptomIntroduction + + } + + @Test + fun testOnCancelled() { + viewModel = createViewModel() + viewModel.cancelTestSubmission() + viewModel.routeToScreen.value shouldBe SubmissionNavigationEvents.NavigateToMainActivity + } +}