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 482 additions and 32 deletions
package de.rki.coronawarnapp.contactdiary.ui.day.sheets.person
import androidx.lifecycle.asLiveData
import com.squareup.inject.assisted.AssistedInject
import de.rki.coronawarnapp.contactdiary.storage.entity.ContactDiaryPersonEntity
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 ContactDiaryPersonBottomSheetDialogViewModel @AssistedInject constructor(
dispatcherProvider: DispatcherProvider,
private val contactDiaryRepository: ContactDiaryRepository
) : CWAViewModel(dispatcherProvider = dispatcherProvider) {
private val text = MutableStateFlow("")
val isValid = text.map {
it.isNotEmpty() && it.length <= MAX_PERSON_NAME_LENGTH
}.asLiveData()
val shouldClose = SingleLiveEvent<Unit>()
fun textChanged(locationName: String) {
text.value = locationName
}
fun savePerson() = launch {
contactDiaryRepository.addPerson(
ContactDiaryPersonEntity(
fullName = text.value.take(MAX_PERSON_NAME_LENGTH)
)
)
shouldClose.postValue(null)
}
fun closePressed() {
shouldClose.postValue(null)
}
companion object {
private const val MAX_PERSON_NAME_LENGTH = 250
}
@AssistedInject.Factory
interface Factory : SimpleCWAViewModelFactory<ContactDiaryPersonBottomSheetDialogViewModel>
}
package de.rki.coronawarnapp.contactdiary.ui.day.tabs
import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter
class ContactDiaryDayFragmentsAdapter(
fragment: Fragment,
val tabs: List<ContactDiaryDayTab>,
private val day: String
) : FragmentStateAdapter(fragment) {
override fun getItemCount() = tabs.size
override fun createFragment(position: Int): Fragment = tabs[position].fragmentInstantiation(day)
}
package de.rki.coronawarnapp.contactdiary.ui.day.tabs
import androidx.fragment.app.Fragment
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.contactdiary.ui.day.tabs.location.ContactDiaryLocationListFragment
import de.rki.coronawarnapp.contactdiary.ui.day.tabs.location.ContactDiaryLocationListFragmentArgs
import de.rki.coronawarnapp.contactdiary.ui.day.tabs.person.ContactDiaryPersonListFragment
import de.rki.coronawarnapp.contactdiary.ui.day.tabs.person.ContactDiaryPersonListFragmentArgs
sealed class ContactDiaryDayTab(
val tabNameResource: Int,
val fabTextResource: Int,
val fragmentInstantiation: (day: String) -> Fragment
) {
object PersonTab : ContactDiaryDayTab(
R.string.contact_diary_day_person_tab_title,
R.string.contact_diary_day_person_fab_title,
{ day ->
ContactDiaryPersonListFragment().apply {
// Feels kind of hacky but i like the free typesafety for the args
arguments = ContactDiaryPersonListFragmentArgs(day).toBundle()
}
}
)
object LocationTab : ContactDiaryDayTab(
R.string.contact_diary_day_location_tab_title,
R.string.contact_diary_day_location_fab_title,
{ day ->
ContactDiaryLocationListFragment().apply {
// Feels kind of hacky but i like the free typesafety for the args
arguments = ContactDiaryLocationListFragmentArgs(day).toBundle()
}
}
)
}
package de.rki.coronawarnapp.contactdiary.ui.day.tabs.location
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.ui.lists.BaseAdapter
import de.rki.coronawarnapp.util.lists.BindableVH
import de.rki.coronawarnapp.util.lists.diffutil.AsyncDiffUtilAdapter
import de.rki.coronawarnapp.util.lists.diffutil.AsyncDiffer
class ContactDiaryLocationListAdapter(
private val onTappedCallback: (item: SelectableItem<ContactDiaryLocation>) -> Unit
) : BaseAdapter<ContactDiaryLocationListAdapter.CachedLocationViewHolder>(),
AsyncDiffUtilAdapter<SelectableItem<ContactDiaryLocation>> {
override val asyncDiffer: AsyncDiffer<SelectableItem<ContactDiaryLocation>> = AsyncDiffer(this)
override fun getItemCount(): Int = data.size
override fun getItemId(position: Int): Long = data[position].stableId
override fun onCreateBaseVH(parent: ViewGroup, viewType: Int): CachedLocationViewHolder =
CachedLocationViewHolder(parent)
override fun onBindBaseVH(holder: CachedLocationViewHolder, position: Int) {
val item = data[position]
holder.itemView.setOnClickListener {
onTappedCallback(item)
}
holder.bind(item)
}
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) }
override val onBindData: ContactDiaryLocationListLineBinding.(
key: SelectableItem<ContactDiaryLocation>
) -> Unit =
{
contactDiaryLocationListLineName.text = it.item.locationName
when (it.selected) {
true -> contactDiaryLocationListLineIcon.setImageResource(R.drawable.ic_selected)
false -> contactDiaryLocationListLineIcon.setImageResource(R.drawable.ic_unselected)
}
}
}
}
package de.rki.coronawarnapp.contactdiary.ui.day.tabs.location
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.navArgs
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.contactdiary.util.MarginRecyclerViewDecoration
import de.rki.coronawarnapp.databinding.ContactDiaryLocationListFragmentBinding
import de.rki.coronawarnapp.util.di.AutoInject
import de.rki.coronawarnapp.util.lists.diffutil.update
import de.rki.coronawarnapp.util.ui.observe2
import de.rki.coronawarnapp.util.ui.setInvisible
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 ContactDiaryLocationListFragment : Fragment(R.layout.contact_diary_location_list_fragment), AutoInject {
private val binding: ContactDiaryLocationListFragmentBinding by viewBindingLazy()
private val navArgs by navArgs<ContactDiaryLocationListFragmentArgs>()
@Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory
private val viewModel: ContactDiaryLocationListViewModel by cwaViewModelsAssisted(
factoryProducer = { viewModelFactory },
constructorCall = { factory, _ ->
factory as ContactDiaryLocationListViewModel.Factory
factory.create(navArgs.selectedDay)
}
)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val locationListAdapter = ContactDiaryLocationListAdapter {
viewModel.locationSelectionChanged(it)
}
binding.contactDiaryLocationListRecyclerView.apply {
adapter = locationListAdapter
addItemDecoration(
MarginRecyclerViewDecoration(
resources.getDimensionPixelSize(R.dimen.spacing_tiny)
)
)
}
viewModel.uiList.observe2(this) {
locationListAdapter.update(it)
binding.contactDiaryLocationListNoItemsGroup.setInvisible(it.isNotEmpty())
}
}
}
package de.rki.coronawarnapp.contactdiary.ui.day.tabs.location
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 ContactDiaryLocationListModule {
@Binds
@IntoMap
@CWAViewModelKey(ContactDiaryLocationListViewModel::class)
abstract fun contactDiaryLocationListFragment(
factory: ContactDiaryLocationListViewModel.Factory
): CWAViewModelFactory<out CWAViewModel>
}
package de.rki.coronawarnapp.contactdiary.ui.day.tabs.location
import androidx.lifecycle.asLiveData
import com.squareup.inject.assisted.Assisted
import com.squareup.inject.assisted.AssistedInject
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.util.coroutine.DispatcherProvider
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.first
import org.joda.time.LocalDate
class ContactDiaryLocationListViewModel @AssistedInject constructor(
dispatcherProvider: DispatcherProvider,
@Assisted selectedDay: String,
private val contactDiaryRepository: ContactDiaryRepository
) : CWAViewModel(dispatcherProvider = dispatcherProvider) {
private val localDate = LocalDate.parse(selectedDay)
private val dayElement = contactDiaryRepository.locationVisitsForDate(localDate)
private val selectableLocations = contactDiaryRepository.locations
val uiList = selectableLocations.combine(dayElement) { locations, dayElement ->
locations.map { contactDiaryLocation ->
if (dayElement.any { it.contactDiaryLocation.locationId == contactDiaryLocation.locationId }) {
SelectableItem(true, contactDiaryLocation)
} else {
SelectableItem(false, contactDiaryLocation)
}
}
}.asLiveData()
fun locationSelectionChanged(item: SelectableItem<ContactDiaryLocation>) = launch {
if (!item.selected) {
contactDiaryRepository.addLocationVisit(
DefaultContactDiaryLocationVisit(
date = localDate,
contactDiaryLocation = item.item
)
)
} else {
val visit = dayElement.first()
.find { it.contactDiaryLocation.locationId == item.item.locationId }
visit?.let { contactDiaryRepository.deleteLocationVisit(it) }
}
}
@AssistedInject.Factory
interface Factory : CWAViewModelFactory<ContactDiaryLocationListViewModel> {
fun create(selectedDay: String): ContactDiaryLocationListViewModel
}
}
package de.rki.coronawarnapp.contactdiary.ui.day.tabs.person
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.ui.lists.BaseAdapter
import de.rki.coronawarnapp.util.lists.BindableVH
import de.rki.coronawarnapp.util.lists.diffutil.AsyncDiffUtilAdapter
import de.rki.coronawarnapp.util.lists.diffutil.AsyncDiffer
class ContactDiaryPersonListAdapter(
private val onTappedCallback: (item: SelectableItem<ContactDiaryPerson>) -> Unit
) : BaseAdapter<ContactDiaryPersonListAdapter.CachedPersonViewHolder>(),
AsyncDiffUtilAdapter<SelectableItem<ContactDiaryPerson>> {
override val asyncDiffer: AsyncDiffer<SelectableItem<ContactDiaryPerson>> = AsyncDiffer(this)
override fun getItemCount(): Int = data.size
override fun getItemId(position: Int): Long = data[position].stableId
override fun onCreateBaseVH(parent: ViewGroup, viewType: Int): CachedPersonViewHolder =
CachedPersonViewHolder(parent)
override fun onBindBaseVH(holder: CachedPersonViewHolder, position: Int) {
val item = data[position]
holder.itemView.setOnClickListener {
onTappedCallback(item)
}
holder.bind(item)
}
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) }
override val onBindData: ContactDiaryPersonListLineBinding.(
key: SelectableItem<ContactDiaryPerson>
) -> Unit = {
contactDiaryPersonListLineName.text = it.item.fullName
when (it.selected) {
true -> contactDiaryPersonListLineIcon.setImageResource(R.drawable.ic_selected)
false -> contactDiaryPersonListLineIcon.setImageResource(R.drawable.ic_unselected)
}
}
}
}
package de.rki.coronawarnapp.contactdiary.ui.day.tabs.person
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.navArgs
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.contactdiary.util.MarginRecyclerViewDecoration
import de.rki.coronawarnapp.databinding.ContactDiaryPersonListFragmentBinding
import de.rki.coronawarnapp.util.di.AutoInject
import de.rki.coronawarnapp.util.lists.diffutil.update
import de.rki.coronawarnapp.util.ui.observe2
import de.rki.coronawarnapp.util.ui.setInvisible
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 ContactDiaryPersonListFragment : Fragment(R.layout.contact_diary_person_list_fragment), AutoInject {
private val binding: ContactDiaryPersonListFragmentBinding by viewBindingLazy()
private val navArgs by navArgs<ContactDiaryPersonListFragmentArgs>()
@Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory
private val viewModel: ContactDiaryPersonListViewModel by cwaViewModelsAssisted(
factoryProducer = { viewModelFactory },
constructorCall = { factory, _ ->
factory as ContactDiaryPersonListViewModel.Factory
factory.create(navArgs.selectedDay)
}
)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val personListAdapter = ContactDiaryPersonListAdapter {
viewModel.personSelectionChanged(it)
}
binding.contactDiaryPersonListRecyclerView.apply {
adapter = personListAdapter
addItemDecoration(
MarginRecyclerViewDecoration(
resources.getDimensionPixelSize(R.dimen.spacing_tiny)
)
)
}
viewModel.uiList.observe2(this) {
personListAdapter.update(it)
binding.contactDiaryPersonListNoItemsGroup.setInvisible(it.isNotEmpty())
}
}
}
package de.rki.coronawarnapp.contactdiary.ui.day.tabs.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 ContactDiaryPersonListModule {
@Binds
@IntoMap
@CWAViewModelKey(ContactDiaryPersonListViewModel::class)
abstract fun contactDiaryPersonListFragment(
factory: ContactDiaryPersonListViewModel.Factory
): CWAViewModelFactory<out CWAViewModel>
}
package de.rki.coronawarnapp.contactdiary.ui.day.tabs.person
import androidx.lifecycle.asLiveData
import com.squareup.inject.assisted.Assisted
import com.squareup.inject.assisted.AssistedInject
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.util.coroutine.DispatcherProvider
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.first
import org.joda.time.LocalDate
class ContactDiaryPersonListViewModel @AssistedInject constructor(
dispatcherProvider: DispatcherProvider,
@Assisted selectedDay: String,
private val contactDiaryRepository: ContactDiaryRepository
) : CWAViewModel(dispatcherProvider = dispatcherProvider) {
private val localDate = LocalDate.parse(selectedDay)
private val dayElement = contactDiaryRepository.personEncountersForDate(localDate)
private val selectablePersons = contactDiaryRepository.people
val uiList = selectablePersons.combine(dayElement) { persons, dayElement ->
persons.map { contactDiaryPerson ->
if (dayElement.any { it.contactDiaryPerson.personId == contactDiaryPerson.personId }) {
SelectableItem(true, contactDiaryPerson)
} else {
SelectableItem(false, contactDiaryPerson)
}
}
}.asLiveData()
fun personSelectionChanged(item: SelectableItem<ContactDiaryPerson>) = launch {
if (!item.selected) {
contactDiaryRepository.addPersonEncounter(
DefaultContactDiaryPersonEncounter(
date = localDate,
contactDiaryPerson = item.item
)
)
} else {
val visit = dayElement.first()
.find { it.contactDiaryPerson.personId == item.item.personId }
visit?.let { contactDiaryRepository.deletePersonEncounter(it) }
}
}
@AssistedInject.Factory
interface Factory : CWAViewModelFactory<ContactDiaryPersonListViewModel> {
fun create(selectedDay: String): ContactDiaryPersonListViewModel
}
}
......@@ -3,7 +3,6 @@ package de.rki.coronawarnapp.contactdiary.ui.onboarding
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import androidx.navigation.ActionOnlyNavDirections
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.contactdiary.ui.ContactDiaryActivity
import de.rki.coronawarnapp.databinding.ContactDiaryOnboardingFragmentBinding
......@@ -46,24 +45,18 @@ class ContactDiaryOnboardingFragment : Fragment(R.layout.contact_diary_onboardin
ContactDiaryOnboardingNavigationEvents.NavigateToPrivacyFragment -> {
doNavigate(
ActionOnlyNavDirections(
R.id.action_contactDiaryOnboardingFragment_to_contactDiaryInformationPrivacyFragment
)
ContactDiaryOnboardingFragmentDirections
.actionContactDiaryOnboardingFragmentToContactDiaryInformationPrivacyFragment()
)
}
ContactDiaryOnboardingNavigationEvents.NavigateToOverviewFragment -> {
doNavigate(
ActionOnlyNavDirections(
R.id.action_contactDiaryOnboardingFragment_to_contactDiaryOverviewFragment
)
ContactDiaryOnboardingFragmentDirections
.actionContactDiaryOnboardingFragmentToContactDiaryOverviewFragment()
)
}
}
}
}
override fun onResume() {
super.onResume()
}
}
......@@ -9,7 +9,6 @@ import de.rki.coronawarnapp.util.viewmodel.CWAViewModelKey
@Module
abstract class ContactDiaryOnboardingFragmentModule {
@Binds
@IntoMap
@CWAViewModelKey(ContactDiaryOnboardingFragmentViewModel::class)
......
package de.rki.coronawarnapp.contactdiary.ui.onboarding
sealed class ContactDiaryOnboardingNavigationEvents {
object NavigateToMainActivity : ContactDiaryOnboardingNavigationEvents()
object NavigateToPrivacyFragment : ContactDiaryOnboardingNavigationEvents()
object NavigateToOverviewFragment : ContactDiaryOnboardingNavigationEvents()
......
......@@ -2,12 +2,12 @@ package de.rki.coronawarnapp.contactdiary.ui.overview
import android.os.Bundle
import android.view.View
import android.widget.Toast
import androidx.fragment.app.Fragment
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.contactdiary.ui.overview.adapter.ContactDiaryOverviewAdapter
import de.rki.coronawarnapp.databinding.ContactDiaryOverviewFragmentBinding
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.viewBindingLazy
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider
......@@ -48,12 +48,10 @@ class ContactDiaryOverviewFragment : Fragment(R.layout.contact_diary_overview_fr
}
is ContactDiaryOverviewNavigationEvents.NavigateToContactDiaryDayFragment -> {
// TODO(Really navigate to ContactDiaryDayFragment once it is merged)
Toast.makeText(
requireContext(),
"Navigate to ContactDiaryDayFragment with date ${it.localDateString}",
Toast.LENGTH_SHORT
).show()
doNavigate(
ContactDiaryOverviewFragmentDirections
.actionContactDiaryOverviewFragmentToContactDiaryDayFragment(it.localDateString)
)
}
}
}
......
......@@ -2,7 +2,6 @@ package de.rki.coronawarnapp.contactdiary.ui.overview
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
......@@ -10,14 +9,10 @@ import de.rki.coronawarnapp.util.viewmodel.CWAViewModelKey
@Module
abstract class ContactDiaryOverviewFragmentModule {
@Binds
@IntoMap
@CWAViewModelKey(ContactDiaryOverviewViewModel::class)
abstract fun contactDiaryOverviewFragmentVM(
factory: ContactDiaryOverviewViewModel.Factory
): CWAViewModelFactory<out CWAViewModel>
@ContributesAndroidInjector
abstract fun contactDiaryOverviewFragmentVM(): ContactDiaryOverviewFragment
}
......@@ -3,8 +3,6 @@ package de.rki.coronawarnapp.contactdiary.ui.overview
import android.content.Context
import android.view.View
import android.widget.PopupMenu
import androidx.navigation.NavController
import androidx.navigation.fragment.findNavController
import de.rki.coronawarnapp.R
import javax.inject.Inject
......@@ -13,9 +11,6 @@ class ContactDiaryOverviewMenu @Inject constructor(
) {
private val context: Context = contactDiaryOverviewFragment.requireContext()
private val navController: NavController
get() = contactDiaryOverviewFragment.findNavController()
fun showMenuFor(view: View) = PopupMenu(context, view).apply {
inflate(R.menu.menu_contact_diary_overview)
setOnMenuItemClickListener {
......
......@@ -3,7 +3,6 @@ package de.rki.coronawarnapp.contactdiary.ui.overview
import org.joda.time.LocalDate
sealed class ContactDiaryOverviewNavigationEvents {
object NavigateToMainActivity : ContactDiaryOverviewNavigationEvents()
class NavigateToContactDiaryDayFragment(localDate: LocalDate) : ContactDiaryOverviewNavigationEvents() {
val localDateString = localDate.toString()
......
......@@ -18,7 +18,6 @@ import timber.log.Timber
class ContactDiaryOverviewViewModel @AssistedInject constructor(
contactDiaryRepository: ContactDiaryRepository
) : CWAViewModel() {
val routeToScreen: SingleLiveEvent<ContactDiaryOverviewNavigationEvents> = SingleLiveEvent()
private val dates = flowOf((0 until DAY_COUNT).map { LocalDate.now().minusDays(it) })
......
package de.rki.coronawarnapp.contactdiary.util
import androidx.viewpager2.widget.ViewPager2
fun ViewPager2.registerOnPageChangeCallback(cb: (position: Int) -> Unit) {
this.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
cb(position)
}
})
}
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