diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/ContactDiaryStorageModule.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/ContactDiaryStorageModule.kt index 8954837fc8f3dd5df846126f1dac1b3b0a4b1296..3a4f0d2102ea6c4d4af3e60440224723895f1481 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/ContactDiaryStorageModule.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/ContactDiaryStorageModule.kt @@ -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 diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/repo/ContactDiaryRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/repo/ContactDiaryRepository.kt index a75ebda35f2bac15096256b0db8450dfea1fd7ae..484dbbcb6e6bff43cecc6ee3300e1d7e1c3cc54c 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/repo/ContactDiaryRepository.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/repo/ContactDiaryRepository.kt @@ -41,4 +41,7 @@ interface ContactDiaryRepository { suspend fun deletePersonEncounter(contactDiaryPersonEncounter: ContactDiaryPersonEncounter) suspend fun deletePersonEncounters(contactDiaryPersonEncounters: List<ContactDiaryPersonEncounter>) suspend fun deleteAllPersonEncounters() + + // Clean + suspend fun clear() } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/repo/DefaultContactDiaryRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/repo/DefaultContactDiaryRepository.kt index 8c63ce180d69c792a05fb05bce6ff07b61d0f331..0d5c3052648f7f4ad2d465be962e3931577ab554 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/repo/DefaultContactDiaryRepository.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/storage/repo/DefaultContactDiaryRepository.kt @@ -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,16 +26,31 @@ 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) { Timber.d("Adding location $contactDiaryLocation") @@ -74,10 +90,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,9 +132,11 @@ 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) { Timber.d("Adding person $contactDiaryPerson") @@ -157,10 +176,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 +224,9 @@ class DefaultContactDiaryRepository @Inject constructor( throw IllegalArgumentException("Entity has default id") } } + + override suspend fun clear() { + Timber.d("Clearing contact diary database") + contactDiaryDatabase.clearAllTables() + } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/ContactDiaryActivity.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/ContactDiaryActivity.kt index 189cdf62a134b0d08ee8e0d9275715d4c4557063..d0529b41e9afaeebcb6b169b6869596481a2595e 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/ContactDiaryActivity.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/ContactDiaryActivity.kt @@ -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)) + } + } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/ContactDiarySettings.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/ContactDiarySettings.kt index 730b20bf1083e902e46313e0a7e3149e1a5fd5d3..a7b81a1d343baa3996baaea86c11825fd64d44af 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/ContactDiarySettings.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/ContactDiarySettings.kt @@ -9,9 +9,7 @@ import javax.inject.Singleton @Singleton class ContactDiarySettings @Inject constructor( - @AppContext val context: Context - ) { private val prefs by lazy { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/ContactDiaryDayViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/ContactDiaryDayViewModel.kt index dfe45bf08c0fddc5f5f6338359938ca96fa94926..55f7071c94a9709bcfbdec01e6372b573677e89d 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/ContactDiaryDayViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/day/ContactDiaryDayViewModel.kt @@ -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) { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/adapter/ContactDiaryOverviewAdapter.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/adapter/ContactDiaryOverviewAdapter.kt index bd54f8b7015c866a115fda20d904bc6eae0073c3..4905fc535dfa615d674f817361658210e116f0d0 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/adapter/ContactDiaryOverviewAdapter.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/ui/overview/adapter/ContactDiaryOverviewAdapter.kt @@ -4,8 +4,8 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView +import de.rki.coronawarnapp.contactdiary.util.toFormattedDay import de.rki.coronawarnapp.databinding.IncludeContactDiaryOverviewItemBinding -import java.util.Locale class ContactDiaryOverviewAdapter(private val onItemSelectionListener: (ListItem) -> Unit) : RecyclerView.Adapter<ContactDiaryOverviewAdapter.OverviewElementHolder>() { @@ -47,7 +47,7 @@ class ContactDiaryOverviewAdapter(private val onItemSelectionListener: (ListItem onElementSelectionListener: (ListItem) -> Unit ) { viewDataBinding.contactDiaryOverviewElementName.text = - item.date.toString("EEEE, dd.MM.yyyy", Locale.getDefault()) + item.date.toFormattedDay() viewDataBinding.contactDiaryOverviewElementBody.setOnClickListener { onElementSelectionListener(item) } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/util/ContactDiaryExtensions.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/util/ContactDiaryExtensions.kt index 08be2ecedc7134df94b7d52b8feb2c58ae6f3862..6ceec8c3a4a72f82cc53afa2ef67891bf35e8006 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/util/ContactDiaryExtensions.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/contactdiary/util/ContactDiaryExtensions.kt @@ -5,6 +5,8 @@ import android.view.inputmethod.InputMethodManager import android.widget.EditText import androidx.fragment.app.Fragment import androidx.viewpager2.widget.ViewPager2 +import org.joda.time.LocalDate +import java.util.Locale fun ViewPager2.registerOnPageChangeCallback(cb: (position: Int) -> Unit) { this.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { @@ -14,6 +16,9 @@ fun ViewPager2.registerOnPageChangeCallback(cb: (position: Int) -> Unit) { }) } +// According to tech spec german locale only +fun LocalDate.toFormattedDay(): String = toString("EEEE, dd.MM.yy", Locale.GERMAN) + fun EditText.showKeyboard() = post { if (requestFocus()) context.inputMethodManager.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT) } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/DataReset.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/DataReset.kt index 318368ebf5f76390110d8a3212f17a99ba3efb0e..e5beb2512c66b84ace8b4fab61d447f74dcb5f05 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/DataReset.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/DataReset.kt @@ -22,7 +22,7 @@ package de.rki.coronawarnapp.util import android.annotation.SuppressLint import android.content.Context import de.rki.coronawarnapp.appconfig.AppConfigProvider -import de.rki.coronawarnapp.contactdiary.storage.ContactDiaryDatabase +import de.rki.coronawarnapp.contactdiary.storage.repo.ContactDiaryRepository import de.rki.coronawarnapp.contactdiary.ui.ContactDiarySettings import de.rki.coronawarnapp.diagnosiskeys.download.DownloadDiagnosisKeysSettings import de.rki.coronawarnapp.diagnosiskeys.storage.KeyCacheRepository @@ -51,7 +51,7 @@ class DataReset @Inject constructor( private val exposureDetectionTracker: ExposureDetectionTracker, private val downloadDiagnosisKeysSettings: DownloadDiagnosisKeysSettings, private val riskLevelStorage: RiskLevelStorage, - private val contactDiaryDatabase: ContactDiaryDatabase, + private val contactDiaryRepository: ContactDiaryRepository, private var contactDiarySettings: ContactDiarySettings ) { @@ -81,7 +81,7 @@ class DataReset @Inject constructor( contactDiarySettings.clear() // Clear contact diary database - contactDiaryDatabase.clearAllTables() + contactDiaryRepository.clear() Timber.w("CWA LOCAL DATA DELETION COMPLETED.") }