From a0dfe63660126f981ac1df0ccb6b166a283d1cc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20Garc=C3=ADa?= <55400857+jaime-grj@users.noreply.github.com> Date: Thu, 6 Nov 2025 03:18:39 +0100 Subject: [PATCH 1/9] fix: Add listener to enable equalizer when audioSessionId changes --- .../tempo/service/MediaService.kt | 31 ++++++++++++------ .../tempo/ui/fragment/EqualizerFragment.kt | 32 +++++++++++++++++++ 2 files changed, 53 insertions(+), 10 deletions(-) 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( From 938c1de90672a681d2a310652cb014ffd0464e16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20Garc=C3=ADa?= <55400857+jaime-grj@users.noreply.github.com> Date: Thu, 6 Nov 2025 04:48:24 +0100 Subject: [PATCH 2/9] chore: Remove comment --- .../cappielloantonio/tempo/ui/fragment/EqualizerFragment.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 7891b782..0b97d516 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 @@ -36,7 +36,6 @@ class EqualizerFragment : Fragment() { @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() } @@ -266,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() From 043e1b39b007b3e4e0c130dba86e85ebf981a4ac Mon Sep 17 00:00:00 2001 From: eddyizm Date: Thu, 6 Nov 2025 14:35:29 -0800 Subject: [PATCH 3/9] Revert "fix: do not override itemType and itemId" This reverts commit d35146dba3a2d2dd10ca76519a3b610ebcc20a53. --- .../tempo/ui/adapter/AlbumCatalogueAdapter.java | 10 ++++++++++ .../tempo/ui/adapter/ArtistAdapter.java | 10 ++++++++++ .../tempo/ui/adapter/ArtistCatalogueAdapter.java | 10 ++++++++++ .../tempo/ui/adapter/ArtistHorizontalAdapter.java | 10 ++++++++++ .../tempo/ui/adapter/ArtistSimilarAdapter.java | 10 ++++++++++ .../tempo/ui/adapter/DownloadHorizontalAdapter.java | 10 ++++++++++ .../ui/adapter/PodcastChannelCatalogueAdapter.java | 10 ++++++++++ .../tempo/ui/adapter/PodcastEpisodeAdapter.java | 10 ++++++++++ .../tempo/ui/adapter/SongHorizontalAdapter.java | 10 ++++++++++ 9 files changed, 90 insertions(+) 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 Date: Thu, 6 Nov 2025 14:49:19 -0800 Subject: [PATCH 4/9] chore: name version --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 8cd604ba..83322fc6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { targetSdk 35 versionCode 3 - versionName '4.1.0' + versionName '4.1.1' testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' javaCompileOptions { From 36d2320e70095bcc414912449ef9a0f13f8386fa Mon Sep 17 00:00:00 2001 From: eddyizm Date: Thu, 6 Nov 2025 15:44:46 -0800 Subject: [PATCH 5/9] chore: bump version and changelog for release --- CHANGELOG.md | 4 ++++ app/build.gradle | 4 ++-- fastlane/metadata/android/en-US/changelogs/4.txt | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/4.txt 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 83322fc6..5e9b7975 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { minSdkVersion 24 targetSdk 35 - versionCode 3 - versionName '4.1.1' + versionCode 4 + versionName '4.1.2' testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' javaCompileOptions { 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 From 923cfd5bc97ed7db28c90348e3619d0a784fc434 Mon Sep 17 00:00:00 2001 From: eddyizm Date: Thu, 6 Nov 2025 16:08:07 -0800 Subject: [PATCH 6/9] fix: equalizer missing referenced value --- .../java/com/cappielloantonio/tempo/service/MediaService.kt | 1 + 1 file changed, 1 insertion(+) 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..d43fb61f 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 From 611b5001beedbc76ad323901d3298f201b319b85 Mon Sep 17 00:00:00 2001 From: eddyizm Date: Thu, 6 Nov 2025 16:08:55 -0800 Subject: [PATCH 7/9] chore: bumped version for new tag --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 5e9b7975..8d6363d7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { targetSdk 35 versionCode 4 - versionName '4.1.2' + versionName '4.1.3' testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' javaCompileOptions { From 12c7ec86a991ef4ab9a2bdb034b409b048247f0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20Garc=C3=ADa?= <55400857+jaime-grj@users.noreply.github.com> Date: Fri, 7 Nov 2025 02:06:08 +0100 Subject: [PATCH 8/9] fix: Add listener to enable equalizer when audioSessionId changes (main build variant) --- .../tempo/service/MediaService.kt | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) 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 d43fb61f..52fa8c1d 100644 --- a/app/src/tempus/java/com/cappielloantonio/tempo/service/MediaService.kt +++ b/app/src/tempus/java/com/cappielloantonio/tempo/service/MediaService.kt @@ -161,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() { @@ -334,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() @@ -451,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 From 748a19ef44de211f67c7dc4e14e8e9217686bc7c Mon Sep 17 00:00:00 2001 From: eddyizm Date: Sat, 8 Nov 2025 09:34:25 -0800 Subject: [PATCH 9/9] fix: discovery image fills holder at start --- app/src/main/res/layout/item_home_discover_song.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 @@