Commit 6ce3421c by tianyifeng Committed by Rohit Singh

Post notification for session app when FgS starting exception is caught

PiperOrigin-RevId: 502407886
parent abe11c88
...@@ -15,22 +15,22 @@ ...@@ -15,22 +15,22 @@
*/ */
package androidx.media3.demo.session package androidx.media3.demo.session
import android.app.PendingIntent.FLAG_IMMUTABLE import android.app.Notification.BigTextStyle
import android.app.PendingIntent.FLAG_UPDATE_CURRENT import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent.*
import android.app.TaskStackBuilder import android.app.TaskStackBuilder
import android.content.Intent import android.content.Intent
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import androidx.media3.common.AudioAttributes import androidx.media3.common.AudioAttributes
import androidx.media3.common.MediaItem import androidx.media3.common.MediaItem
import androidx.media3.common.util.Util
import androidx.media3.exoplayer.ExoPlayer import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.session.CommandButton import androidx.media3.session.*
import androidx.media3.session.LibraryResult
import androidx.media3.session.MediaLibraryService
import androidx.media3.session.MediaSession
import androidx.media3.session.MediaSession.ControllerInfo import androidx.media3.session.MediaSession.ControllerInfo
import androidx.media3.session.SessionCommand
import androidx.media3.session.SessionResult
import com.google.common.collect.ImmutableList import com.google.common.collect.ImmutableList
import com.google.common.util.concurrent.Futures import com.google.common.util.concurrent.Futures
import com.google.common.util.concurrent.ListenableFuture import com.google.common.util.concurrent.ListenableFuture
...@@ -51,6 +51,8 @@ class PlaybackService : MediaLibraryService() { ...@@ -51,6 +51,8 @@ class PlaybackService : MediaLibraryService() {
"android.media3.session.demo.SHUFFLE_ON" "android.media3.session.demo.SHUFFLE_ON"
private const val CUSTOM_COMMAND_TOGGLE_SHUFFLE_MODE_OFF = private const val CUSTOM_COMMAND_TOGGLE_SHUFFLE_MODE_OFF =
"android.media3.session.demo.SHUFFLE_OFF" "android.media3.session.demo.SHUFFLE_OFF"
private const val NOTIFICATION_ID = 123
private const val CHANNEL_ID = "demo_session_notification_channel_id"
} }
override fun onCreate() { override fun onCreate() {
...@@ -66,6 +68,7 @@ class PlaybackService : MediaLibraryService() { ...@@ -66,6 +68,7 @@ class PlaybackService : MediaLibraryService() {
) )
customLayout = ImmutableList.of(customCommands[0]) customLayout = ImmutableList.of(customCommands[0])
initializeSessionAndPlayer() initializeSessionAndPlayer()
setListener(MediaSessionServiceListener())
} }
override fun onGetSession(controllerInfo: ControllerInfo): MediaLibrarySession { override fun onGetSession(controllerInfo: ControllerInfo): MediaLibrarySession {
...@@ -81,6 +84,7 @@ class PlaybackService : MediaLibraryService() { ...@@ -81,6 +84,7 @@ class PlaybackService : MediaLibraryService() {
override fun onDestroy() { override fun onDestroy() {
player.release() player.release()
mediaLibrarySession.release() mediaLibrarySession.release()
clearListener()
super.onDestroy() super.onDestroy()
} }
...@@ -259,4 +263,54 @@ class PlaybackService : MediaLibraryService() { ...@@ -259,4 +263,54 @@ class PlaybackService : MediaLibraryService() {
private fun ignoreFuture(customLayout: ListenableFuture<SessionResult>) { private fun ignoreFuture(customLayout: ListenableFuture<SessionResult>) {
/* Do nothing. */ /* Do nothing. */
} }
private inner class MediaSessionServiceListener : Listener {
/**
* This method is only required to be implemented on Android 12 or above when an attempt is made
* by a media controller to resume playback when the {@link MediaSessionService} is in the
* background.
*/
override fun onForegroundServiceStartNotAllowedException() {
createNotificationAndNotify()
}
}
private fun createNotificationAndNotify() {
var notificationManagerCompat = NotificationManagerCompat.from(this)
ensureNotificationChannel(notificationManagerCompat)
var pendingIntent =
TaskStackBuilder.create(this).run {
addNextIntent(Intent(this@PlaybackService, MainActivity::class.java))
val immutableFlag = if (Build.VERSION.SDK_INT >= 23) FLAG_IMMUTABLE else 0
getPendingIntent(0, immutableFlag or FLAG_UPDATE_CURRENT)
}
var builder =
NotificationCompat.Builder(this, CHANNEL_ID)
.setContentIntent(pendingIntent)
.setSmallIcon(R.drawable.media3_notification_small_icon)
.setContentTitle(getString(R.string.notification_content_title))
.setStyle(
NotificationCompat.BigTextStyle().bigText(getString(R.string.notification_content_text))
)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setAutoCancel(true)
notificationManagerCompat.notify(NOTIFICATION_ID, builder.build())
}
private fun ensureNotificationChannel(notificationManagerCompat: NotificationManagerCompat) {
if (Util.SDK_INT < 26 || notificationManagerCompat.getNotificationChannel(CHANNEL_ID) != null) {
return
}
val channel =
NotificationChannel(
CHANNEL_ID,
getString(R.string.notification_channel_name),
NotificationManager.IMPORTANCE_DEFAULT
)
notificationManagerCompat.createNotificationChannel(channel)
}
} }
...@@ -24,4 +24,9 @@ ...@@ -24,4 +24,9 @@
<string name="no_item_prompt"> <string name="no_item_prompt">
"! No media in the play list !\nPlease try to add more from browser" "! No media in the play list !\nPlease try to add more from browser"
</string> </string>
<string name="notification_content_title">Playback cannot be resumed</string>
<string name="notification_content_text">Press on the play button on the media notification if it
is still present, otherwise please open the app to start the playback and re-connect the session
to the controller</string>
<string name="notification_channel_name">Playback cannot be resumed</string>
</resources> </resources>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment