From bd46026ba0d0c1a8cfc23ad6f7dba1c8fce58887 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Font=C3=A1n?= Date: Sun, 5 May 2024 23:46:20 +0200 Subject: [PATCH] WIP: Trying to set custom layout in the Media3 notification MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Gabriel Fontán --- .../mediaplayer/di/MediaPlayerModule.kt | 11 ++++ .../mediaplayer/service/MediaplayerService.kt | 48 +++------------ .../MediaSessionLayoutHandlerImpl.kt | 58 +++++++++++++++++++ app/src/main/AndroidManifest.xml | 6 ++ 4 files changed, 83 insertions(+), 40 deletions(-) create mode 100644 app/mediaplayer/src/main/java/com/bobbyesp/mediaplayer/service/notifications/customLayout/MediaSessionLayoutHandlerImpl.kt diff --git a/app/mediaplayer/src/main/java/com/bobbyesp/mediaplayer/di/MediaPlayerModule.kt b/app/mediaplayer/src/main/java/com/bobbyesp/mediaplayer/di/MediaPlayerModule.kt index 54017b3..247e72e 100644 --- a/app/mediaplayer/src/main/java/com/bobbyesp/mediaplayer/di/MediaPlayerModule.kt +++ b/app/mediaplayer/src/main/java/com/bobbyesp/mediaplayer/di/MediaPlayerModule.kt @@ -15,6 +15,8 @@ import com.bobbyesp.mediaplayer.service.ConnectionHandler import com.bobbyesp.mediaplayer.service.MediaLibrarySessionCallback import com.bobbyesp.mediaplayer.service.MediaServiceHandler import com.bobbyesp.mediaplayer.service.notifications.MediaNotificationManager +import com.bobbyesp.mediaplayer.service.notifications.customLayout.MediaSessionLayoutHandler +import com.bobbyesp.mediaplayer.service.notifications.customLayout.MediaSessionLayoutHandlerImpl import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -90,4 +92,13 @@ object MediaPlayerModule { @Provides @Singleton fun provideConnectionHandler(): ConnectionHandler = ConnectionHandler() + + @Provides + @Singleton + fun provideMediaSessionLayoutHandler( + @ApplicationContext context: Context, + mediaLibrarySessionCallback: MediaLibrarySessionCallback, + mediaLibrarySession: MediaLibrarySession + ): MediaSessionLayoutHandler = + MediaSessionLayoutHandlerImpl(context, mediaLibrarySession, mediaLibrarySessionCallback) } \ No newline at end of file diff --git a/app/mediaplayer/src/main/java/com/bobbyesp/mediaplayer/service/MediaplayerService.kt b/app/mediaplayer/src/main/java/com/bobbyesp/mediaplayer/service/MediaplayerService.kt index 4c7b4db..22836be 100644 --- a/app/mediaplayer/src/main/java/com/bobbyesp/mediaplayer/service/MediaplayerService.kt +++ b/app/mediaplayer/src/main/java/com/bobbyesp/mediaplayer/service/MediaplayerService.kt @@ -3,64 +3,32 @@ package com.bobbyesp.mediaplayer.service import android.content.Intent import android.os.Binder import androidx.media3.common.Player -import androidx.media3.common.Player.REPEAT_MODE_ALL -import androidx.media3.common.Player.REPEAT_MODE_OFF -import androidx.media3.common.Player.REPEAT_MODE_ONE import androidx.media3.common.util.UnstableApi -import androidx.media3.session.CommandButton +import androidx.media3.session.MediaController import androidx.media3.session.MediaLibraryService import androidx.media3.session.MediaSession -import com.bobbyesp.mediaplayer.R -import com.bobbyesp.mediaplayer.service.MediaServiceHandler.Companion.CommandToggleRepeatMode -import com.bobbyesp.mediaplayer.service.MediaServiceHandler.Companion.CommandToggleShuffle import com.bobbyesp.mediaplayer.service.notifications.MediaNotificationManager import com.bobbyesp.mediaplayer.service.notifications.customLayout.MediaSessionLayoutHandler -import com.google.common.collect.ImmutableList import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @UnstableApi @AndroidEntryPoint -class MediaplayerService : MediaLibraryService(), MediaSessionLayoutHandler { +class MediaplayerService : MediaLibraryService(), MediaController.Listener { @Inject lateinit var mediaSession: MediaLibrarySession @Inject - lateinit var notificationManager: MediaNotificationManager + lateinit var mediaServiceHandler: MediaServiceHandler @Inject - lateinit var connectionHandler: ConnectionHandler + lateinit var notificationManager: MediaNotificationManager @Inject - lateinit var mediaServiceHandler: MediaServiceHandler + lateinit var mediaSessionLayoutHandler: MediaSessionLayoutHandler - override fun updateNotificationLayout() { - val commandButtons = ImmutableList.of( - CommandButton.Builder() - .setDisplayName(getString(if (mediaSession.player.shuffleModeEnabled) R.string.action_shuffle_on else R.string.action_shuffle_off)) - .setIconResId(if (mediaSession.player.shuffleModeEnabled) R.drawable.shuffle_on else R.drawable.shuffle) - .setSessionCommand(CommandToggleShuffle).build(), - CommandButton.Builder() - .setDisplayName( - getString( - when (mediaSession.player.repeatMode) { - REPEAT_MODE_OFF -> R.string.repeat_mode_off - REPEAT_MODE_ONE -> R.string.repeat_mode_one - REPEAT_MODE_ALL -> R.string.repeat_mode_all - else -> throw IllegalStateException() - } - ) - ).setIconResId( - when (mediaSession.player.repeatMode) { - REPEAT_MODE_OFF -> R.drawable.repeat - REPEAT_MODE_ONE -> R.drawable.repeat_one_on - REPEAT_MODE_ALL -> R.drawable.repeat_on - else -> throw IllegalStateException() - } - ).setSessionCommand(CommandToggleRepeatMode).build() - ) - mediaSession.setCustomLayout(commandButtons) - } + @Inject + lateinit var connectionHandler: ConnectionHandler @UnstableApi override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { @@ -68,7 +36,7 @@ class MediaplayerService : MediaLibraryService(), MediaSessionLayoutHandler { notificationManager.startNotificationService( mediaSessionService = this, mediaSession = mediaSession ) - mediaServiceHandler.setMediaSessionInterface(this) + mediaServiceHandler.setMediaSessionInterface(mediaSessionLayoutHandler) return super.onStartCommand(intent, flags, startId) } diff --git a/app/mediaplayer/src/main/java/com/bobbyesp/mediaplayer/service/notifications/customLayout/MediaSessionLayoutHandlerImpl.kt b/app/mediaplayer/src/main/java/com/bobbyesp/mediaplayer/service/notifications/customLayout/MediaSessionLayoutHandlerImpl.kt new file mode 100644 index 0000000..6e89cd2 --- /dev/null +++ b/app/mediaplayer/src/main/java/com/bobbyesp/mediaplayer/service/notifications/customLayout/MediaSessionLayoutHandlerImpl.kt @@ -0,0 +1,58 @@ +package com.bobbyesp.mediaplayer.service.notifications.customLayout + +import android.content.Context +import androidx.core.content.ContextCompat.getString +import androidx.media3.common.Player.REPEAT_MODE_ALL +import androidx.media3.common.Player.REPEAT_MODE_OFF +import androidx.media3.common.Player.REPEAT_MODE_ONE +import androidx.media3.session.CommandButton +import androidx.media3.session.MediaLibraryService +import com.bobbyesp.mediaplayer.R +import com.bobbyesp.mediaplayer.service.MediaLibrarySessionCallback +import com.bobbyesp.mediaplayer.service.MediaServiceHandler.Companion.CommandToggleRepeatMode +import com.bobbyesp.mediaplayer.service.MediaServiceHandler.Companion.CommandToggleShuffle +import com.google.common.collect.ImmutableList +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject + +class MediaSessionLayoutHandlerImpl @Inject constructor( + @ApplicationContext private val context: Context, + private val mediaSession: MediaLibraryService.MediaLibrarySession, + private val mediaSessionCallback: MediaLibrarySessionCallback +) : MediaSessionLayoutHandler { + + val commandButtons = ImmutableList.of( + CommandButton.Builder() + .setDisplayName( + getString( + context, + if (mediaSession.player.shuffleModeEnabled) R.string.action_shuffle_on else R.string.action_shuffle_off + ) + ) + .setIconResId(if (mediaSession.player.shuffleModeEnabled) R.drawable.shuffle_on else R.drawable.shuffle) + .setSessionCommand(CommandToggleShuffle).build(), + CommandButton.Builder() + .setDisplayName( + getString( + context, + when (mediaSession.player.repeatMode) { + REPEAT_MODE_OFF -> R.string.repeat_mode_off + REPEAT_MODE_ONE -> R.string.repeat_mode_one + REPEAT_MODE_ALL -> R.string.repeat_mode_all + else -> throw IllegalStateException() + } + ) + ).setIconResId( + when (mediaSession.player.repeatMode) { + REPEAT_MODE_OFF -> R.drawable.repeat + REPEAT_MODE_ONE -> R.drawable.repeat_one_on + REPEAT_MODE_ALL -> R.drawable.repeat_on + else -> throw IllegalStateException() + } + ).setSessionCommand(CommandToggleRepeatMode).build() + ) + + override fun updateNotificationLayout() { + mediaSession.setCustomLayout(commandButtons) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 694028d..789a036 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,7 +16,13 @@ + + + + + +