From d4884cc9ca2e13cc3bebe81d65688f6281bda2aa Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Thu, 11 Aug 2022 12:17:12 -0600 Subject: [PATCH] playback: replace song options with equalizer Replace the song options button in the playback menu with a button that opens the equalizer. I plan to re-introduce the song options in another location. --- CHANGELOG.md | 3 ++ .../auxio/playback/PlaybackPanelFragment.kt | 36 +++++++++++++------ .../auxio/playback/PlaybackViewModel.kt | 5 ++- .../playback/state/PlaybackStateManager.kt | 6 ++++ .../auxio/playback/system/PlaybackService.kt | 7 ++-- app/src/main/res/drawable/ic_equalizer.xml | 11 ++++++ app/src/main/res/drawable/ic_more_24.xml | 11 ++++++ app/src/main/res/menu/menu_playback.xml | 15 +++----- app/src/main/res/values/strings.xml | 3 +- 9 files changed, 70 insertions(+), 27 deletions(-) create mode 100644 app/src/main/res/drawable/ic_equalizer.xml create mode 100644 app/src/main/res/drawable/ic_more_24.xml diff --git a/CHANGELOG.md b/CHANGELOG.md index 3871ad7f2..f228b8616 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## dev +#### What's Improved +- Added a way to access the system equalizer from the playback menu. + #### What's Changed - ReplayGain can now no longer be disabled. Remove ReplayGain tags from files if such functionality is not desired. 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 a1de515c1..2afe92070 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackPanelFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackPanelFragment.kt @@ -17,9 +17,13 @@ package org.oxycblt.auxio.playback +import android.content.ActivityNotFoundException +import android.content.Intent +import android.media.audiofx.AudioEffect import android.os.Bundle import android.view.LayoutInflater import android.view.MenuItem +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.widget.Toolbar import androidx.core.view.updatePadding import androidx.fragment.app.Fragment @@ -34,6 +38,7 @@ import org.oxycblt.auxio.ui.NavigationViewModel import org.oxycblt.auxio.ui.fragment.ViewBindingFragment import org.oxycblt.auxio.util.androidActivityViewModels import org.oxycblt.auxio.util.collectImmediately +import org.oxycblt.auxio.util.showToast import org.oxycblt.auxio.util.systemBarInsetsCompat /** @@ -50,6 +55,14 @@ class PlaybackPanelFragment : private val playbackModel: PlaybackViewModel by androidActivityViewModels() private val navModel: NavigationViewModel by activityViewModels() + // AudioEffect expects you to use startActivityForResult with the panel intent. Use + // the contract analogue for this since there is no built-in contract for AudioEffect. + private val activityLauncher by lifecycleObject { + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + // Nothing to do + } + } + override fun onCreateBinding(inflater: LayoutInflater) = FragmentPlaybackPanelBinding.inflate(inflater) @@ -110,18 +123,19 @@ class PlaybackPanelFragment : override fun onMenuItemClick(item: MenuItem): Boolean { return when (item.itemId) { - R.id.action_go_artist -> { - playbackModel.song.value?.let { navModel.exploreNavigateTo(it.album.artist) } - true - } - R.id.action_go_album -> { - playbackModel.song.value?.let { navModel.exploreNavigateTo(it.album) } - true - } - R.id.action_song_detail -> { - playbackModel.song.value?.let { - navModel.mainNavigateTo(MainNavigationAction.SongDetails(it)) + R.id.action_open_equalizer -> { + val equalizerIntent = + Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL) + .putExtra( + AudioEffect.EXTRA_AUDIO_SESSION, playbackModel.currentAudioSessionId) + .putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC) + + try { + activityLauncher.launch(equalizerIntent) + } catch (e: ActivityNotFoundException) { + requireContext().showToast(R.string.err_no_app) } + true } else -> false 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 8f480902f..51408df39 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt @@ -76,6 +76,9 @@ class PlaybackViewModel(application: Application) : val isShuffled: StateFlow get() = _isShuffled + val currentAudioSessionId: Int? + get() = playbackManager.currentAudioSessionId + init { musicStore.addCallback(this) playbackManager.addCallback(this) @@ -170,7 +173,7 @@ class PlaybackViewModel(application: Application) : } } - // --- POSITION FUNCTIONS --- + // --- PLAYER FUNCTIONS --- /** Update the position and push it to [PlaybackStateManager] */ fun seekTo(positionSecs: Long) { diff --git a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt index 91763ea8f..ba4123675 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt @@ -89,6 +89,10 @@ class PlaybackStateManager private constructor() { var isInitialized = false private set + /** The current audio session ID of the controller. Null if no controller present. */ + val currentAudioSessionId: Int? + get() = controller?.audioSessionId + // --- CALLBACKS --- private val callbacks = mutableListOf() @@ -509,6 +513,8 @@ class PlaybackStateManager private constructor() { /** Represents a class capable of managing the internal player. */ interface Controller { + val audioSessionId: Int + /** Called when a new song should be loaded into the player. */ fun loadSong(song: Song?) diff --git a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt index 1d8cd9275..251385352 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt @@ -250,6 +250,9 @@ class PlaybackService : // --- CONTROLLER OVERRIDES --- + override val audioSessionId: Int + get() = player.audioSessionId + override fun loadSong(song: Song?) { if (song == null) { // Stop the foreground state if there's nothing to play. @@ -265,8 +268,6 @@ class PlaybackService : return } - C.ENCODING_PCM_32BIT - logD("Loading ${song.rawName}") player.setMediaItem(MediaItem.fromUri(song.uri)) player.prepare() @@ -355,7 +356,7 @@ class PlaybackService : sendBroadcast( Intent(event) .putExtra(AudioEffect.EXTRA_PACKAGE_NAME, packageName) - .putExtra(AudioEffect.EXTRA_AUDIO_SESSION, player.audioSessionId) + .putExtra(AudioEffect.EXTRA_AUDIO_SESSION, audioSessionId) .putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC)) } diff --git a/app/src/main/res/drawable/ic_equalizer.xml b/app/src/main/res/drawable/ic_equalizer.xml new file mode 100644 index 000000000..c8049d1bb --- /dev/null +++ b/app/src/main/res/drawable/ic_equalizer.xml @@ -0,0 +1,11 @@ + + + + diff --git a/app/src/main/res/drawable/ic_more_24.xml b/app/src/main/res/drawable/ic_more_24.xml new file mode 100644 index 000000000..7564f87a2 --- /dev/null +++ b/app/src/main/res/drawable/ic_more_24.xml @@ -0,0 +1,11 @@ + + + + diff --git a/app/src/main/res/menu/menu_playback.xml b/app/src/main/res/menu/menu_playback.xml index d98429906..fcf73ad03 100644 --- a/app/src/main/res/menu/menu_playback.xml +++ b/app/src/main/res/menu/menu_playback.xml @@ -2,15 +2,8 @@ - - + android:id="@+id/action_open_equalizer" + android:title="@string/lbl_equalizer" + android:icon="@drawable/ic_equalizer" + app:showAsAction="always" /> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7a31e94d6..0656881de 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -87,6 +87,7 @@ Ascending Now playing + Equalizer Play Shuffle @@ -235,7 +236,7 @@ No music found Music loading failed Auxio needs permission to read your music library - No app can open this link + No app found that can handle this task No folders This folder is not supported