From e490ff64c16d0f2bc37b9df3d318df747565b824 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Tue, 4 Jul 2023 14:38:33 -0600 Subject: [PATCH] playback: make bar action respond to settings Now that the navigation graphs are unified, the playback bar now has to respond to when it's custom action setting changes. --- .../auxio/playback/PlaybackBarFragment.kt | 99 ++++++++++--------- .../auxio/playback/PlaybackPanelFragment.kt | 2 +- .../auxio/playback/PlaybackSettings.kt | 6 ++ .../auxio/playback/PlaybackViewModel.kt | 12 ++- 4 files changed, 70 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackBarFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackBarFragment.kt index 036f07c99..e21aebb63 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackBarFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackBarFragment.kt @@ -70,7 +70,6 @@ class PlaybackBarFragment : ViewBindingFragment() { // Set up actions binding.playbackPlayPause.setOnClickListener { playbackModel.togglePlaying() } - setupSecondaryActions(binding, playbackModel.currentBarAction) // Load the track color in manually as it's unclear whether the track actually supports // using a ColorStateList in the resources. @@ -81,6 +80,11 @@ class PlaybackBarFragment : ViewBindingFragment() { collectImmediately(playbackModel.song, ::updateSong) collectImmediately(playbackModel.isPlaying, ::updatePlaying) collectImmediately(playbackModel.positionDs, ::updatePosition) + collectImmediately( + playbackModel.currentBarAction, + playbackModel.repeatMode, + playbackModel.isShuffled, + ::updateBarAction) } override fun onDestroyBinding(binding: FragmentPlaybackBarBinding) { @@ -90,39 +94,6 @@ class PlaybackBarFragment : ViewBindingFragment() { binding.playbackInfo.isSelected = false } - private fun setupSecondaryActions(binding: FragmentPlaybackBarBinding, actionMode: ActionMode) { - when (actionMode) { - ActionMode.NEXT -> { - logD("Setting up skip next action") - binding.playbackSecondaryAction.apply { - setIconResource(R.drawable.ic_skip_next_24) - contentDescription = getString(R.string.desc_skip_next) - iconTint = context.getAttrColorCompat(MR.attr.colorOnSurfaceVariant) - setOnClickListener { playbackModel.next() } - } - } - ActionMode.REPEAT -> { - logD("Setting up repeat mode action") - binding.playbackSecondaryAction.apply { - contentDescription = getString(R.string.desc_change_repeat) - iconTint = context.getColorCompat(R.color.sel_activatable_icon) - setOnClickListener { playbackModel.toggleRepeatMode() } - collectImmediately(playbackModel.repeatMode, ::updateRepeat) - } - } - ActionMode.SHUFFLE -> { - logD("Setting up shuffle action") - binding.playbackSecondaryAction.apply { - setIconResource(R.drawable.sel_shuffle_state_24) - contentDescription = getString(R.string.desc_shuffle) - iconTint = context.getColorCompat(R.color.sel_activatable_icon) - setOnClickListener { playbackModel.toggleShuffled() } - collectImmediately(playbackModel.isShuffled, ::updateShuffled) - } - } - } - } - private fun updateSong(song: Song?) { if (song == null) { // Nothing to do. @@ -141,19 +112,55 @@ class PlaybackBarFragment : ViewBindingFragment() { requireBinding().playbackPlayPause.isActivated = isPlaying } - private fun updateRepeat(repeatMode: RepeatMode) { - requireBinding().playbackSecondaryAction.apply { - setIconResource(repeatMode.icon) - // Icon tinting is controlled through isActivated, so update that flag as well. - isActivated = repeatMode != RepeatMode.NONE - } - } - - private fun updateShuffled(isShuffled: Boolean) { - requireBinding().playbackSecondaryAction.isActivated = isShuffled - } - private fun updatePosition(positionDs: Long) { requireBinding().playbackProgressBar.progress = positionDs.toInt() } + + private fun updateBarAction( + actionMode: ActionMode, + repeatMode: RepeatMode, + isShuffled: Boolean + ) { + val binding = requireBinding() + when (actionMode) { + ActionMode.NEXT -> { + logD("Using skip next action") + binding.playbackSecondaryAction.apply { + if (tag != actionMode) { + setIconResource(R.drawable.ic_skip_next_24) + contentDescription = getString(R.string.desc_skip_next) + iconTint = context.getAttrColorCompat(MR.attr.colorOnSurfaceVariant) + setOnClickListener { playbackModel.next() } + tag = actionMode + } + } + } + ActionMode.REPEAT -> { + logD("Using repeat mode action") + binding.playbackSecondaryAction.apply { + if (tag != actionMode) { + contentDescription = getString(R.string.desc_change_repeat) + iconTint = context.getColorCompat(R.color.sel_activatable_icon) + setOnClickListener { playbackModel.toggleRepeatMode() } + tag = actionMode + } + setIconResource(repeatMode.icon) + isActivated = repeatMode != RepeatMode.NONE + } + } + ActionMode.SHUFFLE -> { + logD("Using shuffle action") + binding.playbackSecondaryAction.apply { + if (tag != actionMode) { + setIconResource(R.drawable.sel_shuffle_state_24) + contentDescription = getString(R.string.desc_shuffle) + iconTint = context.getColorCompat(R.color.sel_activatable_icon) + setOnClickListener { playbackModel.toggleShuffled() } + tag = actionMode + } + isActivated = isShuffled + } + } + } + } } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackPanelFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackPanelFragment.kt index 20f8802a0..d273189bf 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackPanelFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackPanelFragment.kt @@ -238,10 +238,10 @@ class PlaybackPanelFragment : private fun handleShow(show: Show?) { when (show) { + is Show.SongAlbumDetails, is Show.ArtistDetails, is Show.AlbumDetails -> playbackModel.openMain() is Show.SongDetails, - is Show.SongAlbumDetails, is Show.SongArtistDetails, is Show.AlbumArtistDetails, is Show.GenreDetails, diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackSettings.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackSettings.kt index 8ec5db941..bfd97dbd4 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackSettings.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackSettings.kt @@ -68,6 +68,8 @@ interface PlaybackSettings : Settings { fun onReplayGainSettingsChanged() {} /** Called when [notificationAction] has changed. */ fun onNotificationActionChanged() {} + /** Called when [barAction] has changed. */ + fun onBarActionChanged() {} } } @@ -206,6 +208,10 @@ class PlaybackSettingsImpl @Inject constructor(@ApplicationContext context: Cont logD("Dispatching notification setting change") listener.onNotificationActionChanged() } + getString(R.string.set_key_bar_action) -> { + logD("Dispatching bar action change") + listener.onBarActionChanged() + } } } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt index 229ef373a..29f4e2f18 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt @@ -61,7 +61,7 @@ constructor( private val persistenceRepository: PersistenceRepository, private val musicRepository: MusicRepository, private val musicSettings: MusicSettings -) : ViewModel(), PlaybackStateManager.Listener { +) : ViewModel(), PlaybackStateManager.Listener, PlaybackSettings.Listener { private var lastPositionJob: Job? = null private val _song = MutableStateFlow(null) @@ -89,7 +89,9 @@ constructor( val isShuffled: StateFlow get() = _isShuffled - val currentBarAction: ActionMode = playbackSettings.barAction + private val _currentBarAction = MutableStateFlow(playbackSettings.barAction) + val currentBarAction: StateFlow + get() = _currentBarAction private val _openPanel = MutableEvent() val openPanel: Event @@ -108,10 +110,12 @@ constructor( init { playbackManager.addListener(this) + playbackSettings.registerListener(this) } override fun onCleared() { playbackManager.removeListener(this) + playbackSettings.unregisterListener(this) } override fun onIndexMoved(queue: Queue) { @@ -161,6 +165,10 @@ constructor( _repeatMode.value = repeatMode } + override fun onBarActionChanged() { + _currentBarAction.value = playbackSettings.barAction + } + // --- PLAYING FUNCTIONS --- /** Shuffle all songs in the music library. */