From a87b44dbb02c0fd8d3fd7508b13ad7f07e551525 Mon Sep 17 00:00:00 2001 From: BMItter <46747780+BMItter@users.noreply.github.com> Date: Fri, 18 Dec 2020 16:10:13 +0100 Subject: [PATCH] Code smells diary (EXPOSUREAPP-4152) (#1943) * move companions object to the end of ContactDiaryActivity * format clean * Init contact diary database lazily in repo, Added fun clear to contact diary repo, Use repo clear in data reset * Use unified string for date * Corrected date format * clean --- .../storage/ContactDiaryStorageModule.kt | 24 --------- .../storage/repo/ContactDiaryRepository.kt | 3 ++ .../repo/DefaultContactDiaryRepository.kt | 49 ++++++++++++++----- .../contactdiary/ui/ContactDiaryActivity.kt | 11 +++-- .../contactdiary/ui/ContactDiarySettings.kt | 2 - .../ui/day/ContactDiaryDayViewModel.kt | 8 +-- .../adapter/ContactDiaryOverviewAdapter.kt | 4 +- .../util/ContactDiaryExtensions.kt | 5 ++ .../de/rki/coronawarnapp/util/DataReset.kt | 6 +-- 9 files changed, 58 insertions(+), 54 deletions(-) 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 8954837fc..3a4f0d210 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 a75ebda35..484dbbcb6 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 8c63ce180..0d5c30526 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 189cdf62a..d0529b41e 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 730b20bf1..a7b81a1d3 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 dfe45bf08..55f7071c9 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 bd54f8b70..4905fc535 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 08be2eced..6ceec8c3a 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 318368ebf..e5beb2512 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.") } -- GitLab