Created
November 27, 2024 17:23
-
-
Save icbaker/44e962c6e218ad141880331300308021 to your computer and use it in GitHub Desktop.
PlayerWithoutSeekToNext using media3's ForwardingPlayer
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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