2020-07-10 17:18:29 +02:00
|
|
|
package com.github.apognu.otter.playback
|
|
|
|
|
|
|
|
import android.content.Context
|
|
|
|
import android.content.Intent
|
|
|
|
import android.os.Bundle
|
|
|
|
import android.os.ResultReceiver
|
|
|
|
import android.support.v4.media.session.MediaSessionCompat
|
|
|
|
import android.support.v4.media.session.PlaybackStateCompat
|
|
|
|
import com.github.apognu.otter.utils.Command
|
|
|
|
import com.github.apognu.otter.utils.CommandBus
|
|
|
|
import com.google.android.exoplayer2.ControlDispatcher
|
|
|
|
import com.google.android.exoplayer2.Player
|
|
|
|
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector
|
|
|
|
|
|
|
|
class MediaSession(private val context: Context) {
|
2020-07-12 18:28:50 +02:00
|
|
|
var active = false
|
2020-07-10 17:18:29 +02:00
|
|
|
|
|
|
|
private val playbackStateBuilder = PlaybackStateCompat.Builder().apply {
|
|
|
|
setActions(
|
|
|
|
PlaybackStateCompat.ACTION_PLAY_PAUSE or
|
|
|
|
PlaybackStateCompat.ACTION_PLAY or
|
|
|
|
PlaybackStateCompat.ACTION_PAUSE or
|
|
|
|
PlaybackStateCompat.ACTION_SKIP_TO_NEXT or
|
|
|
|
PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS or
|
|
|
|
PlaybackStateCompat.ACTION_SEEK_TO or
|
|
|
|
PlaybackStateCompat.ACTION_SKIP_TO_QUEUE_ITEM
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
val session: MediaSessionCompat by lazy {
|
|
|
|
MediaSessionCompat(context, context.packageName).apply {
|
|
|
|
setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS or MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS)
|
|
|
|
setPlaybackState(playbackStateBuilder.build())
|
|
|
|
|
|
|
|
isActive = true
|
2020-07-12 18:28:50 +02:00
|
|
|
active = true
|
2020-07-10 17:18:29 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
val connector: MediaSessionConnector by lazy {
|
2020-07-12 18:28:50 +02:00
|
|
|
MediaSessionConnector(session).also {
|
2020-07-10 17:18:29 +02:00
|
|
|
it.setQueueNavigator(OtterQueueNavigator())
|
|
|
|
|
2020-07-12 18:28:50 +02:00
|
|
|
it.setMediaButtonEventHandler { _, _, intent ->
|
2020-07-10 17:18:29 +02:00
|
|
|
if (!active) {
|
2020-07-12 18:28:50 +02:00
|
|
|
context.startService(Intent(context, PlayerService::class.java).apply {
|
|
|
|
action = intent.action
|
2020-07-10 17:18:29 +02:00
|
|
|
|
2020-07-12 18:28:50 +02:00
|
|
|
intent.extras?.let { extras -> putExtras(extras) }
|
|
|
|
})
|
2020-07-10 17:18:29 +02:00
|
|
|
|
2020-07-12 18:28:50 +02:00
|
|
|
return@setMediaButtonEventHandler true
|
2020-07-10 17:18:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class OtterQueueNavigator : MediaSessionConnector.QueueNavigator {
|
|
|
|
override fun onSkipToQueueItem(player: Player, controlDispatcher: ControlDispatcher, id: Long) {
|
|
|
|
CommandBus.send(Command.PlayTrack(id.toInt()))
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onCurrentWindowIndexChanged(player: Player) {}
|
|
|
|
|
|
|
|
override fun onCommand(player: Player, controlDispatcher: ControlDispatcher, command: String, extras: Bundle?, cb: ResultReceiver?) = true
|
|
|
|
|
|
|
|
override fun getSupportedQueueNavigatorActions(player: Player): Long {
|
|
|
|
return PlaybackStateCompat.ACTION_PLAY_PAUSE or
|
|
|
|
PlaybackStateCompat.ACTION_SKIP_TO_NEXT or
|
|
|
|
PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS or
|
|
|
|
PlaybackStateCompat.ACTION_SKIP_TO_QUEUE_ITEM
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onSkipToNext(player: Player, controlDispatcher: ControlDispatcher) {
|
|
|
|
CommandBus.send(Command.NextTrack)
|
|
|
|
}
|
|
|
|
|
2020-07-12 15:19:33 +02:00
|
|
|
override fun getActiveQueueItemId(player: Player?) = player?.currentWindowIndex?.toLong() ?: 0
|
2020-07-10 17:18:29 +02:00
|
|
|
|
|
|
|
override fun onSkipToPrevious(player: Player, controlDispatcher: ControlDispatcher) {
|
|
|
|
CommandBus.send(Command.PreviousTrack)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onTimelineChanged(player: Player) {}
|
|
|
|
}
|