Overview
Starting with the Native SDK for Android version 6.18.0, there are some important changes to the SSAI Plugin that improve playback and seeking behavior, particularly in paused players.
Previously, when a user would seek forward and crossed an ad, the ad controls replaced the video controls immediately. This did not allow the user to keep seeking. The player would also keep the video content instead of replacing it with the ad content.
Now, users can seek forward and backward without the ads being played until the video is playing and the user has crossed an ad with the last seek.
Use case
Consider the following use case:
- The user loads a video with one or more mid-roll ads into the player and starts video playback.
- Before a mid-roll ad, the user pauses playback.
- While the player is paused, the user seeks across the mid-roll ad marker.
- While the player is still paused, the user seeks back across the mid-roll ad marker, back into the content just watched.
- After the seek, the player controls are available to the user. When the user presses Play, the content plays as expected.
- When playback reaches the midroll ad marker, the ad will play, with the ad controls displayed.
- After the midroll ad completes, the player completes the seek action to the seek target, where the content resumes playback, with the player controls.
Requirements
The following requirements are needed for this feature:
- Brightcove Native SDK for Android 6.18.0 or newer
Plugin Behavioral Changes
The following classes have new behavior:
SSAIComponent
class
This class now passes the BaseVideoView
object to the TimelineManager
class when a reference to this is created.
It removed passing the references for the video playback controller and the ticker to the SeekManager
when this is created and, instead it passes the event emitter. It also sets the seek listener from the timeline manager object to this new SeekManager
reference.
It also removed the SeekManager
object from being passed as an observer to the Ticker
class.
LastAdSeekStrategy
class
This class is now public.
NoAdSeekStrategy
class
This class is now public.
SeekManager
class
This class no longer triggers the playback of ads. That functionality was moved to the TimelineManager
where it makes more sense.
This class previously listened for SEEK_TO
events and notified all the listeners subscribed to this class. With that action, it passed the new absolute time position and also emitted a new SEEK_TO
event including the absolute position and the relative position. Now, SeekManager
no longer emits a new seek event but still notifies all the listeners about the first seek event.
This class no longer implements the TickerObserver
and SeekTask.Seekable
classes and does not handle the events that those classes generate.
This class no longer handles Skip Ad
events.
The constructor signature has changed from
public SeekManager(VideoPlaybackController, Timeline, Ticker)
to
public SeekManager(EventEmitter, Timeline)
TimelineManager
class
This class now handles the playback and skip action of ads. It is subscribed to the SeekManager
class to listen for seek events. Once a seek event is detected, this class checks if an ad was crossed. If so, it plays the ad. If not, it repositions the playhead in the video content and updates the absolute and relative positions.
The ads are played once the video is playing. If the video is paused, it will not play any ad crossed by seek events. This provides the availability to support many seek events. If the video is playing and an ad is crossed, the ad is played immediately.
When an ad is crossed while the video is paused, the TimelineManager
will resume the playhead position at the position before the ad was played.
The TimelineManager
resumes playback in the previous position when a skip ad event is detected.
The TimelineManager class now extends AbstractComponent
.
In order to create a TimelineManager
object, you need to pass a BaseVideoView
instance along with a Timeline
instance.
API Changes
The following classes have API changes:
SeekTask
class
This class was deleted because its main functionality was integrated into the TimelineManager
class where it makes more sense.
SeekManager
class
The constructor SeekManager(VideoPlaybackController videoPlaybackController, Timeline timeline, Ticker ticker)
was deleted since it no longer needs the VideoPlaybackController
and the Ticker
. Instead, it now receives the EventEmitter
and the Timeline
as follows:
SeekManager(EventEmitter eventEmitter, Timeline timeline)
TimelineManager
class
The constructor TimelineManager(@NonNull Timeline mTimeline)
was changed to the following:
TimelineManager(@NonNull BaseVideoView mBaseVideoView, @NonNull Timeline mTimeline)