diff --git a/CHANGELOG.md b/CHANGELOG.md index 429c41cd..68d0478c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ # Changelog ## Pending release.. +* fix: reverts change causing album disc/track list to get out of order by @eddyizm in https://github.com/eddyizm/tempus/pull/237 +* fix: Add listener to enable equalizer when audioSessionId changes by @jaime-grj in https://github.com/eddyizm/tempus/pull/235 + +**Full Changelog**: https://github.com/eddyizm/tempus/compare/v4.1.0...v4.1.2 ## [4.1.0](https://github.com/eddyizm/tempo/releases/tag/v4.1.0) (2025-11-05) ## What's Changed diff --git a/app/build.gradle b/app/build.gradle index 8cd604ba..8d6363d7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { minSdkVersion 24 targetSdk 35 - versionCode 3 - versionName '4.1.0' + versionCode 4 + versionName '4.1.3' testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' javaCompileOptions { 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/adapter/AlbumCatalogueAdapter.java b/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/AlbumCatalogueAdapter.java index ba663c37..e2d0563e 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/AlbumCatalogueAdapter.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/AlbumCatalogueAdapter.java @@ -105,6 +105,16 @@ public class AlbumCatalogueAdapter extends RecyclerView.Adapter groupSong(List songs) { switch (view) { case Constants.DOWNLOAD_TYPE_TRACK: diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/PodcastChannelCatalogueAdapter.java b/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/PodcastChannelCatalogueAdapter.java index f3784175..3eb6bc02 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/PodcastChannelCatalogueAdapter.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/PodcastChannelCatalogueAdapter.java @@ -95,6 +95,16 @@ public class PodcastChannelCatalogueAdapter extends RecyclerView.Adapter() + 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) { + initUI() + restoreEqualizerPreferences() + } + } + } + private val connection = object : ServiceConnection { @OptIn(UnstableApi::class) override fun onServiceConnected(className: ComponentName, service: IBinder) { @@ -49,12 +63,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( @@ -234,4 +265,4 @@ class EqualizerFragment : Fragment() { } private fun Int.dpToPx(context: Context): Int = - (this * context.resources.displayMetrics.density).toInt() \ No newline at end of file + (this * context.resources.displayMetrics.density).toInt() diff --git a/app/src/main/res/layout/item_home_discover_song.xml b/app/src/main/res/layout/item_home_discover_song.xml index f2d3bb9b..6e4ccee2 100644 --- a/app/src/main/res/layout/item_home_discover_song.xml +++ b/app/src/main/res/layout/item_home_discover_song.xml @@ -7,7 +7,10 @@ diff --git a/app/src/tempus/java/com/cappielloantonio/tempo/service/MediaService.kt b/app/src/tempus/java/com/cappielloantonio/tempo/service/MediaService.kt index 36ea5b26..52fa8c1d 100644 --- a/app/src/tempus/java/com/cappielloantonio/tempo/service/MediaService.kt +++ b/app/src/tempus/java/com/cappielloantonio/tempo/service/MediaService.kt @@ -60,6 +60,7 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener { companion object { const val ACTION_BIND_EQUALIZER = "com.cappielloantonio.tempo.service.BIND_EQUALIZER" + const val ACTION_EQUALIZER_UPDATED = "com.cappielloantonio.tempo.service.EQUALIZER_UPDATED" } private val widgetUpdateHandler = Handler(Looper.getMainLooper()) private var widgetUpdateScheduled = false @@ -160,16 +161,7 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener { 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 initializePlayer() { @@ -333,6 +325,10 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener { override fun onRepeatModeChanged(repeatMode: Int) { Preferences.setRepeatMode(repeatMode) } + + override fun onAudioSessionIdChanged(audioSessionId: Int) { + attachEqualizerIfPossible(audioSessionId) + } }) if (player.isPlaying) { scheduleWidgetUpdates() @@ -450,6 +446,22 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener { player.playWhenReady = isPlaying player.prepare() } + + 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 const val WIDGET_UPDATE_INTERVAL_MS = 1000L diff --git a/fastlane/metadata/android/en-US/changelogs/4.txt b/fastlane/metadata/android/en-US/changelogs/4.txt new file mode 100644 index 00000000..2e208a6d --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/4.txt @@ -0,0 +1,2 @@ +reverts change causing album disc/track list to get out of order +Add listener to enable equalizer when audioSessionId