Skip to content

Commit

Permalink
Spoilers settings UI tweaks
Browse files Browse the repository at this point in the history
  • Loading branch information
michaldrabik committed Jul 27, 2023
1 parent 86dc64f commit d527a61
Show file tree
Hide file tree
Showing 10 changed files with 202 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import android.os.Bundle
import android.view.View
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updatePadding
import androidx.fragment.app.setFragmentResultListener
import androidx.fragment.app.viewModels
import com.michaldrabik.common.Config.SHOW_PREMIUM
import com.michaldrabik.ui_base.BaseFragment
Expand All @@ -15,14 +16,28 @@ import com.michaldrabik.ui_base.utilities.extensions.onClick
import com.michaldrabik.ui_base.utilities.extensions.visibleIf
import com.michaldrabik.ui_base.utilities.viewBinding
import com.michaldrabik.ui_settings.databinding.FragmentSettingsBinding
import com.michaldrabik.ui_settings.sections.spoilers.SettingsSpoilersFragment
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class SettingsFragment : BaseFragment<SettingsViewModel>(R.layout.fragment_settings), OnTraktAuthorizeListener {

companion object {
const val REQUEST_SETTINGS = "REQUEST_SETTINGS"
}

override val viewModel by viewModels<SettingsViewModel>()
private val binding by viewBinding(FragmentSettingsBinding::bind)

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setFragmentResultListener(REQUEST_SETTINGS) { _, _ ->
childFragmentManager.fragments.forEach { fragment ->
(fragment as? SettingsSpoilersFragment)?.refreshSettings()
}
}
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupView()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.michaldrabik.ui_base.BaseFragment
import com.michaldrabik.ui_base.utilities.extensions.launchAndRepeatStarted
import com.michaldrabik.ui_base.utilities.extensions.navigateToSafe
import com.michaldrabik.ui_base.utilities.extensions.onClick
import com.michaldrabik.ui_base.utilities.extensions.visibleIf
import com.michaldrabik.ui_base.utilities.viewBinding
import com.michaldrabik.ui_settings.R
import com.michaldrabik.ui_settings.databinding.FragmentSettingsSpoilersBinding
Expand All @@ -24,6 +25,7 @@ class SettingsSpoilersFragment :
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupView()

launchAndRepeatStarted(
{ viewModel.uiState.collect { render(it) } },
doAfterLaunch = { viewModel.loadSettings() }
Expand All @@ -50,8 +52,13 @@ class SettingsSpoilersFragment :
private fun render(uiState: SettingsSpoilersUiState) {
uiState.run {
with(binding) {
settingsSpoilersShowsCheck.visibleIf(hasShowsSettingActive)
settingsSpoilersMoviesCheck.visibleIf(hasMoviesSettingActive)
settingsSpoilersEpisodesCheck.visibleIf(hasEpisodesSettingActive)
settingsSpoilersTapToRevealSwitch.isChecked = isTapToReveal
}
}
}

fun refreshSettings() = viewModel.loadSettings()
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.michaldrabik.ui_settings.sections.spoilers

data class SettingsSpoilersUiState(
val hasShowsSettingActive: Boolean = false,
val hasMoviesSettingActive: Boolean = false,
val hasEpisodesSettingActive: Boolean = false,
val isTapToReveal: Boolean = false,
)
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,24 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.michaldrabik.repository.settings.SettingsSpoilersRepository
import com.michaldrabik.ui_base.utilities.extensions.SUBSCRIBE_STOP_TIMEOUT
import com.michaldrabik.ui_settings.sections.spoilers.helpers.SettingsSpoilersHelper
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
import javax.inject.Inject

@HiltViewModel
class SettingsSpoilersViewModel @Inject constructor(
private val settingsRepository: SettingsSpoilersRepository
private val settingsRepository: SettingsSpoilersRepository,
private val spoilersHelper: SettingsSpoilersHelper
) : ViewModel() {

private val hasShowsSettingsActive = MutableStateFlow(false)
private val hasMoviesSettingsActive = MutableStateFlow(false)
private val hasEpisodesSettingsActive = MutableStateFlow(false)
private val tapToRevealState = MutableStateFlow(false)

fun loadSettings() {
Expand All @@ -25,25 +30,37 @@ class SettingsSpoilersViewModel @Inject constructor(
}
}

private fun refreshSettings() {
tapToRevealState.value = settingsRepository.isTapToReveal
}

fun setTapToReveal(enable: Boolean) {
viewModelScope.launch {
settingsRepository.isTapToReveal = enable
refreshSettings()
}
}

val uiState =
tapToRevealState.map {
SettingsSpoilersUiState(
isTapToReveal = it
)
}.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(SUBSCRIBE_STOP_TIMEOUT),
initialValue = SettingsSpoilersUiState()
private fun refreshSettings() {
with(settingsRepository.getAll()) {
hasShowsSettingsActive.value = spoilersHelper.hasActiveShowsSettings(this)
hasMoviesSettingsActive.value = spoilersHelper.hasActiveMoviesSettings(this)
hasEpisodesSettingsActive.value = spoilersHelper.hasActiveEpisodesSettings(this)
tapToRevealState.value = isTapToReveal
}
}

val uiState = combine(
hasShowsSettingsActive,
hasMoviesSettingsActive,
hasEpisodesSettingsActive,
tapToRevealState,
) { s1, s2, s3, s4 ->
SettingsSpoilersUiState(
hasShowsSettingActive = s1,
hasMoviesSettingActive = s2,
hasEpisodesSettingActive = s3,
isTapToReveal = s4,
)
}.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(SUBSCRIBE_STOP_TIMEOUT),
initialValue = SettingsSpoilersUiState()
)
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,28 @@
package com.michaldrabik.ui_settings.sections.spoilers.episodes

import android.content.DialogInterface
import android.os.Bundle
import android.view.View
import androidx.fragment.app.setFragmentResult
import androidx.fragment.app.viewModels
import com.michaldrabik.ui_base.common.sheets.remove_trakt.RemoveTraktBottomSheet
import com.michaldrabik.ui_base.BaseBottomSheetFragment
import com.michaldrabik.ui_base.utilities.extensions.launchAndRepeatStarted
import com.michaldrabik.ui_base.utilities.extensions.onClick
import com.michaldrabik.ui_base.utilities.extensions.setCheckedSilent
import com.michaldrabik.ui_base.utilities.viewBinding
import com.michaldrabik.ui_settings.R
import com.michaldrabik.ui_settings.SettingsFragment.Companion.REQUEST_SETTINGS
import com.michaldrabik.ui_settings.databinding.SheetSpoilersEpisodesBinding
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class SpoilersEpisodesBottomSheet : RemoveTraktBottomSheet<SpoilersEpisodesViewModel>(R.layout.sheet_spoilers_episodes) {
class SpoilersEpisodesBottomSheet : BaseBottomSheetFragment(R.layout.sheet_spoilers_episodes) {

private val viewModel by viewModels<SpoilersEpisodesViewModel>()
private val binding by viewBinding(SheetSpoilersEpisodesBinding::bind)

override fun getTheme(): Int = R.style.CustomBottomSheetDialog

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupView()
Expand Down Expand Up @@ -57,6 +62,11 @@ class SpoilersEpisodesBottomSheet : RemoveTraktBottomSheet<SpoilersEpisodesViewM
}
}

override fun onDismiss(dialog: DialogInterface) {
setFragmentResult(REQUEST_SETTINGS, Bundle.EMPTY)
super.onDismiss(dialog)
}

private val hideTitleListener: (View, Boolean) -> Unit = { _, isChecked ->
viewModel.setHideTitle(isChecked)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.michaldrabik.ui_settings.sections.spoilers.helpers

import com.michaldrabik.ui_model.SpoilersSettings
import javax.inject.Inject

class SettingsSpoilersHelper @Inject constructor() {

fun hasActiveShowsSettings(settings: SpoilersSettings): Boolean {
return settings.isMyShowsHidden ||
settings.isWatchlistShowsHidden ||
settings.isHiddenShowsHidden ||
settings.isNotCollectedShowsHidden ||
settings.isMyShowsRatingsHidden ||
settings.isWatchlistShowsRatingsHidden ||
settings.isHiddenShowsRatingsHidden ||
settings.isNotCollectedShowsRatingsHidden
}

fun hasActiveMoviesSettings(settings: SpoilersSettings): Boolean {
return settings.isMyMoviesHidden ||
settings.isWatchlistMoviesHidden ||
settings.isHiddenMoviesHidden ||
settings.isNotCollectedMoviesHidden ||
settings.isMyMoviesRatingsHidden ||
settings.isWatchlistMoviesRatingsHidden ||
settings.isHiddenMoviesRatingsHidden ||
settings.isNotCollectedMoviesRatingsHidden
}

fun hasActiveEpisodesSettings(settings: SpoilersSettings): Boolean {
return settings.isEpisodeDescriptionHidden ||
settings.isEpisodeImageHidden ||
settings.isEpisodeRatingHidden ||
settings.isEpisodeTitleHidden
}
}
Original file line number Diff line number Diff line change
@@ -1,24 +1,29 @@
package com.michaldrabik.ui_settings.sections.spoilers.movies

import android.annotation.SuppressLint
import android.content.DialogInterface
import android.os.Bundle
import android.view.View
import androidx.fragment.app.setFragmentResult
import androidx.fragment.app.viewModels
import com.michaldrabik.ui_base.common.sheets.remove_trakt.RemoveTraktBottomSheet
import com.michaldrabik.ui_base.BaseBottomSheetFragment
import com.michaldrabik.ui_base.utilities.extensions.launchAndRepeatStarted
import com.michaldrabik.ui_base.utilities.extensions.onClick
import com.michaldrabik.ui_base.utilities.extensions.setCheckedSilent
import com.michaldrabik.ui_base.utilities.viewBinding
import com.michaldrabik.ui_settings.R
import com.michaldrabik.ui_settings.SettingsFragment.Companion.REQUEST_SETTINGS
import com.michaldrabik.ui_settings.databinding.SheetSpoilersMoviesBinding
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class SpoilersMoviesBottomSheet : RemoveTraktBottomSheet<SpoilersMoviesViewModel>(R.layout.sheet_spoilers_movies) {
class SpoilersMoviesBottomSheet : BaseBottomSheetFragment(R.layout.sheet_spoilers_movies) {

private val viewModel by viewModels<SpoilersMoviesViewModel>()
private val binding by viewBinding(SheetSpoilersMoviesBinding::bind)

override fun getTheme(): Int = R.style.CustomBottomSheetDialog

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupView()
Expand Down Expand Up @@ -75,6 +80,11 @@ class SpoilersMoviesBottomSheet : RemoveTraktBottomSheet<SpoilersMoviesViewModel
}
}

override fun onDismiss(dialog: DialogInterface) {
setFragmentResult(REQUEST_SETTINGS, Bundle.EMPTY)
super.onDismiss(dialog)
}

private val notCollectedMoviesListener: (View, Boolean) -> Unit = { _, isChecked ->
viewModel.setHideNotCollectedMovies(isChecked)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,29 @@
package com.michaldrabik.ui_settings.sections.spoilers.shows

import android.annotation.SuppressLint
import android.content.DialogInterface
import android.os.Bundle
import android.view.View
import androidx.fragment.app.setFragmentResult
import androidx.fragment.app.viewModels
import com.michaldrabik.ui_base.common.sheets.remove_trakt.RemoveTraktBottomSheet
import com.michaldrabik.ui_base.BaseBottomSheetFragment
import com.michaldrabik.ui_base.utilities.extensions.launchAndRepeatStarted
import com.michaldrabik.ui_base.utilities.extensions.onClick
import com.michaldrabik.ui_base.utilities.extensions.setCheckedSilent
import com.michaldrabik.ui_base.utilities.viewBinding
import com.michaldrabik.ui_settings.R
import com.michaldrabik.ui_settings.SettingsFragment.Companion.REQUEST_SETTINGS
import com.michaldrabik.ui_settings.databinding.SheetSpoilersShowsBinding
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class SpoilersShowsBottomSheet : RemoveTraktBottomSheet<SpoilersShowsViewModel>(R.layout.sheet_spoilers_shows) {
class SpoilersShowsBottomSheet : BaseBottomSheetFragment(R.layout.sheet_spoilers_shows) {

private val viewModel by viewModels<SpoilersShowsViewModel>()
private val binding by viewBinding(SheetSpoilersShowsBinding::bind)

override fun getTheme(): Int = R.style.CustomBottomSheetDialog

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupView()
Expand Down Expand Up @@ -75,6 +80,11 @@ class SpoilersShowsBottomSheet : RemoveTraktBottomSheet<SpoilersShowsViewModel>(
}
}

override fun onDismiss(dialog: DialogInterface) {
setFragmentResult(REQUEST_SETTINGS, Bundle.EMPTY)
super.onDismiss(dialog)
}

private val notCollectedShowsListener: (View, Boolean) -> Unit = { _, isChecked ->
viewModel.setHideNotCollectedShows(isChecked)
}
Expand Down
Loading

0 comments on commit d527a61

Please sign in to comment.