diff --git a/app/src/degoogled/java/com/cappielloantonio/tempo/service/MediaService.kt b/app/src/degoogled/java/com/cappielloantonio/tempo/service/MediaService.kt index bb237c62..5c4e939c 100644 --- a/app/src/degoogled/java/com/cappielloantonio/tempo/service/MediaService.kt +++ b/app/src/degoogled/java/com/cappielloantonio/tempo/service/MediaService.kt @@ -82,6 +82,7 @@ class MediaService : MediaLibraryService() { private const val CUSTOM_COMMAND_TOGGLE_REPEAT_MODE_ALL = "android.media3.session.demo.REPEAT_ALL" const val ACTION_BIND_EQUALIZER = "com.cappielloantonio.tempo.service.BIND_EQUALIZER" + const val ACTION_EQUALIZER_UPDATED = "com.cappielloantonio.tempo.service.EQUALIZER_UPDATED" } fun updateMediaItems() { @@ -283,16 +284,7 @@ class MediaService : MediaLibraryService() { private fun initializeEqualizerManager() { equalizerManager = EqualizerManager() val audioSessionId = player.audioSessionId - if (equalizerManager.attachToSession(audioSessionId)) { - val enabled = Preferences.isEqualizerEnabled() - equalizerManager.setEnabled(enabled) - - val bands = equalizerManager.getNumberOfBands() - val savedLevels = Preferences.getEqualizerBandLevels(bands) - for (i in 0 until bands) { - equalizerManager.setBandLevel(i.toShort(), savedLevels[i]) - } - } + attachEqualizerIfPossible(audioSessionId) } private fun initializeMediaLibrarySession() { @@ -426,6 +418,10 @@ class MediaService : MediaLibraryService() { customLayout = librarySessionCallback.buildCustomLayout(player) mediaLibrarySession.setCustomLayout(customLayout) } + + override fun onAudioSessionIdChanged(audioSessionId: Int) { + attachEqualizerIfPossible(audioSessionId) + } }) if (player.isPlaying) { scheduleWidgetUpdates() @@ -541,6 +537,21 @@ class MediaService : MediaLibraryService() { widgetUpdateScheduled = false } + private fun attachEqualizerIfPossible(audioSessionId: Int): Boolean { + if (audioSessionId == 0 || audioSessionId == -1) return false + val attached = equalizerManager.attachToSession(audioSessionId) + if (attached) { + val enabled = Preferences.isEqualizerEnabled() + equalizerManager.setEnabled(enabled) + val bands = equalizerManager.getNumberOfBands() + val savedLevels = Preferences.getEqualizerBandLevels(bands) + for (i in 0 until bands) { + equalizerManager.setBandLevel(i.toShort(), savedLevels[i]) + } + sendBroadcast(Intent(ACTION_EQUALIZER_UPDATED)) + } + return attached + } private fun getRenderersFactory() = DownloadUtil.buildRenderersFactory(this, false) diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/EqualizerFragment.kt b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/EqualizerFragment.kt index a5115f14..7891b782 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/EqualizerFragment.kt +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/EqualizerFragment.kt @@ -3,7 +3,9 @@ package com.cappielloantonio.tempo.ui.fragment import android.content.ComponentName import android.content.Context import android.content.Intent +import android.content.IntentFilter import android.content.ServiceConnection +import android.content.BroadcastReceiver import android.os.Bundle import android.os.IBinder import android.view.Gravity @@ -12,6 +14,7 @@ import android.view.View import android.view.ViewGroup import android.widget.* import androidx.annotation.OptIn +import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.media3.common.util.UnstableApi import com.cappielloantonio.tempo.R @@ -28,6 +31,18 @@ class EqualizerFragment : Fragment() { private lateinit var safeSpace: Space private val bandSeekBars = mutableListOf() + private var receiverRegistered = false + private val equalizerUpdatedReceiver = object : BroadcastReceiver() { + @OptIn(UnstableApi::class) + override fun onReceive(context: Context?, intent: Intent?) { + if (intent?.action == MediaService.ACTION_EQUALIZER_UPDATED) { + // Equalizer became available or updated. Rebuild UI and restore values. + initUI() + restoreEqualizerPreferences() + } + } + } + private val connection = object : ServiceConnection { @OptIn(UnstableApi::class) override fun onServiceConnected(className: ComponentName, service: IBinder) { @@ -49,12 +64,29 @@ class EqualizerFragment : Fragment() { intent.action = MediaService.ACTION_BIND_EQUALIZER requireActivity().bindService(intent, connection, Context.BIND_AUTO_CREATE) } + if (!receiverRegistered) { + ContextCompat.registerReceiver( + requireContext(), + equalizerUpdatedReceiver, + IntentFilter(MediaService.ACTION_EQUALIZER_UPDATED), + ContextCompat.RECEIVER_NOT_EXPORTED + ) + receiverRegistered = true + } } override fun onStop() { super.onStop() requireActivity().unbindService(connection) equalizerManager = null + if (receiverRegistered) { + try { + requireContext().unregisterReceiver(equalizerUpdatedReceiver) + } catch (_: Exception) { + // ignore if not registered + } + receiverRegistered = false + } } override fun onCreateView(