Skip to content
Snippets Groups Projects
Commit c96c0ecc authored by Matthias Urhahn's avatar Matthias Urhahn
Browse files

Merge branch 'release/1.10.x' into fix/1.10.x-into-1.11.x

# Conflicts:
#	gradle.properties
parents be9e1c9e 352157ec
No related branches found
No related tags found
No related merge requests found
Showing
with 112 additions and 93 deletions
......@@ -80,7 +80,9 @@
android:name=".contactdiary.ui.ContactDiaryActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.ContactDiary" />
android:launchMode= "singleTop"
android:theme="@style/AppTheme.ContactDiary"
android:windowSoftInputMode="adjustResize|stateAlwaysHidden"/>
</application>
......
......@@ -259,11 +259,9 @@
<h2>
d. Einträge im Kontakt-Tagebuch
</h2>
<p>
Wenn Sie im Kontakt-Tagebuch notieren, wann und wo Sie welche Personen getroffen haben, werden diese Angaben verschlüsselt auf Ihrem Smartphone gespeichert. Die Kontakt-Tagebuch-Einträge dienen nur Ihnen als Gedächtnisstütze. Das RKI oder andere Stellen können auf die Einträge im Kontakt-Tagebuch nicht zugreifen. Das Kontakt-Tagebuch kann Ihnen helfen, Ihre persönlichen Kontakte der letzten 14 Tage nachzuvollziehen. Falls Sie Corona-positiv getestet werden sollten und das Gesundheitsamt Ihre Mithilfe bei der Kontaktnachverfolgung erbittet, können Sie dem Gesundheitsamt somit schnell die benötigten Informationen mitteilen.
<p>Wenn Sie im Kontakt-Tagebuch notieren, wann und wo Sie welche Personen getroffen haben, werden diese Angaben verschlüsselt auf Ihrem Smartphone gespeichert. Die Kontakt-Tagebuch-Einträge dienen nur Ihnen als Gedächtnisstütze. Das RKI oder andere Stellen können auf die Einträge im Kontakt-Tagebuch nicht zugreifen. Das Kontakt-Tagebuch kann Ihnen helfen, Ihre persönlichen Kontakte der letzten 14 Tage nachzuvollziehen. Falls Sie Corona-positiv getestet werden sollten und das Gesundheitsamt Ihre Mithilfe bei der Kontaktnachverfolgung erbittet, können Sie dem Gesundheitsamt somit schnell die benötigten Informationen mitteilen.
</p>
Die Nutzung des Kontakt-Tagebuchs ist freiwillig. Sie entscheiden selbst über die Speicherung der Einträge im Kontakt-Tagebuch. Sie sind insofern auch selbst für Ihre Einträge verantwortlich. Respektieren Sie daher bitte die Privatsphäre der Personen, die Sie in Ihr Kontakt-Tagebuch aufnehmen. Die Einträge sollen nicht an Dritte und nicht über unsichere Kommunikationskanäle weitergegeben werden. Das zuständige Gesundheitsamt wird Ihnen mitteilen, welche Informationen es für die Kontaktnachverfolgung von Ihnen benötigt und wie Sie diese zur Verfügung stellen können.
<p>
<p>Die Nutzung des Kontakt-Tagebuchs ist freiwillig. Sie entscheiden selbst über die Speicherung der Einträge im Kontakt-Tagebuch. Sie sind insofern auch selbst für Ihre Einträge verantwortlich. Respektieren Sie daher bitte die Privatsphäre der Personen, die Sie in Ihr Kontakt-Tagebuch aufnehmen. Die Einträge sollen nicht an Dritte und nicht über unsichere Kommunikationskanäle weitergegeben werden. Das zuständige Gesundheitsamt wird Ihnen mitteilen, welche Informationen es für die Kontaktnachverfolgung von Ihnen benötigt und wie Sie diese zur Verfügung stellen können.
</p>
<h1>
6. Wofür werden Ihre Daten verarbeitet?
......
......@@ -253,10 +253,10 @@
d. Entries in the contact journal
</h2>
<p>
If you use the contact journal to note when and where you met certain people, this information is stored in encrypted form on your smartphone. The contact journal entries are only there to help you remember. The RKI and other agencies cannot gain access to entries in the contact journal. The contact journal can help you to keep track of your personal contacts over the last 14 days. If you test positive for coronavirus and the public health office (Gesundheitsamt) requests your assistance with contact tracing, then you can quickly provide the information it needs.
If you use the contact journal to note when and where you met certain people, this information is stored in encrypted form on your smartphone. The contact journal entries are only there to help you remember. The RKI and other agencies cannot gain access to entries in the contact journal. The contact journal can help you to keep track of your personal contacts over the last 14 days. If you test positive for coronavirus and the public health office (Gesundheitsamt) requests your assistance with contact tracing, then you can quickly provide the information it needs.
</p>
<p>
Using the contact journal is voluntary. You personally decide whether to store entries in the contact journal. In this respect, you are also responsible for what you record. For this reason, we kindly ask you to respect the privacy of the people you include in your contact journal. You should not share your entries with third parties or via insecure communication channels. The competent public health office will tell you what information it needs from you for contact tracing purposes, and how you can provide it.
Using the contact journal is voluntary. You personally decide whether to store entries in the contact journal. In this respect, you are also responsible for what you record. For this reason, we kindly ask you to respect the privacy of the people you include in your contact journal. You should not share your entries with third parties or via insecure communication channels. The competent public health office will tell you what information it needs from you for contact tracing purposes, and how you can provide it.
</p>
<h1>
6. Why is your data processed?
......
......@@ -261,11 +261,9 @@
<h2>
d. Temas güncesindeki veriler
</h2>
<p>
Temas güncesine, hangi kişilerle ne zaman ve nerede karşılaştığınızı not ederseniz, bu bilgiler akıllı telefonunuzda şifrelenmiş halde saklanır. Temas güncesi kayıtları, yalnızca hatırlatma işlevi görür. RKI veya diğer kurumlar, temas güncesindeki kayıtlara erişemez. Temas güncesi, son 14 gün içindeki kişisel temaslarınızı takip etmenize yardımcı olabilir. Korona testiniz pozitif çıkarsa ve sağlık kurumu sizden temas takibinde yardım etmenizi rica ederse, sağlık kurumuna gerekli bilgileri hızlı bir şekilde aktarabilirsiniz.
<p>Temas güncesine, hangi kişilerle ne zaman ve nerede karşılaştığınızı not ederseniz, bu bilgiler akıllı telefonunuzda şifrelenmiş halde saklanır. Temas güncesi kayıtları, yalnızca hatırlatma işlevi görür. RKI veya diğer kurumlar, temas güncesindeki kayıtlara erişemez. Temas güncesi, son 14 gün içindeki kişisel temaslarınızı takip etmenize yardımcı olabilir. Korona testiniz pozitif çıkarsa ve sağlık kurumu sizden temas takibinde yardım etmenizi rica ederse, sağlık kurumuna gerekli bilgileri hızlı bir şekilde aktarabilirsiniz.
</p>
Temas güncesinin kullanılması isteğe bağlıdır. Veri girişlerinin temas güncesine nasıl kaydedileceğine siz karar verirsiniz. Bu açıdan veri girişlerinizden de siz sorumlusunuz. Dolayısıyla temas güncesine eklediğiniz kişilerin mahremiyetine lütfen saygı gösterin. Bu bilgiler, üçüncü taraflara aktarılmamalı ve güvenli olmayan iletişim kanalları üzerinden aktarımı yapılmamalıdır. Yetkili sağlık kurumu, temas bağlantılarınızı takip etmek isterse, sizden hangi bilgilere gerek duyduğunu ve sizin bunları nasıl sağlayacağınızı size söyleyecektir.
<p>
<p>Temas güncesinin kullanılması isteğe bağlıdır. Veri girişlerinin temas güncesine nasıl kaydedileceğine siz karar verirsiniz. Bu açıdan veri girişlerinizden de siz sorumlusunuz. Dolayısıyla temas güncesine eklediğiniz kişilerin mahremiyetine lütfen saygı gösterin. Bu bilgiler, üçüncü taraflara aktarılmamalı ve güvenli olmayan iletişim kanalları üzerinden aktarımı yapılmamalıdır. Yetkili sağlık kurumu, temas bağlantılarınızı takip etmek isterse, sizden hangi bilgilere gerek duyduğunu ve sizin bunları nasıl sağlayacağınızı size söyleyecektir.
</p>
<h1>
6. Verileriniz niçin işleniyor?
......
......@@ -76,7 +76,7 @@
License: Apache 2.0
<p>Component: Lottie<br/>
Licensor: Airbnb, Inc.<br/>
Website: http://airbnb.io/lottie<br/>
Website: https://github.com/airbnb/lottie-android<br/>
License: Apache 2.0
<hr/>
<p>Copyright (c) 2008-2020 Zetetic LLC
......
......@@ -47,6 +47,7 @@ class ContactDiaryCleanTask @Inject constructor(
override val executionTimeout: Duration = Duration.standardMinutes(9)
override val collisionBehavior: TaskFactory.Config.CollisionBehavior =
TaskFactory.Config.CollisionBehavior.SKIP_IF_SIBLING_RUNNING
override val errorHandling: TaskFactory.Config.ErrorHandling = TaskFactory.Config.ErrorHandling.SILENT
}
class Factory @Inject constructor(
......
......@@ -2,36 +2,12 @@ package de.rki.coronawarnapp.contactdiary.storage
import dagger.Module
import dagger.Provides
import de.rki.coronawarnapp.contactdiary.storage.dao.ContactDiaryLocationDao
import de.rki.coronawarnapp.contactdiary.storage.dao.ContactDiaryLocationVisitDao
import de.rki.coronawarnapp.contactdiary.storage.dao.ContactDiaryPersonDao
import de.rki.coronawarnapp.contactdiary.storage.dao.ContactDiaryPersonEncounterDao
import de.rki.coronawarnapp.contactdiary.storage.repo.ContactDiaryRepository
import de.rki.coronawarnapp.contactdiary.storage.repo.DefaultContactDiaryRepository
import javax.inject.Singleton
@Module
class ContactDiaryStorageModule {
@Singleton
@Provides
fun contactDiaryDatabase(contactDiaryDatabaseFactory: ContactDiaryDatabase.Factory): ContactDiaryDatabase =
contactDiaryDatabaseFactory.create()
@Provides
fun locationDao(contactDiaryDatabase: ContactDiaryDatabase): ContactDiaryLocationDao =
contactDiaryDatabase.locationDao()
@Provides
fun locationVisitDao(contactDiaryDatabase: ContactDiaryDatabase): ContactDiaryLocationVisitDao =
contactDiaryDatabase.locationVisitDao()
@Provides
fun personDao(contactDiaryDatabase: ContactDiaryDatabase): ContactDiaryPersonDao =
contactDiaryDatabase.personDao()
@Provides
fun personEncounterDao(contactDiaryDatabase: ContactDiaryDatabase): ContactDiaryPersonEncounterDao =
contactDiaryDatabase.personEncounterDao()
@Singleton
@Provides
......
......@@ -3,7 +3,7 @@ package de.rki.coronawarnapp.contactdiary.storage.dao
import kotlinx.coroutines.flow.Flow
interface BaseDao<in T, out U> {
suspend fun insert(entity: T)
suspend fun insert(entity: T): Long
suspend fun insert(entities: List<T>)
suspend fun update(entity: T)
suspend fun update(entities: List<T>)
......
......@@ -6,7 +6,7 @@ import androidx.room.Update
abstract class BaseRoomDao<T, U> : BaseDao<T, U> {
@Insert
abstract override suspend fun insert(entity: T)
abstract override suspend fun insert(entity: T): Long
@Insert
abstract override suspend fun insert(entities: List<T>)
......
......@@ -12,7 +12,7 @@ interface ContactDiaryRepository {
// Location
val locations: Flow<List<ContactDiaryLocation>>
suspend fun addLocation(contactDiaryLocation: ContactDiaryLocation)
suspend fun addLocation(contactDiaryLocation: ContactDiaryLocation): ContactDiaryLocation
suspend fun updateLocation(contactDiaryLocation: ContactDiaryLocation)
suspend fun deleteLocation(contactDiaryLocation: ContactDiaryLocation)
suspend fun deleteLocations(contactDiaryLocations: List<ContactDiaryLocation>)
......@@ -28,7 +28,7 @@ interface ContactDiaryRepository {
// Person
val people: Flow<List<ContactDiaryPerson>>
suspend fun addPerson(contactDiaryPerson: ContactDiaryPerson)
suspend fun addPerson(contactDiaryPerson: ContactDiaryPerson): ContactDiaryPerson
suspend fun updatePerson(contactDiaryPerson: ContactDiaryPerson)
suspend fun deletePerson(contactDiaryPerson: ContactDiaryPerson)
suspend fun deletePeople(contactDiaryPeople: List<ContactDiaryPerson>)
......@@ -41,4 +41,7 @@ interface ContactDiaryRepository {
suspend fun deletePersonEncounter(contactDiaryPersonEncounter: ContactDiaryPersonEncounter)
suspend fun deletePersonEncounters(contactDiaryPersonEncounters: List<ContactDiaryPersonEncounter>)
suspend fun deleteAllPersonEncounters()
// Clean
suspend fun clear()
}
......@@ -5,6 +5,7 @@ import de.rki.coronawarnapp.contactdiary.model.ContactDiaryLocationVisit
import de.rki.coronawarnapp.contactdiary.model.ContactDiaryPerson
import de.rki.coronawarnapp.contactdiary.model.ContactDiaryPersonEncounter
import de.rki.coronawarnapp.contactdiary.model.sortByNameAndIdASC
import de.rki.coronawarnapp.contactdiary.storage.ContactDiaryDatabase
import de.rki.coronawarnapp.contactdiary.storage.dao.ContactDiaryLocationDao
import de.rki.coronawarnapp.contactdiary.storage.dao.ContactDiaryLocationVisitDao
import de.rki.coronawarnapp.contactdiary.storage.dao.ContactDiaryPersonDao
......@@ -25,20 +26,36 @@ import javax.inject.Singleton
@Singleton
@Suppress("TooManyFunctions")
class DefaultContactDiaryRepository @Inject constructor(
private val contactDiaryLocationDao: ContactDiaryLocationDao,
private val contactDiaryLocationVisitDao: ContactDiaryLocationVisitDao,
private val contactDiaryPersonDao: ContactDiaryPersonDao,
private val contactDiaryPersonEncounterDao: ContactDiaryPersonEncounterDao
contactDiaryDatabaseFactory: ContactDiaryDatabase.Factory
) : ContactDiaryRepository {
private val contactDiaryDatabase: ContactDiaryDatabase by lazy {
contactDiaryDatabaseFactory.create()
}
private val contactDiaryLocationDao: ContactDiaryLocationDao by lazy {
contactDiaryDatabase.locationDao()
}
private val contactDiaryLocationVisitDao: ContactDiaryLocationVisitDao by lazy {
contactDiaryDatabase.locationVisitDao()
}
private val contactDiaryPersonDao: ContactDiaryPersonDao by lazy {
contactDiaryDatabase.personDao()
}
private val contactDiaryPersonEncounterDao: ContactDiaryPersonEncounterDao by lazy {
contactDiaryDatabase.personEncounterDao()
}
// Location
override val locations: Flow<List<ContactDiaryLocation>> = contactDiaryLocationDao
.allEntries()
.map { it.sortByNameAndIdASC() }
override val locations: Flow<List<ContactDiaryLocation>> by lazy {
contactDiaryLocationDao
.allEntries()
.map { it.sortByNameAndIdASC() }
}
override suspend fun addLocation(contactDiaryLocation: ContactDiaryLocation) {
override suspend fun addLocation(contactDiaryLocation: ContactDiaryLocation): ContactDiaryLocation {
Timber.d("Adding location $contactDiaryLocation")
contactDiaryLocationDao.insert(contactDiaryLocation.toContactDiaryLocationEntity())
val id = contactDiaryLocationDao.insert(contactDiaryLocation.toContactDiaryLocationEntity())
return contactDiaryLocationDao.entityForId(id)
}
override suspend fun updateLocation(contactDiaryLocation: ContactDiaryLocation) {
......@@ -74,10 +91,11 @@ class DefaultContactDiaryRepository @Inject constructor(
}
// Location visit
override val locationVisits: Flow<List<ContactDiaryLocationVisit>> =
override val locationVisits: Flow<List<ContactDiaryLocationVisit>> by lazy {
contactDiaryLocationVisitDao
.allEntries()
.map { it.toContactDiaryLocationVisitSortedList() }
}
override fun locationVisitsForDate(date: LocalDate): Flow<List<ContactDiaryLocationVisit>> =
contactDiaryLocationVisitDao
......@@ -115,13 +133,16 @@ class DefaultContactDiaryRepository @Inject constructor(
}
// Person
override val people: Flow<List<ContactDiaryPerson>> = contactDiaryPersonDao
.allEntries()
.map { it.sortByNameAndIdASC() }
override val people: Flow<List<ContactDiaryPerson>> by lazy {
contactDiaryPersonDao
.allEntries()
.map { it.sortByNameAndIdASC() }
}
override suspend fun addPerson(contactDiaryPerson: ContactDiaryPerson) {
override suspend fun addPerson(contactDiaryPerson: ContactDiaryPerson): ContactDiaryPerson {
Timber.d("Adding person $contactDiaryPerson")
contactDiaryPersonDao.insert(contactDiaryPerson.toContactDiaryPersonEntity())
val id = contactDiaryPersonDao.insert(contactDiaryPerson.toContactDiaryPersonEntity())
return contactDiaryPersonDao.entityForId(id)
}
override suspend fun updatePerson(contactDiaryPerson: ContactDiaryPerson) {
......@@ -157,10 +178,11 @@ class DefaultContactDiaryRepository @Inject constructor(
}
// Person encounter
override val personEncounters: Flow<List<ContactDiaryPersonEncounter>> =
override val personEncounters: Flow<List<ContactDiaryPersonEncounter>> by lazy {
contactDiaryPersonEncounterDao
.allEntries()
.map { it.toContactDiaryPersonEncounterSortedList() }
}
override fun personEncountersForDate(date: LocalDate): Flow<List<ContactDiaryPersonEncounter>> =
contactDiaryPersonEncounterDao
......@@ -204,4 +226,9 @@ class DefaultContactDiaryRepository @Inject constructor(
throw IllegalArgumentException("Entity has default id")
}
}
override suspend fun clear() {
Timber.d("Clearing contact diary database")
contactDiaryDatabase.clearAllTables()
}
}
......@@ -18,11 +18,6 @@ import javax.inject.Inject
* This activity holds all the contact diary fragments
*/
class ContactDiaryActivity : AppCompatActivity(), HasAndroidInjector {
companion object {
fun start(context: Context) {
context.startActivity(Intent(context, ContactDiaryActivity::class.java))
}
}
@Inject lateinit var settings: ContactDiarySettings
@Inject lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Any>
......@@ -59,4 +54,10 @@ class ContactDiaryActivity : AppCompatActivity(), HasAndroidInjector {
data
)
}
companion object {
fun start(context: Context) {
context.startActivity(Intent(context, ContactDiaryActivity::class.java))
}
}
}
......@@ -9,9 +9,7 @@ import javax.inject.Singleton
@Singleton
class ContactDiarySettings @Inject constructor(
@AppContext val context: Context
) {
private val prefs by lazy {
......
......@@ -4,10 +4,6 @@ import dagger.Module
import dagger.android.ContributesAndroidInjector
import de.rki.coronawarnapp.contactdiary.ui.day.ContactDiaryDayFragment
import de.rki.coronawarnapp.contactdiary.ui.day.ContactDiaryDayModule
import de.rki.coronawarnapp.contactdiary.ui.day.sheets.location.ContactDiaryLocationBottomSheetDialogFragment
import de.rki.coronawarnapp.contactdiary.ui.day.sheets.location.ContactDiaryLocationBottomSheetDialogModule
import de.rki.coronawarnapp.contactdiary.ui.day.sheets.person.ContactDiaryPersonBottomSheetDialogFragment
import de.rki.coronawarnapp.contactdiary.ui.day.sheets.person.ContactDiaryPersonBottomSheetDialogModule
import de.rki.coronawarnapp.contactdiary.ui.day.tabs.location.ContactDiaryLocationListFragment
import de.rki.coronawarnapp.contactdiary.ui.day.tabs.location.ContactDiaryLocationListModule
import de.rki.coronawarnapp.contactdiary.ui.day.tabs.person.ContactDiaryPersonListFragment
......@@ -17,13 +13,12 @@ import de.rki.coronawarnapp.contactdiary.ui.onboarding.ContactDiaryOnboardingFra
import de.rki.coronawarnapp.contactdiary.ui.onboarding.ContactDiaryOnboardingFragmentModule
import de.rki.coronawarnapp.contactdiary.ui.overview.ContactDiaryOverviewFragment
import de.rki.coronawarnapp.contactdiary.ui.overview.ContactDiaryOverviewFragmentModule
import de.rki.coronawarnapp.contactdiary.ui.sheets.location.ContactDiaryLocationBottomSheetDialogFragment
import de.rki.coronawarnapp.contactdiary.ui.sheets.location.ContactDiaryLocationBottomSheetDialogModule
import de.rki.coronawarnapp.contactdiary.ui.sheets.person.ContactDiaryPersonBottomSheetDialogFragment
import de.rki.coronawarnapp.contactdiary.ui.sheets.person.ContactDiaryPersonBottomSheetDialogModule
@Module
(
includes = [
ContactDiaryEditModule::class
]
)
@Module(includes = [ContactDiaryEditModule::class])
abstract class ContactDiaryUIModule {
@ContributesAndroidInjector(modules = [ContactDiaryDayModule::class])
abstract fun contactDiaryDayFragment(): ContactDiaryDayFragment
......
......@@ -70,11 +70,15 @@ class ContactDiaryDayFragment : Fragment(R.layout.contact_diary_day_fragment), A
ContactDiaryDayNavigationEvents.NavigateToOverviewFragment -> popBackStack()
ContactDiaryDayNavigationEvents.NavigateToAddPersonBottomSheet -> doNavigate(
ContactDiaryDayFragmentDirections
.actionContactDiaryDayFragmentToContactDiaryPersonBottomSheetDialogFragment()
.actionContactDiaryDayFragmentToContactDiaryPersonBottomSheetDialogFragment(
addedAt = navArgs.selectedDay
)
)
ContactDiaryDayNavigationEvents.NavigateToAddLocationBottomSheet -> doNavigate(
ContactDiaryDayFragmentDirections
.actionContactDiaryDayFragmentToContactDiaryLocationBottomSheetDialogFragment()
.actionContactDiaryDayFragmentToContactDiaryLocationBottomSheetDialogFragment(
addedAt = navArgs.selectedDay
)
)
}
}
......
......@@ -4,6 +4,7 @@ import androidx.lifecycle.asLiveData
import com.squareup.inject.assisted.Assisted
import com.squareup.inject.assisted.AssistedInject
import de.rki.coronawarnapp.contactdiary.ui.day.tabs.ContactDiaryDayTab
import de.rki.coronawarnapp.contactdiary.util.toFormattedDay
import de.rki.coronawarnapp.ui.SingleLiveEvent
import de.rki.coronawarnapp.util.coroutine.DispatcherProvider
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
......@@ -11,22 +12,17 @@ import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.map
import org.joda.time.LocalDate
import org.joda.time.format.DateTimeFormat
class ContactDiaryDayViewModel @AssistedInject constructor(
dispatcherProvider: DispatcherProvider,
@Assisted selectedDay: String
) : CWAViewModel(dispatcherProvider = dispatcherProvider) {
private val dateFormat by lazy {
DateTimeFormat.forPattern("EEEE, dd.MM.yy")
}
private val displayedDay = MutableStateFlow(LocalDate.parse(selectedDay))
val routeToScreen: SingleLiveEvent<ContactDiaryDayNavigationEvents> = SingleLiveEvent()
val uiState = displayedDay.map { day ->
UIState(dayText = day.toString(dateFormat))
UIState(dayText = day.toFormattedDay())
}.asLiveData()
fun onCreateButtonClicked(activeTab: ContactDiaryDayTab) {
......
......@@ -4,7 +4,7 @@ import android.view.ViewGroup
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.contactdiary.model.ContactDiaryLocation
import de.rki.coronawarnapp.contactdiary.util.SelectableItem
import de.rki.coronawarnapp.databinding.ContactDiaryLocationListLineBinding
import de.rki.coronawarnapp.databinding.ContactDiaryLocationListItemBinding
import de.rki.coronawarnapp.ui.lists.BaseAdapter
import de.rki.coronawarnapp.util.lists.BindableVH
import de.rki.coronawarnapp.util.lists.diffutil.AsyncDiffUtilAdapter
......@@ -34,11 +34,11 @@ class ContactDiaryLocationListAdapter(
class CachedLocationViewHolder(
parent: ViewGroup
) : BaseAdapter.VH(R.layout.contact_diary_location_list_line, parent),
BindableVH<SelectableItem<ContactDiaryLocation>, ContactDiaryLocationListLineBinding> {
override val viewBinding = lazy { ContactDiaryLocationListLineBinding.bind(itemView) }
) : BaseAdapter.VH(R.layout.contact_diary_location_list_item, parent),
BindableVH<SelectableItem<ContactDiaryLocation>, ContactDiaryLocationListItemBinding> {
override val viewBinding = lazy { ContactDiaryLocationListItemBinding.bind(itemView) }
override val onBindData: ContactDiaryLocationListLineBinding.(
override val onBindData: ContactDiaryLocationListItemBinding.(
key: SelectableItem<ContactDiaryLocation>
) -> Unit =
{
......
......@@ -7,9 +7,12 @@ import de.rki.coronawarnapp.contactdiary.model.ContactDiaryLocation
import de.rki.coronawarnapp.contactdiary.model.DefaultContactDiaryLocationVisit
import de.rki.coronawarnapp.contactdiary.storage.repo.ContactDiaryRepository
import de.rki.coronawarnapp.contactdiary.util.SelectableItem
import de.rki.coronawarnapp.exception.ExceptionCategory
import de.rki.coronawarnapp.exception.reporting.report
import de.rki.coronawarnapp.util.coroutine.DispatcherProvider
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.first
import org.joda.time.LocalDate
......@@ -19,6 +22,9 @@ class ContactDiaryLocationListViewModel @AssistedInject constructor(
@Assisted selectedDay: String,
private val contactDiaryRepository: ContactDiaryRepository
) : CWAViewModel(dispatcherProvider = dispatcherProvider) {
private val coroutineExceptionHandler = CoroutineExceptionHandler { coroutineContext, ex ->
ex.report(ExceptionCategory.INTERNAL, TAG)
}
private val localDate = LocalDate.parse(selectedDay)
......@@ -35,7 +41,7 @@ class ContactDiaryLocationListViewModel @AssistedInject constructor(
}
}.asLiveData()
fun locationSelectionChanged(item: SelectableItem<ContactDiaryLocation>) = launch {
fun locationSelectionChanged(item: SelectableItem<ContactDiaryLocation>) = launch(coroutineExceptionHandler) {
if (!item.selected) {
contactDiaryRepository.addLocationVisit(
DefaultContactDiaryLocationVisit(
......@@ -50,6 +56,10 @@ class ContactDiaryLocationListViewModel @AssistedInject constructor(
}
}
companion object {
private val TAG = ContactDiaryLocationListViewModel::class.java.simpleName
}
@AssistedInject.Factory
interface Factory : CWAViewModelFactory<ContactDiaryLocationListViewModel> {
fun create(selectedDay: String): ContactDiaryLocationListViewModel
......
......@@ -4,7 +4,7 @@ import android.view.ViewGroup
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.contactdiary.model.ContactDiaryPerson
import de.rki.coronawarnapp.contactdiary.util.SelectableItem
import de.rki.coronawarnapp.databinding.ContactDiaryPersonListLineBinding
import de.rki.coronawarnapp.databinding.ContactDiaryPersonListItemBinding
import de.rki.coronawarnapp.ui.lists.BaseAdapter
import de.rki.coronawarnapp.util.lists.BindableVH
import de.rki.coronawarnapp.util.lists.diffutil.AsyncDiffUtilAdapter
......@@ -34,11 +34,11 @@ class ContactDiaryPersonListAdapter(
class CachedPersonViewHolder(
parent: ViewGroup
) : BaseAdapter.VH(R.layout.contact_diary_person_list_line, parent),
BindableVH<SelectableItem<ContactDiaryPerson>, ContactDiaryPersonListLineBinding> {
override val viewBinding = lazy { ContactDiaryPersonListLineBinding.bind(itemView) }
) : BaseAdapter.VH(R.layout.contact_diary_person_list_item, parent),
BindableVH<SelectableItem<ContactDiaryPerson>, ContactDiaryPersonListItemBinding> {
override val viewBinding = lazy { ContactDiaryPersonListItemBinding.bind(itemView) }
override val onBindData: ContactDiaryPersonListLineBinding.(
override val onBindData: ContactDiaryPersonListItemBinding.(
key: SelectableItem<ContactDiaryPerson>
) -> Unit = {
contactDiaryPersonListLineName.text = it.item.fullName
......
......@@ -7,9 +7,12 @@ import de.rki.coronawarnapp.contactdiary.model.ContactDiaryPerson
import de.rki.coronawarnapp.contactdiary.model.DefaultContactDiaryPersonEncounter
import de.rki.coronawarnapp.contactdiary.storage.repo.ContactDiaryRepository
import de.rki.coronawarnapp.contactdiary.util.SelectableItem
import de.rki.coronawarnapp.exception.ExceptionCategory
import de.rki.coronawarnapp.exception.reporting.report
import de.rki.coronawarnapp.util.coroutine.DispatcherProvider
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.first
import org.joda.time.LocalDate
......@@ -19,6 +22,9 @@ class ContactDiaryPersonListViewModel @AssistedInject constructor(
@Assisted selectedDay: String,
private val contactDiaryRepository: ContactDiaryRepository
) : CWAViewModel(dispatcherProvider = dispatcherProvider) {
private val coroutineExceptionHandler = CoroutineExceptionHandler { coroutineContext, ex ->
ex.report(ExceptionCategory.INTERNAL, TAG)
}
private val localDate = LocalDate.parse(selectedDay)
......@@ -35,7 +41,7 @@ class ContactDiaryPersonListViewModel @AssistedInject constructor(
}
}.asLiveData()
fun personSelectionChanged(item: SelectableItem<ContactDiaryPerson>) = launch {
fun personSelectionChanged(item: SelectableItem<ContactDiaryPerson>) = launch(coroutineExceptionHandler) {
if (!item.selected) {
contactDiaryRepository.addPersonEncounter(
DefaultContactDiaryPersonEncounter(
......@@ -50,6 +56,10 @@ class ContactDiaryPersonListViewModel @AssistedInject constructor(
}
}
companion object {
private val TAG = ContactDiaryPersonListViewModel::class.java.simpleName
}
@AssistedInject.Factory
interface Factory : CWAViewModelFactory<ContactDiaryPersonListViewModel> {
fun create(selectedDay: String): ContactDiaryPersonListViewModel
......
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