Skip to content
Snippets Groups Projects
Unverified Commit 23bbdde9 authored by Alex Paulescu's avatar Alex Paulescu Committed by GitHub
Browse files

Extend diary homescreen items with new attributes (EXPOSUREAPP-4741) (#2421)

* Added arguments for persons and locations on the diary homescreen.

* Adjusted instrumentation test.

* Cleaned up code.

* Changed textview to self closing.
parent c3f180ea
No related branches found
No related tags found
No related merge requests found
...@@ -10,6 +10,7 @@ import de.rki.coronawarnapp.contactdiary.model.DefaultContactDiaryPersonEncounte ...@@ -10,6 +10,7 @@ import de.rki.coronawarnapp.contactdiary.model.DefaultContactDiaryPersonEncounte
import de.rki.coronawarnapp.contactdiary.ui.day.tabs.location.DiaryLocationListItem import de.rki.coronawarnapp.contactdiary.ui.day.tabs.location.DiaryLocationListItem
import de.rki.coronawarnapp.contactdiary.ui.day.tabs.person.DiaryPersonListItem import de.rki.coronawarnapp.contactdiary.ui.day.tabs.person.DiaryPersonListItem
import de.rki.coronawarnapp.contactdiary.ui.overview.adapter.ListItem import de.rki.coronawarnapp.contactdiary.ui.overview.adapter.ListItem
import org.joda.time.Duration
import org.joda.time.LocalDate import org.joda.time.LocalDate
object DiaryData { object DiaryData {
...@@ -18,24 +19,42 @@ object DiaryData { ...@@ -18,24 +19,42 @@ object DiaryData {
ListItem.Data( ListItem.Data(
R.drawable.ic_contact_diary_person_item, R.drawable.ic_contact_diary_person_item,
"Max Mustermann", "Max Mustermann",
null,
listOf(
R.string.contact_diary_person_encounter_duration_below_15_min,
R.string.contact_diary_person_encounter_mask_with,
R.string.contact_diary_person_encounter_environment_inside
),
"Notizen notizen",
ListItem.Type.PERSON ListItem.Type.PERSON
), ),
ListItem.Data( ListItem.Data(
R.drawable.ic_contact_diary_person_item, R.drawable.ic_contact_diary_person_item,
"Erika Mustermann", "Erika Mustermann",
null,
listOf(
R.string.contact_diary_person_encounter_environment_inside
),
"Notizen notizen",
ListItem.Type.PERSON ListItem.Type.PERSON
), ),
ListItem.Data( ListItem.Data(
R.drawable.ic_contact_diary_location, R.drawable.ic_contact_diary_location,
"Fitnessstudio", "Fitnessstudio",
Duration.millis(1800000),
null,
"Notizen notizen",
ListItem.Type.LOCATION ListItem.Type.LOCATION
), ),
ListItem.Data( ListItem.Data(
R.drawable.ic_contact_diary_location, R.drawable.ic_contact_diary_location,
"Supermarket", "Supermarket",
null,
null,
null,
ListItem.Type.LOCATION ListItem.Type.LOCATION
) )
) )
...@@ -126,13 +145,21 @@ object DiaryData { ...@@ -126,13 +145,21 @@ object DiaryData {
val LOCATIONS_EDIT_LIST: List<ContactDiaryLocation> = listOf( val LOCATIONS_EDIT_LIST: List<ContactDiaryLocation> = listOf(
DefaultContactDiaryLocation(locationName = "Sport"), DefaultContactDiaryLocation(locationName = "Sport"),
DefaultContactDiaryLocation(locationName = "Büro"), DefaultContactDiaryLocation(
locationName = "Büro",
phoneNumber = "+49153397029",
emailAddress = "office@work.com"
),
DefaultContactDiaryLocation(locationName = "Supermarkt") DefaultContactDiaryLocation(locationName = "Supermarkt")
) )
val PERSONS_EDIT_LIST: List<ContactDiaryPerson> = listOf( val PERSONS_EDIT_LIST: List<ContactDiaryPerson> = listOf(
DefaultContactDiaryPerson(fullName = "Max Mustermann"), DefaultContactDiaryPerson(
DefaultContactDiaryPerson(fullName = "Erika Mustermann"), fullName = "Max Mustermann",
phoneNumber = "+49151237865",
emailAddress = "max.musterman@me.com"
),
DefaultContactDiaryPerson(fullName = "Erika Mustermann", emailAddress = "erika.mustermann@me.com"),
DefaultContactDiaryPerson(fullName = "John Doe") DefaultContactDiaryPerson(fullName = "John Doe")
) )
} }
...@@ -9,6 +9,8 @@ import dagger.assisted.AssistedInject ...@@ -9,6 +9,8 @@ import dagger.assisted.AssistedInject
import de.rki.coronawarnapp.R import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.contactdiary.model.ContactDiaryLocationVisit import de.rki.coronawarnapp.contactdiary.model.ContactDiaryLocationVisit
import de.rki.coronawarnapp.contactdiary.model.ContactDiaryPersonEncounter import de.rki.coronawarnapp.contactdiary.model.ContactDiaryPersonEncounter
import de.rki.coronawarnapp.contactdiary.model.ContactDiaryPersonEncounter.DurationClassification.LESS_THAN_15_MINUTES
import de.rki.coronawarnapp.contactdiary.model.ContactDiaryPersonEncounter.DurationClassification.MORE_THAN_15_MINUTES
import de.rki.coronawarnapp.contactdiary.retention.ContactDiaryCleanTask import de.rki.coronawarnapp.contactdiary.retention.ContactDiaryCleanTask
import de.rki.coronawarnapp.contactdiary.storage.repo.ContactDiaryRepository import de.rki.coronawarnapp.contactdiary.storage.repo.ContactDiaryRepository
import de.rki.coronawarnapp.contactdiary.ui.overview.adapter.ListItem import de.rki.coronawarnapp.contactdiary.ui.overview.adapter.ListItem
...@@ -117,7 +119,10 @@ class ContactDiaryOverviewViewModel @AssistedInject constructor( ...@@ -117,7 +119,10 @@ class ContactDiaryOverviewViewModel @AssistedInject constructor(
.map { personEncounter -> .map { personEncounter ->
ListItem.Data( ListItem.Data(
R.drawable.ic_contact_diary_person_item, R.drawable.ic_contact_diary_person_item,
personEncounter.contactDiaryPerson.fullName, name = personEncounter.contactDiaryPerson.fullName,
duration = null,
attributes = getPersonAttributes(personEncounter),
circumstances = personEncounter.circumstances,
ListItem.Type.PERSON ListItem.Type.PERSON
) )
} }
...@@ -133,6 +138,9 @@ class ContactDiaryOverviewViewModel @AssistedInject constructor( ...@@ -133,6 +138,9 @@ class ContactDiaryOverviewViewModel @AssistedInject constructor(
ListItem.Data( ListItem.Data(
R.drawable.ic_contact_diary_location_item, R.drawable.ic_contact_diary_location_item,
locationVisit.contactDiaryLocation.locationName, locationVisit.contactDiaryLocation.locationName,
duration = locationVisit.duration,
attributes = null,
circumstances = locationVisit.circumstances,
ListItem.Type.LOCATION ListItem.Type.LOCATION
) )
} }
...@@ -146,6 +154,24 @@ class ContactDiaryOverviewViewModel @AssistedInject constructor( ...@@ -146,6 +154,24 @@ class ContactDiaryOverviewViewModel @AssistedInject constructor(
routeToScreen.postValue(ContactDiaryOverviewNavigationEvents.NavigateToContactDiaryDayFragment(listItem.date)) routeToScreen.postValue(ContactDiaryOverviewNavigationEvents.NavigateToContactDiaryDayFragment(listItem.date))
} }
private fun getPersonAttributes(personEncounter: ContactDiaryPersonEncounter): List<Int> =
mutableListOf<Int>().apply {
when (personEncounter.durationClassification) {
LESS_THAN_15_MINUTES -> add(R.string.contact_diary_person_encounter_duration_below_15_min)
MORE_THAN_15_MINUTES -> add(R.string.contact_diary_person_encounter_duration_above_15_min)
}
when (personEncounter.withMask) {
true -> add(R.string.contact_diary_person_encounter_mask_with)
false -> add(R.string.contact_diary_person_encounter_mask_without)
}
when (personEncounter.wasOutside) {
true -> add(R.string.contact_diary_person_encounter_environment_outside)
false -> add(R.string.contact_diary_person_encounter_environment_inside)
}
}
fun onExportPress(ctx: Context) { fun onExportPress(ctx: Context) {
Timber.d("Exporting person and location entries") Timber.d("Exporting person and location entries")
launch { launch {
...@@ -158,9 +184,13 @@ class ContactDiaryOverviewViewModel @AssistedInject constructor( ...@@ -158,9 +184,13 @@ class ContactDiaryOverviewViewModel @AssistedInject constructor(
.groupBy({ it.date }, { it.contactDiaryPerson.fullName }) .groupBy({ it.date }, { it.contactDiaryPerson.fullName })
val sb = StringBuilder() val sb = StringBuilder()
.appendLine(ctx.getString(R.string.contact_diary_export_intro_one, .appendLine(
dates.last().toFormattedString(), ctx.getString(
dates.first().toFormattedString())) R.string.contact_diary_export_intro_one,
dates.last().toFormattedString(),
dates.first().toFormattedString()
)
)
.appendLine(ctx.getString(R.string.contact_diary_export_intro_two)) .appendLine(ctx.getString(R.string.contact_diary_export_intro_two))
.appendLine() .appendLine()
......
...@@ -6,6 +6,7 @@ import de.rki.coronawarnapp.contactdiary.util.clearAndAddAll ...@@ -6,6 +6,7 @@ import de.rki.coronawarnapp.contactdiary.util.clearAndAddAll
import de.rki.coronawarnapp.databinding.ContactDiaryOverviewNestedListItemBinding import de.rki.coronawarnapp.databinding.ContactDiaryOverviewNestedListItemBinding
import de.rki.coronawarnapp.ui.lists.BaseAdapter import de.rki.coronawarnapp.ui.lists.BaseAdapter
import de.rki.coronawarnapp.util.lists.BindableVH import de.rki.coronawarnapp.util.lists.BindableVH
import org.joda.time.Duration
class ContactDiaryOverviewNestedAdapter : BaseAdapter<ContactDiaryOverviewNestedAdapter.NestedItemViewHolder>() { class ContactDiaryOverviewNestedAdapter : BaseAdapter<ContactDiaryOverviewNestedAdapter.NestedItemViewHolder>() {
...@@ -35,11 +36,20 @@ class ContactDiaryOverviewNestedAdapter : BaseAdapter<ContactDiaryOverviewNested ...@@ -35,11 +36,20 @@ class ContactDiaryOverviewNestedAdapter : BaseAdapter<ContactDiaryOverviewNested
ContactDiaryOverviewNestedListItemBinding.(item: ListItem.Data, payloads: List<Any>) -> Unit = ContactDiaryOverviewNestedListItemBinding.(item: ListItem.Data, payloads: List<Any>) -> Unit =
{ key, _ -> { key, _ ->
contactDiaryOverviewElementImage.setImageResource(key.drawableId) contactDiaryOverviewElementImage.setImageResource(key.drawableId)
contactDiaryOverviewElementName.text = key.text contactDiaryOverviewElementName.text = key.name
contactDiaryOverviewElementName.contentDescription = when (key.type) { contactDiaryOverviewElementName.contentDescription = when (key.type) {
ListItem.Type.LOCATION -> context.getString(R.string.accessibility_location, key.text) ListItem.Type.LOCATION -> context.getString(R.string.accessibility_location, key.name)
ListItem.Type.PERSON -> context.getString(R.string.accessibility_person, key.text) ListItem.Type.PERSON -> context.getString(R.string.accessibility_person, key.name)
} }
contactDiaryOverviewElementAttributes.text =
getAttributes(key.duration, key.attributes, key.circumstances)
} }
private fun getAttributes(duration: Duration?, resources: List<Int>?, circumstances: String?): String =
mutableListOf<String>().apply {
duration?.run { add(toStandardHours().toString()) }
resources?.run { forEach { add(context.getString(it)) } }
circumstances?.run { add(this) }
}.joinToString()
} }
} }
...@@ -2,6 +2,7 @@ package de.rki.coronawarnapp.contactdiary.ui.overview.adapter ...@@ -2,6 +2,7 @@ package de.rki.coronawarnapp.contactdiary.ui.overview.adapter
import androidx.annotation.DrawableRes import androidx.annotation.DrawableRes
import androidx.annotation.StringRes import androidx.annotation.StringRes
import org.joda.time.Duration
import org.joda.time.LocalDate import org.joda.time.LocalDate
data class ListItem( data class ListItem(
...@@ -12,7 +13,10 @@ data class ListItem( ...@@ -12,7 +13,10 @@ data class ListItem(
data class Data( data class Data(
@DrawableRes val drawableId: Int, @DrawableRes val drawableId: Int,
val text: String, val name: String,
val duration: Duration?,
val attributes: List<Int>?,
val circumstances: String?,
val type: Type val type: Type
) )
......
...@@ -2,54 +2,54 @@ ...@@ -2,54 +2,54 @@
<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"
android:id="@+id/contact_diary_overview_element_nested_container" android:id="@+id/contact_diary_overview_element_nested_body"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginVertical="@dimen/spacing_tiny"
android:focusable="true" android:focusable="true"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout <ImageView
android:id="@+id/contact_diary_overview_element_nested_body" android:id="@+id/contact_diary_overview_element_image"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginStart="@dimen/spacing_small"
android:importantForAccessibility="no"
android:scaleType="centerInside"
android:src="@drawable/ic_contact_diary_person_item"
app:layout_constraintBottom_toBottomOf="@+id/contact_diary_overview_element_name"
app:layout_constraintEnd_toStartOf="@id/contact_diary_overview_element_name"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/contact_diary_overview_element_name" />
<TextView
android:id="@+id/contact_diary_overview_element_name"
style="@style/subtitle"
android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginVertical="@dimen/spacing_tiny" android:layout_marginStart="@dimen/spacing_small"
android:layout_marginEnd="@dimen/spacing_small"
android:ellipsize="end"
android:focusable="true" android:focusable="true"
app:layout_constraintBottom_toBottomOf="parent" android:maxLines="3"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toEndOf="@+id/contact_diary_overview_element_image"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent"
tools:text="Andrea Steinhauer" />
<ImageView <TextView
android:id="@+id/contact_diary_overview_element_image" android:id="@+id/contact_diary_overview_element_attributes"
android:layout_width="wrap_content" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="wrap_content"
android:layout_marginStart="@dimen/spacing_small" android:maxLines="3"
android:importantForAccessibility="no" android:text="unter 15 Min, im Freien"
android:scaleType="centerInside" app:layout_constraintEnd_toEndOf="@+id/contact_diary_overview_element_name"
android:src="@drawable/ic_contact_diary_person_item" app:layout_constraintStart_toStartOf="@+id/contact_diary_overview_element_name"
app:layout_constraintBaseline_toBaselineOf="@id/contact_diary_overview_element_name" app:layout_constraintTop_toBottomOf="@+id/contact_diary_overview_element_name" />
app:layout_constraintEnd_toStartOf="@id/contact_diary_overview_element_name"
app:layout_constraintStart_toStartOf="parent" />
<TextView </androidx.constraintlayout.widget.ConstraintLayout>
android:id="@+id/contact_diary_overview_element_name"
style="@style/subtitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/spacing_small"
android:layout_marginEnd="@dimen/spacing_small"
android:ellipsize="end"
android:focusable="true"
android:maxLines="3"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/contact_diary_overview_element_image"
app:layout_constraintTop_toTopOf="parent"
tools:text="Andrea Steinhauer" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
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