Skip to content

Instantly share code, notes, and snippets.

@icbaker
Created November 27, 2024 17:23
Show Gist options
  • Save icbaker/44e962c6e218ad141880331300308021 to your computer and use it in GitHub Desktop.
Save icbaker/44e962c6e218ad141880331300308021 to your computer and use it in GitHub Desktop.
PlayerWithoutSeekToNext using media3's ForwardingPlayer
private class PlayerWithoutSeekToNext(player: Player) : ForwardingPlayer(player) {
override fun addListener(listener: Player.Listener) {
super.addListener(ForwardingListener(listener))
}
// MyForwardingListener delegates equals() and hashcode(), so we don't need to override
// removeListener because passing the 'outer' listener straight through will remove the
// correct 'inner' listener.
override fun isCommandAvailable(command: Int): Boolean {
return command != COMMAND_SEEK_TO_NEXT && super.isCommandAvailable(command)
}
override fun getAvailableCommands(): Player.Commands {
return super.getAvailableCommands().buildUpon().remove(COMMAND_SEEK_TO_NEXT).build()
}
override fun seekToNext() {
// Disable the seekToNext operation
}
private class ForwardingListener(val delegate: Player.Listener) : Player.Listener {
private lateinit var previouslyNotifiedCommandsFromIndividualCallback: Player.Commands
private lateinit var previouslyNotifiedCommandsFromOnEvents: Player.Commands
override fun onAvailableCommandsChanged(availableCommands: Player.Commands) {
val filteredCommands =
availableCommands.buildUpon().remove(Player.COMMAND_SEEK_TO_NEXT).build()
if (
!::previouslyNotifiedCommandsFromIndividualCallback.isInitialized ||
previouslyNotifiedCommandsFromIndividualCallback != filteredCommands
) {
delegate.onAvailableCommandsChanged(filteredCommands)
previouslyNotifiedCommandsFromIndividualCallback = filteredCommands
}
}
override fun onEvents(player: Player, events: Player.Events) {
val eventsToNotify: Player.Events
if (
events.contains(Player.EVENT_AVAILABLE_COMMANDS_CHANGED) &&
::previouslyNotifiedCommandsFromOnEvents.isInitialized &&
previouslyNotifiedCommandsFromOnEvents == player.availableCommands
) {
if (events.size() == 1) {
// The only event was EVENT_AVAILABLE_COMMANDS_CHANGED and the filtered commands didn't
// change
return
}
val filteredEventFlags = FlagSet.Builder()
for (i in 0..<events.size()) {
if (events.get(i) != Player.EVENT_AVAILABLE_COMMANDS_CHANGED) {
filteredEventFlags.add(events.get(i))
}
}
eventsToNotify = Player.Events(filteredEventFlags.build())
} else {
eventsToNotify = events
}
delegate.onEvents(player, eventsToNotify)
previouslyNotifiedCommandsFromOnEvents = player.availableCommands
}
override fun equals(other: Any?): Boolean {
return delegate == other
}
override fun hashCode(): Int {
return delegate.hashCode()
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment