diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/util/Constants.java b/ultrasonic/src/main/java/org/moire/ultrasonic/util/Constants.java index 28404977..65d80be3 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/util/Constants.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/util/Constants.java @@ -119,6 +119,7 @@ public final class Constants public static final String PREFERENCES_KEY_DISC_SORT = "discAndTrackSort"; public static final String PREFERENCES_KEY_SEND_BLUETOOTH_NOTIFICATIONS = "sendBluetoothNotifications"; public static final String PREFERENCES_KEY_SEND_BLUETOOTH_ALBUM_ART = "sendBluetoothAlbumArt"; + public static final String PREFERENCES_KEY_DISABLE_SEND_NOW_PLAYING_LIST = "disableNowPlayingListSending"; public static final String PREFERENCES_KEY_VIEW_REFRESH = "viewRefresh"; public static final String PREFERENCES_KEY_ASK_FOR_SHARE_DETAILS = "sharingAlwaysAskForDetails"; public static final String PREFERENCES_KEY_DEFAULT_SHARE_DESCRIPTION = "sharingDefaultDescription"; diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/MediaSessionHandler.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/MediaSessionHandler.kt index ba9bc751..017045fc 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/MediaSessionHandler.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/MediaSessionHandler.kt @@ -43,7 +43,7 @@ class MediaSessionHandler : KoinComponent { private val applicationContext by inject() private var referenceCount: Int = 0 - private var cachedPlaylist: Iterable? = null + private var cachedPlaylist: List? = null private var playbackPositionDelayCount: Int = 0 private var cachedPosition: Long = 0 @@ -160,7 +160,7 @@ class MediaSessionHandler : KoinComponent { // It seems to be the best practice to set this to true for the lifetime of the session mediaSession?.isActive = true - if (cachedPlaylist != null) updateMediaSessionQueue(cachedPlaylist!!) + if (cachedPlaylist != null) setMediaSessionQueue(cachedPlaylist) Timber.i("MediaSessionHandler.initialize Media Session created") } @@ -245,7 +245,11 @@ class MediaSessionHandler : KoinComponent { playbackStateBuilder.setActions(playbackActions!!) cachedPlayingIndex = currentPlayingIndex - if (currentPlayingIndex != null) + setMediaSessionQueue(cachedPlaylist) + if ( + currentPlayingIndex != null && cachedPlaylist != null && + !Util.getShouldDisableNowPlayingListSending() + ) playbackStateBuilder.setActiveQueueItemId(currentPlayingIndex) // Save the playback state @@ -254,18 +258,21 @@ class MediaSessionHandler : KoinComponent { fun updateMediaSessionQueue(playlist: Iterable) { // This call is cached because Downloader may initialize earlier than the MediaSession - cachedPlaylist = playlist + cachedPlaylist = playlist.mapIndexed { id, song -> + MediaSessionCompat.QueueItem( + Util.getMediaDescriptionForEntry(song), + id.toLong() + ) + } + setMediaSessionQueue(cachedPlaylist) + } + + private fun setMediaSessionQueue(queue: List?) { if (mediaSession == null) return + if (Util.getShouldDisableNowPlayingListSending()) return mediaSession?.setQueueTitle(applicationContext.getString(R.string.button_bar_now_playing)) - mediaSession?.setQueue( - playlist.mapIndexed { id, song -> - MediaSessionCompat.QueueItem( - Util.getMediaDescriptionForEntry(song), - id.toLong() - ) - } - ) + mediaSession?.setQueue(queue) } fun updateMediaSessionPlaybackPosition(playbackPosition: Long) { @@ -285,7 +292,10 @@ class MediaSessionHandler : KoinComponent { playbackStateBuilder.setState(playbackState!!, playbackPosition, 1.0f) playbackStateBuilder.setActions(playbackActions!!) - if (cachedPlayingIndex != null) + if ( + cachedPlayingIndex != null && cachedPlaylist != null && + !Util.getShouldDisableNowPlayingListSending() + ) playbackStateBuilder.setActiveQueueItemId(cachedPlayingIndex!!) mediaSession?.setPlaybackState(playbackStateBuilder.build()) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt index a1db4420..cc3a13be 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt @@ -1097,6 +1097,13 @@ object Util { return preferences.getBoolean(Constants.PREFERENCES_KEY_SEND_BLUETOOTH_ALBUM_ART, true) } + fun getShouldDisableNowPlayingListSending(): Boolean { + val preferences = getPreferences() + return preferences.getBoolean( + Constants.PREFERENCES_KEY_DISABLE_SEND_NOW_PLAYING_LIST, false + ) + } + @JvmStatic fun getViewRefreshInterval(): Int { val preferences = getPreferences() diff --git a/ultrasonic/src/main/res/values/strings.xml b/ultrasonic/src/main/res/values/strings.xml index e7be8a28..961a3dbe 100644 --- a/ultrasonic/src/main/res/values/strings.xml +++ b/ultrasonic/src/main/res/values/strings.xml @@ -284,6 +284,8 @@ Search Settings Send album art over Bluetooth (May cause Bluetooth notifications to fail) Album Art Over Bluetooth + Now Playing List won\'t be sent to connected devices. This may restore compatibility with AVRCP 1.3 devices, when current track display is not updated + Disable sending of Now Playing List Send playback notifications via Bluetooth Send Bluetooth Notification Manage Servers diff --git a/ultrasonic/src/main/res/xml/settings.xml b/ultrasonic/src/main/res/xml/settings.xml index 46ad73b9..ba60cfab 100644 --- a/ultrasonic/src/main/res/xml/settings.xml +++ b/ultrasonic/src/main/res/xml/settings.xml @@ -179,6 +179,12 @@ a:summary="@string/settings.send_bluetooth_album_art_summary" a:title="@string/settings.send_bluetooth_album_art" app:iconSpaceReserved="false"/> +