diff --git a/ui-settings/src/main/java/com/michaldrabik/ui_settings/SettingsFragment.kt b/ui-settings/src/main/java/com/michaldrabik/ui_settings/SettingsFragment.kt index d6c1b12a6..66ee03990 100644 --- a/ui-settings/src/main/java/com/michaldrabik/ui_settings/SettingsFragment.kt +++ b/ui-settings/src/main/java/com/michaldrabik/ui_settings/SettingsFragment.kt @@ -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 @@ -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(R.layout.fragment_settings), OnTraktAuthorizeListener { + companion object { + const val REQUEST_SETTINGS = "REQUEST_SETTINGS" + } + override val viewModel by viewModels() 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() diff --git a/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/SettingsSpoilersFragment.kt b/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/SettingsSpoilersFragment.kt index 6ce339d76..b208f6e1b 100644 --- a/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/SettingsSpoilersFragment.kt +++ b/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/SettingsSpoilersFragment.kt @@ -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 @@ -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() } @@ -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() } diff --git a/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/SettingsSpoilersUiState.kt b/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/SettingsSpoilersUiState.kt index 3e7f15283..365bc7249 100644 --- a/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/SettingsSpoilersUiState.kt +++ b/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/SettingsSpoilersUiState.kt @@ -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, ) diff --git a/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/SettingsSpoilersViewModel.kt b/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/SettingsSpoilersViewModel.kt index 30075983e..517af48b6 100644 --- a/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/SettingsSpoilersViewModel.kt +++ b/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/SettingsSpoilersViewModel.kt @@ -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() { @@ -25,10 +30,6 @@ class SettingsSpoilersViewModel @Inject constructor( } } - private fun refreshSettings() { - tapToRevealState.value = settingsRepository.isTapToReveal - } - fun setTapToReveal(enable: Boolean) { viewModelScope.launch { settingsRepository.isTapToReveal = enable @@ -36,14 +37,30 @@ class SettingsSpoilersViewModel @Inject constructor( } } - 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() + ) } diff --git a/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/episodes/SpoilersEpisodesBottomSheet.kt b/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/episodes/SpoilersEpisodesBottomSheet.kt index 6758a6cfb..3780a02f9 100644 --- a/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/episodes/SpoilersEpisodesBottomSheet.kt +++ b/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/episodes/SpoilersEpisodesBottomSheet.kt @@ -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(R.layout.sheet_spoilers_episodes) { +class SpoilersEpisodesBottomSheet : BaseBottomSheetFragment(R.layout.sheet_spoilers_episodes) { private val viewModel by viewModels() 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() @@ -57,6 +62,11 @@ class SpoilersEpisodesBottomSheet : RemoveTraktBottomSheet Unit = { _, isChecked -> viewModel.setHideTitle(isChecked) } diff --git a/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/helpers/SettingsSpoilersHelper.kt b/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/helpers/SettingsSpoilersHelper.kt new file mode 100644 index 000000000..2dc381cc0 --- /dev/null +++ b/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/helpers/SettingsSpoilersHelper.kt @@ -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 + } +} diff --git a/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/movies/SpoilersMoviesBottomSheet.kt b/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/movies/SpoilersMoviesBottomSheet.kt index b21dab381..f99a60488 100644 --- a/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/movies/SpoilersMoviesBottomSheet.kt +++ b/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/movies/SpoilersMoviesBottomSheet.kt @@ -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(R.layout.sheet_spoilers_movies) { +class SpoilersMoviesBottomSheet : BaseBottomSheetFragment(R.layout.sheet_spoilers_movies) { private val viewModel by viewModels() 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() @@ -75,6 +80,11 @@ class SpoilersMoviesBottomSheet : RemoveTraktBottomSheet Unit = { _, isChecked -> viewModel.setHideNotCollectedMovies(isChecked) } diff --git a/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/shows/SpoilersShowsBottomSheet.kt b/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/shows/SpoilersShowsBottomSheet.kt index 458620a95..4c51c02b4 100644 --- a/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/shows/SpoilersShowsBottomSheet.kt +++ b/ui-settings/src/main/java/com/michaldrabik/ui_settings/sections/spoilers/shows/SpoilersShowsBottomSheet.kt @@ -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(R.layout.sheet_spoilers_shows) { +class SpoilersShowsBottomSheet : BaseBottomSheetFragment(R.layout.sheet_spoilers_shows) { private val viewModel by viewModels() 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() @@ -75,6 +80,11 @@ class SpoilersShowsBottomSheet : RemoveTraktBottomSheet( } } + override fun onDismiss(dialog: DialogInterface) { + setFragmentResult(REQUEST_SETTINGS, Bundle.EMPTY) + super.onDismiss(dialog) + } + private val notCollectedShowsListener: (View, Boolean) -> Unit = { _, isChecked -> viewModel.setHideNotCollectedShows(isChecked) } diff --git a/ui-settings/src/main/res/layout/fragment_settings_spoilers.xml b/ui-settings/src/main/res/layout/fragment_settings_spoilers.xml index 6e28a3c97..21b2a0776 100644 --- a/ui-settings/src/main/res/layout/fragment_settings_spoilers.xml +++ b/ui-settings/src/main/res/layout/fragment_settings_spoilers.xml @@ -16,59 +16,125 @@ android:text="@string/textSettingsSpoilers" /> - + + - + - - + + + - - + + +