Merge pull request #6817 from Bnyro/master

feat: support for media button events (next, previous, rewind, forward, stop)
This commit is contained in:
Bnyro 2024-11-24 13:37:10 +01:00 committed by GitHub
commit 0c12495915
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -4,6 +4,7 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.view.KeyEvent
import androidx.annotation.OptIn import androidx.annotation.OptIn
import androidx.core.app.ServiceCompat import androidx.core.app.ServiceCompat
import androidx.core.os.postDelayed import androidx.core.os.postDelayed
@ -24,6 +25,7 @@ import com.github.libretube.api.obj.Subtitle
import com.github.libretube.enums.PlayerCommand import com.github.libretube.enums.PlayerCommand
import com.github.libretube.enums.PlayerEvent import com.github.libretube.enums.PlayerEvent
import com.github.libretube.extensions.parcelable import com.github.libretube.extensions.parcelable
import com.github.libretube.extensions.parcelableExtra
import com.github.libretube.extensions.toastFromMainThread import com.github.libretube.extensions.toastFromMainThread
import com.github.libretube.extensions.updateParameters import com.github.libretube.extensions.updateParameters
import com.github.libretube.helpers.PlayerHelper import com.github.libretube.helpers.PlayerHelper
@ -101,12 +103,15 @@ abstract class AbstractPlayerService : MediaLibraryService(), MediaLibrarySessio
if (::videoId.isInitialized) startPlayback() if (::videoId.isInitialized) startPlayback()
} }
} }
STOP_SERVICE_ACTION -> { STOP_SERVICE_ACTION -> {
onDestroy() onDestroy()
} }
RUN_PLAYER_COMMAND_ACTION -> { RUN_PLAYER_COMMAND_ACTION -> {
runPlayerCommand(args) runPlayerCommand(args)
} }
else -> { else -> {
handlePlayerAction(PlayerEvent.valueOf(customCommand.customAction)) handlePlayerAction(PlayerEvent.valueOf(customCommand.customAction))
} }
@ -151,7 +156,8 @@ abstract class AbstractPlayerService : MediaLibraryService(), MediaLibrarySessio
val subtitle: Subtitle? = args.parcelable(PlayerCommand.SET_SUBTITLE.name) val subtitle: Subtitle? = args.parcelable(PlayerCommand.SET_SUBTITLE.name)
trackSelector?.updateParameters { trackSelector?.updateParameters {
val roleFlags = if (subtitle?.code != null) getSubtitleRoleFlags(subtitle) else 0 val roleFlags =
if (subtitle?.code != null) getSubtitleRoleFlags(subtitle) else 0
setPreferredTextRoleFlags(roleFlags) setPreferredTextRoleFlags(roleFlags)
setPreferredTextLanguage(subtitle?.code) setPreferredTextLanguage(subtitle?.code)
} }
@ -244,7 +250,13 @@ abstract class AbstractPlayerService : MediaLibraryService(), MediaLibrarySessio
val mediaNotificationSessionCommands = val mediaNotificationSessionCommands =
connectionResult.availableSessionCommands.buildUpon() connectionResult.availableSessionCommands.buildUpon()
.also { builder -> .also { builder ->
builder.addSessionCommands(listOf(startServiceCommand, runPlayerActionCommand, stopServiceCommand)) builder.addSessionCommands(
listOf(
startServiceCommand,
runPlayerActionCommand,
stopServiceCommand
)
)
builder.addSessionCommands(customLayout.mapNotNull(CommandButton::sessionCommand)) builder.addSessionCommands(customLayout.mapNotNull(CommandButton::sessionCommand))
} }
.build() .build()
@ -297,6 +309,35 @@ abstract class AbstractPlayerService : MediaLibraryService(), MediaLibrarySessio
exoPlayer?.let { PlayerHelper.saveWatchPosition(it, videoId) } exoPlayer?.let { PlayerHelper.saveWatchPosition(it, videoId) }
} }
override fun onMediaButtonEvent(
session: MediaSession,
controllerInfo: MediaSession.ControllerInfo,
intent: Intent
): Boolean {
val event: KeyEvent = intent.parcelableExtra(Intent.EXTRA_KEY_EVENT) ?: return false
when (event.keyCode) {
KeyEvent.KEYCODE_MEDIA_NEXT -> {
handlePlayerAction(PlayerEvent.Next)
return true
}
KeyEvent.KEYCODE_MEDIA_PREVIOUS -> {
handlePlayerAction(PlayerEvent.Prev)
return true
}
KeyEvent.KEYCODE_MEDIA_REWIND -> {
handlePlayerAction(PlayerEvent.Rewind)
}
KeyEvent.KEYCODE_MEDIA_FAST_FORWARD -> {
handlePlayerAction(PlayerEvent.Forward)
}
KeyEvent.KEYCODE_MEDIA_STOP -> {
handlePlayerAction(PlayerEvent.Stop)
}
}
return super.onMediaButtonEvent(session, controllerInfo, intent)
}
override fun onDestroy() { override fun onDestroy() {
// wait for a short time before killing the mediaSession // wait for a short time before killing the mediaSession
// as the playerController must be released before we finish the session // as the playerController must be released before we finish the session