diff --git a/android/src/main/java/com/brentvatne/exoplayer/VideoPlaybackService.kt b/android/src/main/java/com/brentvatne/exoplayer/VideoPlaybackService.kt index b60df6fa..4760ea5b 100644 --- a/android/src/main/java/com/brentvatne/exoplayer/VideoPlaybackService.kt +++ b/android/src/main/java/com/brentvatne/exoplayer/VideoPlaybackService.kt @@ -20,6 +20,7 @@ import androidx.media3.session.MediaSessionService import androidx.media3.session.MediaStyleNotificationHelper import androidx.media3.session.SessionCommand import com.brentvatne.common.toolbox.DebugLog +import com.brentvatne.react.R import okhttp3.internal.immutableListOf class PlaybackServiceBinder(val service: VideoPlaybackService) : Binder() @@ -63,7 +64,9 @@ class VideoPlaybackService : MediaSessionService() { mediaSessionsList[player] = mediaSession addSession(mediaSession) - startForeground(mediaSession.player.hashCode(), buildNotification(mediaSession)) + + val notificationId = player.hashCode() + startForeground(notificationId, buildNotification(mediaSession)) } fun unregisterPlayer(player: ExoPlayer) { @@ -224,7 +227,30 @@ class VideoPlaybackService : MediaSessionService() { mediaSessionsList.clear() } + private fun createPlaceholderNotification(): Notification { + val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + notificationManager.createNotificationChannel( + NotificationChannel( + NOTIFICATION_CHANEL_ID, + NOTIFICATION_CHANEL_ID, + NotificationManager.IMPORTANCE_LOW + ) + ) + } + + return NotificationCompat.Builder(this, NOTIFICATION_CHANEL_ID) + .setSmallIcon(androidx.media3.session.R.drawable.media3_icon_circular_play) + .setContentTitle(getString(R.string.media_playback_notification_title)) + .setContentText(getString(R.string.media_playback_notification_text)) + .build() + } + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForeground(PLACEHOLDER_NOTIFICATION_ID, createPlaceholderNotification()) + } + intent?.let { val playerId = it.getIntExtra("PLAYER_ID", -1) val actionCommand = it.getStringExtra("ACTION") @@ -249,6 +275,7 @@ class VideoPlaybackService : MediaSessionService() { companion object { private const val SEEK_INTERVAL_MS = 10000L private const val TAG = "VideoPlaybackService" + private const val PLACEHOLDER_NOTIFICATION_ID = 9999 const val NOTIFICATION_CHANEL_ID = "RNVIDEO_SESSION_NOTIFICATION" diff --git a/android/src/main/res/values/strings.xml b/android/src/main/res/values/strings.xml index a4c134f0..18f0e907 100644 --- a/android/src/main/res/values/strings.xml +++ b/android/src/main/res/values/strings.xml @@ -22,4 +22,8 @@ Playback Speed Select Playback Speed + + Media playback + + Preparing playback