Skip to content
Snippets Groups Projects
Unverified Commit 9428ce5e authored by Kolya Opahle's avatar Kolya Opahle Committed by GitHub
Browse files

Contact Diary - Day edit screen (EXPOSUREAPP-4156) (#1833)


* Made ContactDiaryActivity launchable, also added the first set of Implementations for the day editor view and tabs

Signed-off-by: default avatarKolya Opahle <k.opahle@sap.com>

* Switched View Model to publish a single UIState data class

Signed-off-by: default avatarKolya Opahle <k.opahle@sap.com>

* Added run configuration to launch contact diary activity

Signed-off-by: default avatarKolya Opahle <k.opahle@sap.com>

* linting

Signed-off-by: default avatarKolya Opahle <k.opahle@sap.com>

* linting

Signed-off-by: default avatarKolya Opahle <k.opahle@sap.com>

* Added RecyclerViews for person and place tabs

Signed-off-by: default avatarKolya Opahle <k.opahle@sap.com>

* linting

Signed-off-by: default avatarKolya Opahle <k.opahle@sap.com>

* Renamed Place to Location

Signed-off-by: default avatarKolya Opahle <k.opahle@sap.com>

* Added background for empty location list

Signed-off-by: default avatarKolya Opahle <k.opahle@sap.com>

* Added background for empty people list
Added dummy code to add person/location to repo

Signed-off-by: default avatarKolya Opahle <k.opahle@sap.com>

* Moved day edit tabs to their own subpackage
Added Resources to tab configuration instead of plain text

Signed-off-by: default avatarKolya Opahle <k.opahle@sap.com>

* linting

Signed-off-by: default avatarKolya Opahle <k.opahle@sap.com>

* Added night mode illustrations

Signed-off-by: default avatarKolya Opahle <k.opahle@sap.com>

* Added ability to select person / place (hacky)

Signed-off-by: default avatarKolya Opahle <k.opahle@sap.com>

* Added DispatcherProvider injection to viewmodels

Signed-off-by: default avatarKolya Opahle <k.opahle@sap.com>

* Updated dawables to match new design

Signed-off-by: default avatarKolya Opahle <k.opahle@sap.com>

* moved layout manager assignment into the layout files

Signed-off-by: default avatarKolya Opahle <k.opahle@sap.com>

* Migrated Day edit screens to finished room impl

Signed-off-by: default avatarKolya Opahle <k.opahle@sap.com>

* Added bottom sheets for person and location creation

Signed-off-by: default avatarKolya Opahle <k.opahle@sap.com>

* linting

Signed-off-by: default avatarKolya Opahle <k.opahle@sap.com>

* Migrated Bottom Sheets to finished room impl

Signed-off-by: default avatarKolya Opahle <k.opahle@sap.com>

* Added input size validation for person and location bottom sheet Changed date nav arg to string from long Updated layout of location and person list items

* linting

* Removed launch helpers as home fragment card is now introduced

* Separated the Contact Diary UI and Storage Modules to allow for more specific dependency graphs

* Moved Contact Diary Dagger Modules into own root module

* Moved most of the tab logic out of the view model into the fragment

* Picking up some merge slack

* Switched contact diary day view navigation to navigation events

* Cleaning up the onboarding fragment

* Cleaning up the overview fragment

* adding navigation to day fragment to overview fragment

* linting

* linting

* Fixed contact diary theming

* Changed tabs to sealed classes

Co-authored-by: default avatarMatthias Urhahn <matthias.urhahn@sap.com>
parent 0b242450
No related branches found
No related tags found
No related merge requests found
Showing
with 435 additions and 30 deletions
......@@ -80,7 +80,7 @@
android:name=".contactdiary.ui.ContactDiaryActivity"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
android:theme="@style/AppTheme.ContactDiary" />
</application>
......
package de.rki.coronawarnapp.contactdiary
import dagger.Module
import de.rki.coronawarnapp.contactdiary.storage.ContactDiaryStorageModule
@Module(
includes = [ContactDiaryStorageModule::class]
)
class ContactDiaryModule
package de.rki.coronawarnapp.contactdiary
import dagger.Module
import dagger.android.ContributesAndroidInjector
import de.rki.coronawarnapp.contactdiary.storage.ContactDiaryStorageModule
import de.rki.coronawarnapp.contactdiary.ui.ContactDiaryActivity
import de.rki.coronawarnapp.contactdiary.ui.ContactDiaryUIModule
@Module(
includes = [
ContactDiaryStorageModule::class
]
)
abstract class ContactDiaryRootModule {
@ContributesAndroidInjector(modules = [ContactDiaryUIModule::class])
abstract fun contactDiaryActivity(): ContactDiaryActivity
}
package de.rki.coronawarnapp.contactdiary.model
interface ContactDiaryLocation {
import de.rki.coronawarnapp.util.lists.HasStableId
interface ContactDiaryLocation : HasStableId {
val locationId: Long
var locationName: String
}
......
package de.rki.coronawarnapp.contactdiary.model
interface ContactDiaryPerson {
import de.rki.coronawarnapp.util.lists.HasStableId
interface ContactDiaryPerson : HasStableId {
val personId: Long
var fullName: String
}
......
package de.rki.coronawarnapp.contactdiary.model
data class DefaultContactDiaryLocation(
override val locationId: Long = 0L,
override var locationName: String
) : ContactDiaryLocation
package de.rki.coronawarnapp.contactdiary.model
data class DefaultContactDiaryPerson(
override val personId: Long = 0L,
override var fullName: String
) : ContactDiaryPerson
......@@ -9,7 +9,10 @@ import de.rki.coronawarnapp.contactdiary.model.ContactDiaryLocation
data class ContactDiaryLocationEntity(
@PrimaryKey(autoGenerate = true) @ColumnInfo(name = "locationId") override val locationId: Long = 0L,
@ColumnInfo(name = "locationName") override var locationName: String
) : ContactDiaryLocation
) : ContactDiaryLocation {
override val stableId: Long
get() = locationId
}
fun ContactDiaryLocation.toContactDiaryLocationEntity(): ContactDiaryLocationEntity =
ContactDiaryLocationEntity(this.locationId, this.locationName)
......@@ -9,7 +9,10 @@ import de.rki.coronawarnapp.contactdiary.model.ContactDiaryPerson
data class ContactDiaryPersonEntity(
@PrimaryKey(autoGenerate = true) @ColumnInfo(name = "personId") override val personId: Long = 0L,
@ColumnInfo(name = "fullName") override var fullName: String
) : ContactDiaryPerson
) : ContactDiaryPerson {
override val stableId: Long
get() = personId
}
fun ContactDiaryPerson.toContactDiaryPersonEntity(): ContactDiaryPersonEntity =
ContactDiaryPersonEntity(this.personId, this.fullName)
......@@ -85,10 +85,8 @@ class DefaultContactDiaryRepository @Inject constructor(
override suspend fun addLocationVisit(contactDiaryLocationVisit: ContactDiaryLocationVisit) {
Timber.d("Adding location visit $contactDiaryLocationVisit")
executeWhenIdNotDefault(contactDiaryLocationVisit.id) {
val contactDiaryLocationVisitEntity = contactDiaryLocationVisit.toContactDiaryLocationVisitEntity()
contactDiaryLocationVisitDao.insert(contactDiaryLocationVisitEntity)
}
val contactDiaryLocationVisitEntity = contactDiaryLocationVisit.toContactDiaryLocationVisitEntity()
contactDiaryLocationVisitDao.insert(contactDiaryLocationVisitEntity)
}
override suspend fun deleteLocationVisit(contactDiaryLocationVisit: ContactDiaryLocationVisit) {
......
......@@ -2,13 +2,38 @@ package de.rki.coronawarnapp.contactdiary.ui
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
import de.rki.coronawarnapp.contactdiary.ui.day.tabs.person.ContactDiaryPersonListModule
import de.rki.coronawarnapp.contactdiary.ui.onboarding.ContactDiaryOnboardingFragment
import de.rki.coronawarnapp.contactdiary.ui.onboarding.ContactDiaryOnboardingFragmentModule
import de.rki.coronawarnapp.contactdiary.ui.overview.ContactDiaryOverviewFragment
import de.rki.coronawarnapp.contactdiary.ui.overview.ContactDiaryOverviewFragmentModule
@Module
abstract class ContactDiaryModule {
abstract class ContactDiaryUIModule {
@ContributesAndroidInjector(modules = [ContactDiaryDayModule::class])
abstract fun contactDiaryDayFragment(): ContactDiaryDayFragment
@ContributesAndroidInjector(modules = [ContactDiaryPersonListModule::class])
abstract fun contactDiaryPersonListFragment(): ContactDiaryPersonListFragment
@ContributesAndroidInjector(modules = [ContactDiaryLocationListModule::class])
abstract fun contactDiaryLocationListFragment(): ContactDiaryLocationListFragment
@ContributesAndroidInjector(modules = [ContactDiaryPersonBottomSheetDialogModule::class])
abstract fun contactDiaryPersonBottomSheetDialogFragment(): ContactDiaryPersonBottomSheetDialogFragment
@ContributesAndroidInjector(modules = [ContactDiaryLocationBottomSheetDialogModule::class])
abstract fun contactDiaryLocationBottomSheetDialogFragment(): ContactDiaryLocationBottomSheetDialogFragment
@ContributesAndroidInjector(modules = [ContactDiaryOnboardingFragmentModule::class])
abstract fun contactDiaryOnboardingFragment(): ContactDiaryOnboardingFragment
......
package de.rki.coronawarnapp.contactdiary.ui.day
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.navArgs
import com.google.android.material.tabs.TabLayoutMediator
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.contactdiary.ui.day.tabs.ContactDiaryDayFragmentsAdapter
import de.rki.coronawarnapp.contactdiary.ui.day.tabs.ContactDiaryDayTab
import de.rki.coronawarnapp.contactdiary.util.registerOnPageChangeCallback
import de.rki.coronawarnapp.databinding.ContactDiaryDayFragmentBinding
import de.rki.coronawarnapp.util.di.AutoInject
import de.rki.coronawarnapp.util.ui.doNavigate
import de.rki.coronawarnapp.util.ui.observe2
import de.rki.coronawarnapp.util.ui.popBackStack
import de.rki.coronawarnapp.util.ui.viewBindingLazy
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider
import de.rki.coronawarnapp.util.viewmodel.cwaViewModelsAssisted
import javax.inject.Inject
class ContactDiaryDayFragment : Fragment(R.layout.contact_diary_day_fragment), AutoInject {
private val binding: ContactDiaryDayFragmentBinding by viewBindingLazy()
private val navArgs by navArgs<ContactDiaryDayFragmentArgs>()
@Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory
private val viewModel: ContactDiaryDayViewModel by cwaViewModelsAssisted(
factoryProducer = { viewModelFactory },
constructorCall = { factory, _ ->
factory as ContactDiaryDayViewModel.Factory
factory.create(navArgs.selectedDay)
}
)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val contactDiaryTabs = listOf(ContactDiaryDayTab.PersonTab, ContactDiaryDayTab.LocationTab)
val adapter = ContactDiaryDayFragmentsAdapter(this, contactDiaryTabs, navArgs.selectedDay)
binding.contactDiaryDayViewPager.adapter = adapter
TabLayoutMediator(binding.contactDiaryDayTabLayout, binding.contactDiaryDayViewPager) { tab, position ->
val tabSource = adapter.tabs[position]
tab.setText(tabSource.tabNameResource)
}.attach()
binding.apply {
contactDiaryDayViewPager.registerOnPageChangeCallback {
binding.contactDiaryDayFab.setText(adapter.tabs[it].fabTextResource)
}
contactDiaryDayFab.setOnClickListener {
viewModel.onCreateButtonClicked(adapter.tabs[contactDiaryDayTabLayout.selectedTabPosition])
}
contactDiaryDayHeader.headerButtonBack.buttonIcon.setOnClickListener {
viewModel.onBackPressed()
}
}
viewModel.uiState.observe2(this) {
binding.contactDiaryDayHeader.title = it.dayText
}
viewModel.routeToScreen.observe2(this) {
when (it) {
ContactDiaryDayNavigationEvents.NavigateToOverviewFragment -> popBackStack()
ContactDiaryDayNavigationEvents.NavigateToAddPersonBottomSheet -> doNavigate(
ContactDiaryDayFragmentDirections
.actionContactDiaryDayFragmentToContactDiaryPersonBottomSheetDialogFragment()
)
ContactDiaryDayNavigationEvents.NavigateToAddLocationBottomSheet -> doNavigate(
ContactDiaryDayFragmentDirections
.actionContactDiaryDayFragmentToContactDiaryLocationBottomSheetDialogFragment()
)
}
}
}
}
package de.rki.coronawarnapp.contactdiary.ui.day
import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoMap
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelKey
@Module
abstract class ContactDiaryDayModule {
@Binds
@IntoMap
@CWAViewModelKey(ContactDiaryDayViewModel::class)
abstract fun contactDiaryDayFragment(
factory: ContactDiaryDayViewModel.Factory
): CWAViewModelFactory<out CWAViewModel>
}
package de.rki.coronawarnapp.contactdiary.ui.day
sealed class ContactDiaryDayNavigationEvents {
object NavigateToOverviewFragment : ContactDiaryDayNavigationEvents()
object NavigateToAddPersonBottomSheet : ContactDiaryDayNavigationEvents()
object NavigateToAddLocationBottomSheet : ContactDiaryDayNavigationEvents()
}
package de.rki.coronawarnapp.contactdiary.ui.day
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.ui.SingleLiveEvent
import de.rki.coronawarnapp.util.coroutine.DispatcherProvider
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
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))
}.asLiveData()
fun onCreateButtonClicked(activeTab: ContactDiaryDayTab) {
when (activeTab) {
ContactDiaryDayTab.LocationTab -> routeToScreen
.postValue(ContactDiaryDayNavigationEvents.NavigateToAddLocationBottomSheet)
ContactDiaryDayTab.PersonTab -> routeToScreen
.postValue(ContactDiaryDayNavigationEvents.NavigateToAddPersonBottomSheet)
}
}
fun onBackPressed() {
routeToScreen.postValue(ContactDiaryDayNavigationEvents.NavigateToOverviewFragment)
}
data class UIState(
val dayText: String
)
@AssistedInject.Factory
interface Factory : CWAViewModelFactory<ContactDiaryDayViewModel> {
fun create(selectedDay: String): ContactDiaryDayViewModel
}
}
package de.rki.coronawarnapp.contactdiary.ui.day.sheets.location
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.widget.doAfterTextChanged
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import de.rki.coronawarnapp.databinding.ContactDiaryLocationBottomSheetFragmentBinding
import de.rki.coronawarnapp.util.di.AutoInject
import de.rki.coronawarnapp.util.ui.observe2
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider
import de.rki.coronawarnapp.util.viewmodel.cwaViewModels
import javax.inject.Inject
class ContactDiaryLocationBottomSheetDialogFragment : BottomSheetDialogFragment(), AutoInject {
private var _binding: ContactDiaryLocationBottomSheetFragmentBinding? = null
private val binding get() = _binding!!
@Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory
private val viewModel: ContactDiaryLocationBottomSheetDialogViewModel by cwaViewModels { viewModelFactory }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
_binding = ContactDiaryLocationBottomSheetFragmentBinding.inflate(inflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.contactDiaryLocationBottomSheetCloseButton.buttonIcon.setOnClickListener {
viewModel.closePressed()
}
binding.contactDiaryLocationBottomSheetSaveButton.setOnClickListener {
viewModel.saveLocation()
}
binding.contactDiaryLocationBottomSheetTextInputEditText.doAfterTextChanged {
viewModel.textChanged(it.toString())
}
viewModel.shouldClose.observe2(this) {
dismiss()
}
viewModel.isValid.observe2(this) {
binding.contactDiaryLocationBottomSheetTextInputLayout.isErrorEnabled = it
binding.contactDiaryLocationBottomSheetSaveButton.isEnabled = it
}
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
package de.rki.coronawarnapp.contactdiary.ui.onboarding
package de.rki.coronawarnapp.contactdiary.ui.day.sheets.location
import dagger.Binds
import dagger.Module
import dagger.android.ContributesAndroidInjector
import dagger.multibindings.IntoMap
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelKey
@Module
abstract class ContactDiaryOnboardingFragmentModul {
abstract class ContactDiaryLocationBottomSheetDialogModule {
@Binds
@IntoMap
@CWAViewModelKey(ContactDiaryOnboardingFragmentViewModel::class)
abstract fun contactDiaryOnboardingFragmentVM(
factory: ContactDiaryOnboardingFragmentViewModel.Factory
@CWAViewModelKey(ContactDiaryLocationBottomSheetDialogViewModel::class)
abstract fun contactDiaryLocationBottomSheetDialogFragment(
factory: ContactDiaryLocationBottomSheetDialogViewModel.Factory
): CWAViewModelFactory<out CWAViewModel>
@ContributesAndroidInjector
abstract fun contactDiaryOnboardingFragmentVM(): ContactDiaryOnboardingFragment
}
package de.rki.coronawarnapp.contactdiary.ui.day.sheets.location
import androidx.lifecycle.asLiveData
import com.squareup.inject.assisted.AssistedInject
import de.rki.coronawarnapp.contactdiary.storage.entity.ContactDiaryLocationEntity
import de.rki.coronawarnapp.contactdiary.storage.repo.ContactDiaryRepository
import de.rki.coronawarnapp.ui.SingleLiveEvent
import de.rki.coronawarnapp.util.coroutine.DispatcherProvider
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.map
class ContactDiaryLocationBottomSheetDialogViewModel @AssistedInject constructor(
dispatcherProvider: DispatcherProvider,
private val contactDiaryRepository: ContactDiaryRepository
) : CWAViewModel(dispatcherProvider = dispatcherProvider) {
private val text = MutableStateFlow("")
val isValid = text.map {
it.isNotEmpty() && it.length <= MAX_LOCATION_NAME_LENGTH
}.asLiveData()
val shouldClose = SingleLiveEvent<Unit>()
fun textChanged(locationName: String) {
text.value = locationName
}
fun saveLocation() = launch {
contactDiaryRepository.addLocation(
ContactDiaryLocationEntity(
locationName = text.value.take(MAX_LOCATION_NAME_LENGTH)
)
)
shouldClose.postValue(null)
}
fun closePressed() {
shouldClose.postValue(null)
}
companion object {
private const val MAX_LOCATION_NAME_LENGTH = 250
}
@AssistedInject.Factory
interface Factory : SimpleCWAViewModelFactory<ContactDiaryLocationBottomSheetDialogViewModel>
}
package de.rki.coronawarnapp.contactdiary.ui.day.sheets.person
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.widget.doAfterTextChanged
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import de.rki.coronawarnapp.databinding.ContactDiaryPersonBottomSheetFragmentBinding
import de.rki.coronawarnapp.util.di.AutoInject
import de.rki.coronawarnapp.util.ui.observe2
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider
import de.rki.coronawarnapp.util.viewmodel.cwaViewModels
import javax.inject.Inject
class ContactDiaryPersonBottomSheetDialogFragment : BottomSheetDialogFragment(), AutoInject {
private var _binding: ContactDiaryPersonBottomSheetFragmentBinding? = null
private val binding get() = _binding!!
@Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory
private val viewModel: ContactDiaryPersonBottomSheetDialogViewModel by cwaViewModels { viewModelFactory }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
_binding = ContactDiaryPersonBottomSheetFragmentBinding.inflate(inflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.contactDiaryPersonBottomSheetCloseButton.buttonIcon.setOnClickListener {
viewModel.closePressed()
}
binding.contactDiaryPersonBottomSheetSaveButton.setOnClickListener {
viewModel.savePerson()
}
binding.contactDiaryPersonBottomSheetTextInputEditText.doAfterTextChanged {
viewModel.textChanged(it.toString())
}
viewModel.shouldClose.observe2(this) {
dismiss()
}
viewModel.isValid.observe2(this) {
binding.contactDiaryPersonBottomSheetTextInputLayout.isErrorEnabled = it
binding.contactDiaryPersonBottomSheetSaveButton.isEnabled = it
}
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
package de.rki.coronawarnapp.contactdiary.ui.day.sheets.person
import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoMap
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelKey
@Module
abstract class ContactDiaryPersonBottomSheetDialogModule {
@Binds
@IntoMap
@CWAViewModelKey(ContactDiaryPersonBottomSheetDialogViewModel::class)
abstract fun contactDiaryPersonBottomSheetDialogFragment(
factory: ContactDiaryPersonBottomSheetDialogViewModel.Factory
): CWAViewModelFactory<out CWAViewModel>
}
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