diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 21d9e191..088fe2d9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,7 +9,7 @@ ktlint = "0.43.2" ktlintGradle = "11.5.0" detekt = "1.23.0" preferences = "1.2.0" -media3 = "1.0.2" +media3 = "1.1.0" androidSupport = "1.6.0" materialDesign = "1.9.0" diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/playback/CustomNotificationProvider.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/playback/CustomNotificationProvider.kt deleted file mode 100644 index 50fa4c4f..00000000 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/playback/CustomNotificationProvider.kt +++ /dev/null @@ -1,40 +0,0 @@ -/* - * CustomNotificationProvider.kt - * Copyright (C) 2009-2022 Ultrasonic developers - * - * Distributed under terms of the GNU GPLv3 license. - */ -package org.moire.ultrasonic.playback - -import android.content.Context -import androidx.media3.common.Player -import androidx.media3.common.util.UnstableApi -import androidx.media3.session.CommandButton -import androidx.media3.session.DefaultMediaNotificationProvider -import androidx.media3.session.MediaSession -import com.google.common.collect.ImmutableList -import org.koin.core.component.KoinComponent - -@UnstableApi -class CustomNotificationProvider(ctx: Context) : - DefaultMediaNotificationProvider(ctx), - KoinComponent { - - // By default the skip buttons are not shown in compact view. - // We add the COMMAND_KEY_COMPACT_VIEW_INDEX to show them - // See also: https://github.com/androidx/media/issues/410 - override fun getMediaButtons( - session: MediaSession, - playerCommands: Player.Commands, - customLayout: ImmutableList, - playWhenReady: Boolean - ): ImmutableList { - val commands = super.getMediaButtons(session, playerCommands, customLayout, playWhenReady) - - commands.forEachIndexed { index, command -> - command.extras.putInt(COMMAND_KEY_COMPACT_VIEW_INDEX, index) - } - - return commands - } -} diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/playback/PlaybackService.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/playback/PlaybackService.kt index 7965558e..e58a6799 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/playback/PlaybackService.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/playback/PlaybackService.kt @@ -130,21 +130,14 @@ class PlaybackService : private fun initializeSessionAndPlayer() { if (isStarted) return - setMediaNotificationProvider(CustomNotificationProvider(UApp.applicationContext())) - - // TODO: Remove minor code duplication with updateBackend() val desiredBackend = if (activeServerProvider.getActiveServer().jukeboxByDefault) { + Timber.i("Jukebox enabled by default") MediaPlayerManager.PlayerBackend.JUKEBOX } else { MediaPlayerManager.PlayerBackend.LOCAL } - player = if (activeServerProvider.getActiveServer().jukeboxByDefault) { - Timber.i("Jukebox enabled by default") - getJukeboxPlayer() - } else { - getLocalPlayer() - } + player = createNewBackend(desiredBackend) actualBackend = desiredBackend @@ -213,11 +206,7 @@ class PlaybackService : player.removeListener(listener) player.release() - player = if (newBackend == MediaPlayerManager.PlayerBackend.JUKEBOX) { - getJukeboxPlayer() - } else { - getLocalPlayer() - } + player = createNewBackend(newBackend) // Add fresh listeners player.addListener(listener) @@ -227,6 +216,14 @@ class PlaybackService : actualBackend = newBackend } + private fun createNewBackend(newBackend: MediaPlayerManager.PlayerBackend): Player { + return if (newBackend == MediaPlayerManager.PlayerBackend.JUKEBOX) { + getJukeboxPlayer() + } else { + getLocalPlayer() + } + } + private fun getJukeboxPlayer(): Player { return JukeboxMediaPlayer() } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/JukeboxMediaPlayer.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/JukeboxMediaPlayer.kt index dfc06cd5..20894ca6 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/JukeboxMediaPlayer.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/JukeboxMediaPlayer.kt @@ -206,6 +206,8 @@ class JukeboxMediaPlayer : JukeboxUnimplementedFunctions(), Player { Player.COMMAND_CHANGE_MEDIA_ITEMS, Player.COMMAND_GET_TIMELINE, Player.COMMAND_GET_DEVICE_VOLUME, + Player.COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS, + Player.COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS, Player.COMMAND_ADJUST_DEVICE_VOLUME, Player.COMMAND_SET_DEVICE_VOLUME ) @@ -213,6 +215,7 @@ class JukeboxMediaPlayer : JukeboxUnimplementedFunctions(), Player { if (playlist.isNotEmpty()) { commandsBuilder.addAll( Player.COMMAND_GET_CURRENT_MEDIA_ITEM, + Player.COMMAND_GET_METADATA, Player.COMMAND_GET_MEDIA_ITEMS_METADATA, Player.COMMAND_PLAY_PAUSE, Player.COMMAND_PREPARE, @@ -284,6 +287,10 @@ class JukeboxMediaPlayer : JukeboxUnimplementedFunctions(), Player { override fun setShuffleModeEnabled(shuffleModeEnabled: Boolean) {} override fun setDeviceVolume(volume: Int) { + setDeviceVolume(volume, 0) + } + + override fun setDeviceVolume(volume: Int, flags: Int) { gain = volume tasks.remove(SetGain::class.java) tasks.add(SetGain(floatGain)) @@ -299,17 +306,32 @@ class JukeboxMediaPlayer : JukeboxUnimplementedFunctions(), Player { } } + @Deprecated("Deprecated in Java") override fun increaseDeviceVolume() { + increaseDeviceVolume(C.VOLUME_FLAG_SHOW_UI) + } + + override fun increaseDeviceVolume(flags: Int) { gain = (gain + 1).coerceAtMost(MAX_GAIN) deviceVolume = gain } + @Deprecated("Deprecated in Java") override fun decreaseDeviceVolume() { + decreaseDeviceVolume(C.VOLUME_FLAG_SHOW_UI) + } + + override fun decreaseDeviceVolume(flags: Int) { gain = (gain - 1).coerceAtLeast(0) deviceVolume = gain } + @Deprecated("Deprecated in Java") override fun setDeviceMuted(muted: Boolean) { + setDeviceMuted(muted, C.VOLUME_FLAG_SHOW_UI) + } + + override fun setDeviceMuted(muted: Boolean, flags: Int) { gain = 0 deviceVolume = gain } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/JukeboxUnimplementedFunctions.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/JukeboxUnimplementedFunctions.kt index a22111be..c92abd23 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/JukeboxUnimplementedFunctions.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/JukeboxUnimplementedFunctions.kt @@ -67,6 +67,18 @@ abstract class JukeboxUnimplementedFunctions : Player { TODO("Not yet implemented") } + override fun replaceMediaItem(index: Int, mediaItem: MediaItem) { + TODO("Not yet implemented") + } + + override fun replaceMediaItems( + fromIndex: Int, + toIndex: Int, + mediaItems: MutableList + ) { + TODO("Not yet implemented") + } + override fun setPlayWhenReady(playWhenReady: Boolean) { TODO("Not yet implemented") } @@ -134,11 +146,6 @@ abstract class JukeboxUnimplementedFunctions : Player { override fun setPlaybackSpeed(speed: Float) { TODO("Not yet implemented") } - - override fun stop(reset: Boolean) { - TODO("Not yet implemented") - } - override fun getCurrentTracks(): Tracks { // TODO Dummy information is returned for now, this seems to work return Tracks.EMPTY