Skip to content
Snippets Groups Projects
Unverified Commit 0ab337d2 authored by Mohamed's avatar Mohamed Committed by GitHub
Browse files

Negative RAT timer (EXPOSUREAPP-6590) (#2902)


* extra line

* Fix constraint

* Hide profile info

* initial impl

* lint

* Handle deletion

* Bind views

* Tweaking

* Lint

* Clean up

* Date format

* Use one TextView

* Refactoring

* time since test conduction

* fix null values

* remove redeem state

* adapt strings

Co-authored-by: default avatarchilja <chiljamgossow@gmail.com>
Co-authored-by: default avatarharambasicluka <64483219+harambasicluka@users.noreply.github.com>
parent 9eee83dd
No related branches found
No related tags found
No related merge requests found
Showing
with 174 additions and 37 deletions
...@@ -2,13 +2,18 @@ package de.rki.coronawarnapp.submission.ui.testresults.negative ...@@ -2,13 +2,18 @@ package de.rki.coronawarnapp.submission.ui.testresults.negative
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.core.text.bold
import androidx.core.text.buildSpannedString
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import de.rki.coronawarnapp.R import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.databinding.FragmentSubmissionAntigenTestResultNegativeBinding import de.rki.coronawarnapp.databinding.FragmentSubmissionAntigenTestResultNegativeBinding
import de.rki.coronawarnapp.util.TimeAndDateExtensions.toUserTimeZone
import de.rki.coronawarnapp.util.di.AutoInject import de.rki.coronawarnapp.util.di.AutoInject
import de.rki.coronawarnapp.util.ui.popBackStack
import de.rki.coronawarnapp.util.ui.viewBindingLazy import de.rki.coronawarnapp.util.ui.viewBindingLazy
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider
import de.rki.coronawarnapp.util.viewmodel.cwaViewModels import de.rki.coronawarnapp.util.viewmodel.cwaViewModels
import org.joda.time.format.DateTimeFormat
import javax.inject.Inject import javax.inject.Inject
class RATResultNegativeFragment : Fragment(R.layout.fragment_submission_antigen_test_result_negative), AutoInject { class RATResultNegativeFragment : Fragment(R.layout.fragment_submission_antigen_test_result_negative), AutoInject {
...@@ -17,8 +22,58 @@ class RATResultNegativeFragment : Fragment(R.layout.fragment_submission_antigen_ ...@@ -17,8 +22,58 @@ class RATResultNegativeFragment : Fragment(R.layout.fragment_submission_antigen_
private val binding: FragmentSubmissionAntigenTestResultNegativeBinding by viewBindingLazy() private val binding: FragmentSubmissionAntigenTestResultNegativeBinding by viewBindingLazy()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { private val shortTime = DateTimeFormat.shortTime()
super.onViewCreated(view, savedInstanceState)
// TODO: Add fragment logic and databinding. override fun onViewCreated(view: View, savedInstanceState: Bundle?) =
with(binding) {
coronatestNegativeAntigenResultButton.setOnClickListener { viewModel.deleteTest() }
toolbar.setNavigationOnClickListener { viewModel.onClose() }
viewModel.testAge.observe(viewLifecycleOwner) {
it?.let { bindView(it) }
}
viewModel.events.observe(viewLifecycleOwner) {
when (it) {
RATResultNegativeNavigation.Back -> popBackStack()
}
}
}
private fun FragmentSubmissionAntigenTestResultNegativeBinding.bindView(
testAge: RATResultNegativeViewModel.TestAge
) {
resultReceivedCounter.chronometer.text = testAge.ageText
val patientName = getString(
R.string.submission_test_result_antigen_patient_name_placeholder,
testAge.test.firstName ?: "",
testAge.test.lastName ?: ""
)
rapidTestCardPatientInfo.text = buildSpannedString {
bold {
if (patientName.isNotBlank()) append(patientName)
}
testAge.test.dateOfBirth?.let {
val birthDate = getString(
R.string.submission_test_result_antigen_patient_birth_date_placeholder,
it.toString(DATE_FORMAT)
)
if (this.isNotBlank()) append(", ")
append(birthDate)
}
}
val localTime = testAge.test.testedAt.toUserTimeZone()
resultReceivedTimeAndDate.text = getString(
R.string.coronatest_negative_antigen_result_time_date_placeholder,
localTime?.toString(DATE_FORMAT),
localTime?.toString(shortTime)
)
}
companion object {
private const val DATE_FORMAT = "dd.MM.yy"
} }
} }
package de.rki.coronawarnapp.submission.ui.testresults.negative
sealed class RATResultNegativeNavigation {
object Back : RATResultNegativeNavigation()
}
package de.rki.coronawarnapp.submission.ui.testresults.negative package de.rki.coronawarnapp.submission.ui.testresults.negative
import androidx.lifecycle.asLiveData
import dagger.assisted.AssistedFactory import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject import dagger.assisted.AssistedInject
import de.rki.coronawarnapp.coronatest.CoronaTestRepository
import de.rki.coronawarnapp.coronatest.type.CoronaTest
import de.rki.coronawarnapp.coronatest.type.rapidantigen.RACoronaTest
import de.rki.coronawarnapp.exception.ExceptionCategory
import de.rki.coronawarnapp.exception.reporting.report
import de.rki.coronawarnapp.submission.SubmissionRepository
import de.rki.coronawarnapp.util.TimeStamper
import de.rki.coronawarnapp.util.coroutine.DispatcherProvider import de.rki.coronawarnapp.util.coroutine.DispatcherProvider
import de.rki.coronawarnapp.util.flow.combine
import de.rki.coronawarnapp.util.flow.intervalFlow
import de.rki.coronawarnapp.util.ui.SingleLiveEvent
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory
import org.joda.time.Duration
import org.joda.time.format.PeriodFormatter
import org.joda.time.format.PeriodFormatterBuilder
import timber.log.Timber
class RATResultNegativeViewModel @AssistedInject constructor( class RATResultNegativeViewModel @AssistedInject constructor(
dispatcherProvider: DispatcherProvider dispatcherProvider: DispatcherProvider,
private val timeStamper: TimeStamper,
private val submissionRepository: SubmissionRepository,
coronaTestRepository: CoronaTestRepository
) : CWAViewModel(dispatcherProvider) { ) : CWAViewModel(dispatcherProvider) {
val events = SingleLiveEvent<RATResultNegativeNavigation>()
val testAge = combine(
intervalFlow(1),
coronaTestRepository.coronaTests
) { _, tests ->
val rapidTest = tests.firstOrNull {
it.type == CoronaTest.Type.RAPID_ANTIGEN
}
rapidTest?.testAge()
}.asLiveData(context = dispatcherProvider.Default)
private fun CoronaTest.testAge(): TestAge? {
if (this !is RACoronaTest) {
Timber.d("Rapid test is missing")
return null
}
val nowUTC = timeStamper.nowUTC
val age = nowUTC.millis - testedAt.millis
val ageText = formatter.print(Duration(age).toPeriod())
return TestAge(test = this, ageText)
}
fun deleteTest() {
try {
Timber.d("deleteTest")
submissionRepository.removeTestFromDevice(CoronaTest.Type.RAPID_ANTIGEN)
events.postValue(RATResultNegativeNavigation.Back)
} catch (e: Exception) {
Timber.d(e, "Failed to delete rapid antigen test")
e.report(ExceptionCategory.INTERNAL)
}
}
fun onClose() {
events.postValue(RATResultNegativeNavigation.Back)
}
@AssistedFactory @AssistedFactory
interface Factory : SimpleCWAViewModelFactory<RATResultNegativeViewModel> interface Factory : SimpleCWAViewModelFactory<RATResultNegativeViewModel>
data class TestAge(
val test: RACoronaTest,
val ageText: String,
)
companion object {
private val formatter: PeriodFormatter =
PeriodFormatterBuilder().apply {
printZeroAlways()
minimumPrintedDigits(2)
appendHours()
appendSuffix(":")
appendMinutes()
appendSuffix(":")
appendSeconds()
}.toFormatter()
}
} }
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="40dp"
android:height="40dp"
android:viewportWidth="40"
android:viewportHeight="40">
<path
android:fillColor="#434445"
android:pathData="M20,40C31.0457,40 40,31.0457 40,20C40,8.9543 31.0457,0 20,0C8.9543,0 0,8.9543 0,20C0,31.0457 8.9543,40 20,40Z" />
<path
android:fillColor="#979797"
android:pathData="M24,17V27H16V17H24ZM22.5,11H17.5L16.5,12H13V14H27V12H23.5L22.5,11ZM26,15H14V27C14,28.1 14.9,29 16,29H24C25.1,29 26,28.1 26,27V15Z" />
</vector>
...@@ -3,10 +3,10 @@ ...@@ -3,10 +3,10 @@
android:height="40dp" android:height="40dp"
android:viewportWidth="40" android:viewportWidth="40"
android:viewportHeight="40"> android:viewportHeight="40">
<path <path
android:pathData="M20,40C31.0457,40 40,31.0457 40,20C40,8.9543 31.0457,0 20,0C8.9543,0 0,8.9543 0,20C0,31.0457 8.9543,40 20,40Z" android:fillColor="#F5F5F5"
android:fillColor="#F5F5F5"/> android:pathData="M20,40C31.0457,40 40,31.0457 40,20C40,8.9543 31.0457,0 20,0C8.9543,0 0,8.9543 0,20C0,31.0457 8.9543,40 20,40Z" />
<path <path
android:pathData="M24,17V27H16V17H24ZM22.5,11H17.5L16.5,12H13V14H27V12H23.5L22.5,11ZM26,15H14V27C14,28.1 14.9,29 16,29H24C25.1,29 26,28.1 26,27V15Z" android:fillColor="#979797"
android:fillColor="#979797"/> android:pathData="M24,17V27H16V17H24ZM22.5,11H17.5L16.5,12H13V14H27V12H23.5L22.5,11ZM26,15H14V27C14,28.1 14.9,29 16,29H24C25.1,29 26,28.1 26,27V15Z" />
</vector> </vector>
...@@ -81,26 +81,16 @@ ...@@ -81,26 +81,16 @@
tools:text="@string/submission_test_result_negative" /> tools:text="@string/submission_test_result_negative" />
<TextView <TextView
android:id="@+id/rapid_test_card_patient_name" android:id="@+id/rapid_test_card_patient_info"
style="@style/body2" style="@style/body2"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/spacing_small" android:layout_marginTop="@dimen/spacing_small"
android:layout_marginEnd="@dimen/spacing_normal" android:layout_marginEnd="@dimen/spacing_normal"
android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@id/rapid_test_card_diagnosis" app:layout_constraintStart_toStartOf="@id/rapid_test_card_diagnosis"
app:layout_constraintTop_toBottomOf="@id/rapid_test_card_diagnosis" app:layout_constraintTop_toBottomOf="@id/rapid_test_card_diagnosis"
tools:text="@string/submission_test_result_antigen_patient_name_placeholder" /> tools:text="Max Mustermann, geboren 14.03.1987" />
<TextView
android:id="@+id/rapid_test_card_patient_birthdate"
style="@style/body2"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/rapid_test_card_patient_name"
app:layout_constraintTop_toTopOf="@id/rapid_test_card_patient_name"
tools:text="@string/submission_test_result_antigen_patient_birth_date_placeholder" />
<TextView <TextView
android:id="@+id/rapid_test_card_negative_result_message" android:id="@+id/rapid_test_card_negative_result_message"
...@@ -111,8 +101,8 @@ ...@@ -111,8 +101,8 @@
android:layout_marginEnd="@dimen/spacing_normal" android:layout_marginEnd="@dimen/spacing_normal"
android:text="@string/submission_test_result_negative_message" android:text="@string/submission_test_result_negative_message"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@id/rapid_test_card_patient_name" app:layout_constraintStart_toStartOf="@id/rapid_test_card_patient_info"
app:layout_constraintTop_toBottomOf="@id/rapid_test_card_patient_birthdate" /> app:layout_constraintTop_toBottomOf="@id/rapid_test_card_patient_info" />
<include <include
android:id="@+id/result_received_counter" android:id="@+id/result_received_counter"
...@@ -212,7 +202,7 @@ ...@@ -212,7 +202,7 @@
app:layout_constraintTop_toBottomOf="@+id/test_result_negative_steps_added" app:layout_constraintTop_toBottomOf="@+id/test_result_negative_steps_added"
app:simple_step_entry_text="@string/coronatest_negative_antigen_result_second_info_body" app:simple_step_entry_text="@string/coronatest_negative_antigen_result_second_info_body"
app:simple_step_entry_title="@string/coronatest_negative_antigen_result_second_info_title" app:simple_step_entry_title="@string/coronatest_negative_antigen_result_second_info_title"
app:step_entry_final="true" app:step_entry_final="false"
app:step_entry_icon="@drawable/ic_test_result_step_invalid" /> app:step_entry_icon="@drawable/ic_test_result_step_invalid" />
<de.rki.coronawarnapp.ui.view.SimpleStepEntry <de.rki.coronawarnapp.ui.view.SimpleStepEntry
...@@ -235,7 +225,7 @@ ...@@ -235,7 +225,7 @@
android:background="@color/colorSurface2" android:background="@color/colorSurface2"
android:orientation="vertical" android:orientation="vertical"
android:padding="@dimen/spacing_normal" android:padding="@dimen/spacing_normal"
app:layout_constraintTop_toBottomOf="@id/test_result_negative_steps_negative_result"> app:layout_constraintTop_toBottomOf="@id/coronatest_negative_antigen_result_third_info">
<TextView <TextView
android:id="@+id/further_info_title" android:id="@+id/further_info_title"
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
...@@ -24,19 +23,19 @@ ...@@ -24,19 +23,19 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<Chronometer <TextView
android:id="@+id/chronometer" android:id="@+id/chronometer"
style="@style/headline4Bold" style="@style/headline4Bold"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/spacing_tiny" android:layout_marginTop="@dimen/spacing_tiny"
android:format="00:00:00"
android:gravity="center" android:gravity="center"
android:text="00:00:00"
android:textColor="@color/colorTextPrimary1InvertedStable" android:textColor="@color/colorTextPrimary1InvertedStable"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/result_timer" app:layout_constraintTop_toBottomOf="@id/result_timer"
tools:text="00:00:00" /> tools:ignore="HardcodedText" />
<TextView <TextView
android:id="@+id/chronometer_hours" android:id="@+id/chronometer_hours"
......
...@@ -111,11 +111,11 @@ ...@@ -111,11 +111,11 @@
<!-- XTXT: submission test result fragment positive diagnosis --> <!-- XTXT: submission test result fragment positive diagnosis -->
<string name="submission_test_result_positive">"Positiv"</string> <string name="submission_test_result_positive">"Positiv"</string>
<!-- XTXT: submission result antigen fragment card patient name placeholder --> <!-- XTXT: submission result antigen fragment card patient name placeholder -->
<string name="submission_test_result_antigen_patient_name_placeholder">"Max Mustermann,"</string> <string name="submission_test_result_antigen_patient_name_placeholder">"%1$s %2$s"</string>
<!-- XTXT: submission result antigen fragment card patient birth date placeholder --> <!-- XTXT: submission result antigen fragment card patient birth date placeholder -->
<string name="submission_test_result_antigen_patient_birth_date_placeholder">"geboren 14.03.1987"</string> <string name="submission_test_result_antigen_patient_birth_date_placeholder">"geboren %1$s"</string>
<!-- XTXT: coronatest negative antigen result time and date placeholder --> <!-- XTXT: coronatest negative antigen result time and date placeholder -->
<string name="coronatest_negative_antigen_result_time_date_placeholder">"Ausgestellt: 10.03.2021, 18:01 Uhr"</string> <string name="coronatest_negative_antigen_result_time_date_placeholder">"Ausgestellt: %1$s, %2$s Uhr"</string>
<!-- XTXT: submission result antigen fragment card negative result message --> <!-- XTXT: submission result antigen fragment card negative result message -->
<string name="submission_test_result_negative_message">"Das Virus SARS-CoV-2 wurde bei Ihnen nicht nachgewiesen."</string> <string name="submission_test_result_negative_message">"Das Virus SARS-CoV-2 wurde bei Ihnen nicht nachgewiesen."</string>
<!-- XHED: submission result antigen fragment negative result proof title --> <!-- XHED: submission result antigen fragment negative result proof title -->
......
...@@ -111,11 +111,11 @@ ...@@ -111,11 +111,11 @@
<!-- XTXT: submission test result fragment positive diagnosis --> <!-- XTXT: submission test result fragment positive diagnosis -->
<string name="submission_test_result_positive">"Positiv"</string> <string name="submission_test_result_positive">"Positiv"</string>
<!-- XTXT: submission result antigen fragment card patient name placeholder --> <!-- XTXT: submission result antigen fragment card patient name placeholder -->
<string name="submission_test_result_antigen_patient_name_placeholder">"Max Mustermann,"</string> <string name="submission_test_result_antigen_patient_name_placeholder">"%1$s %2$s"</string>
<!-- XTXT: submission result antigen fragment card patient birth date placeholder --> <!-- XTXT: submission result antigen fragment card patient birth date placeholder -->
<string name="submission_test_result_antigen_patient_birth_date_placeholder">"geboren 14.03.1987"</string> <string name="submission_test_result_antigen_patient_birth_date_placeholder">"geboren %1$s"</string>
<!-- XTXT: coronatest negative antigen result time and date placeholder --> <!-- XTXT: coronatest negative antigen result time and date placeholder -->
<string name="coronatest_negative_antigen_result_time_date_placeholder">"Ausgestellt: 10.03.2021, 18:01 Uhr"</string> <string name="coronatest_negative_antigen_result_time_date_placeholder">"Ausgestellt: %1$s, %2$s Uhr"</string>
<!-- XTXT: submission result antigen fragment card negative result message --> <!-- XTXT: submission result antigen fragment card negative result message -->
<string name="submission_test_result_negative_message">"Das Virus SARS-CoV-2 wurde bei Ihnen nicht nachgewiesen."</string> <string name="submission_test_result_negative_message">"Das Virus SARS-CoV-2 wurde bei Ihnen nicht nachgewiesen."</string>
<!-- XHED: submission result antigen fragment negative result proof title --> <!-- XHED: submission result antigen fragment negative result proof title -->
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment