package com.example.playback import android.app.NotificationChannel import android.app.NotificationManager import android.app.PendingIntent import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter import android.media.AudioManager import android.os.Build import androidx.media3.common.util.UnstableApi import androidx.media3.session.DefaultMediaNotificationProvider import androidx.media3.session.MediaSession import androidx.media3.session.MediaSessionService import com.example.MainActivity @UnstableApi class SwipePlayMediaService : MediaSessionService() { private var mediaSession: MediaSession? = null private var becomingNoisyReceiver: BroadcastReceiver? = null override fun onCreate() { super.onCreate() createNotificationChannel() val player = PlaybackManager.getOrCreatePlayer(applicationContext) val sessionActivityPendingIntent = PendingIntent.getActivity( this, 0, Intent(this, MainActivity::class.java), PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT ) mediaSession = MediaSession.Builder(this, player) .setSessionActivity(sessionActivityPendingIntent) .build() setMediaNotificationProvider( DefaultMediaNotificationProvider.Builder(this) .setChannelId(CHANNEL_ID) .build() ) registerBecomingNoisyReceiver() } override fun onGetSession(controllerInfo: MediaSession.ControllerInfo): MediaSession? { return mediaSession } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { super.onStartCommand(intent, flags, startId) return START_NOT_STICKY } private fun registerBecomingNoisyReceiver() { becomingNoisyReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { if (intent?.action == AudioManager.ACTION_AUDIO_BECOMING_NOISY) { PlaybackManager.pause() } } } registerReceiver( becomingNoisyReceiver, IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY) ) } private fun createNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channel = NotificationChannel( CHANNEL_ID, "SwipePlay Playback", NotificationManager.IMPORTANCE_LOW ).apply { description = "Background audio playback notifications" setShowBadge(false) } val manager = getSystemService(NotificationManager::class.java) manager?.createNotificationChannel(channel) } } override fun onDestroy() { becomingNoisyReceiver?.let { try { unregisterReceiver(it) } catch (_: Exception) {} becomingNoisyReceiver = null } mediaSession?.run { release() mediaSession = null } super.onDestroy() } companion object { const val CHANNEL_ID = "swipeplay_playback_channel" } }