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