Skip to content

Commit

Permalink
fix(FEC-10945): ad / bumper isn't paused with autoPause (#404)
Browse files Browse the repository at this point in the history
When ad / bumper is playing the playback is marked as paused so the autoPause didn't try to auto pause it.
Added a boolean to keep the ad state and check it also in the auto pause mechanism.
  • Loading branch information
RoyBregman committed Jan 27, 2021
1 parent 8bd037d commit 6495047
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 10 deletions.
32 changes: 23 additions & 9 deletions src/common/controllers/ads-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class AdsController extends FakeEventTarget implements IAdsController {
_snapback: number;
_configAdBreaks: Array<RunTimeAdBreakObject>;
_adIsLoading: boolean;
_isAdPlaying: boolean;

constructor(player: Player, adsPluginControllers: Array<IAdsPluginController>) {
super();
Expand All @@ -45,6 +46,15 @@ class AdsController extends FakeEventTarget implements IAdsController {
return this._allAdsCompleted;
}

/**
* @instance
* @memberof AdsController
* @returns {boolean} - Whether an ad is playing.
*/
isAdPlaying(): boolean {
return this.isAdBreak() && this._isAdPlaying;
}

/**
* @instance
* @memberof AdsController
Expand Down Expand Up @@ -124,6 +134,7 @@ class AdsController extends FakeEventTarget implements IAdsController {
this._adPlayed = false;
this._snapback = 0;
this._adIsLoading = false;
this._isAdPlaying = false;
}

_addBindings(): void {
Expand All @@ -132,13 +143,16 @@ class AdsController extends FakeEventTarget implements IAdsController {
this._eventManager.listen(this._player, AdEventType.AD_BREAK_START, event => this._onAdBreakStart(event));
this._eventManager.listen(this._player, AdEventType.AD_LOADED, () => this._onAdLoaded());
this._eventManager.listen(this._player, AdEventType.AD_STARTED, event => this._onAdStarted(event));
this._eventManager.listen(this._player, AdEventType.AD_COMPLETED, () => (this._isAdPlaying = false));
this._eventManager.listen(this._player, AdEventType.AD_BREAK_END, () => this._onAdBreakEnd());
this._eventManager.listen(this._player, AdEventType.ADS_COMPLETED, () => this._onAdsCompleted());
this._eventManager.listen(this._player, AdEventType.AD_ERROR, event => this._onAdError(event));
this._eventManager.listen(this._player, CustomEventType.PLAYER_RESET, () => this._reset());
this._eventManager.listen(this._player, CustomEventType.PLAYER_DESTROY, () => this._destroy());
this._eventManager.listenOnce(this._player, Html5EventType.ENDED, () => this._onEnded());
this._eventManager.listenOnce(this._player, CustomEventType.PLAYBACK_ENDED, () => this._onPlaybackEnded());
this._eventManager.listen(this._player, AdEventType.AD_RESUMED, () => (this._isAdPlaying = true));
this._eventManager.listen(this._player, AdEventType.AD_PAUSED, () => (this._isAdPlaying = false));
}

_handleConfiguredAdBreaks(): void {
Expand Down Expand Up @@ -293,6 +307,7 @@ class AdsController extends FakeEventTarget implements IAdsController {
_onAdStarted(event: FakeEvent): void {
this._ad = event.payload.ad;
this._adPlayed = true;
this._isAdPlaying = true;
}

_onAdBreakEnd(): void {
Expand All @@ -310,15 +325,14 @@ class AdsController extends FakeEventTarget implements IAdsController {

_onAdError(event: FakeEvent): void {
this._adIsLoading = false;
if (
event.payload.severity === Error.Severity.CRITICAL &&
this._adsPluginControllers.every(controller => controller.done) &&
this._configAdBreaks.every(adBreak => adBreak.played)
) {
this._allAdsCompleted = true;
if (this._adPlayed) {
AdsController._logger.debug(AdEventType.ALL_ADS_COMPLETED);
this.dispatchEvent(new FakeEvent(AdEventType.ALL_ADS_COMPLETED));
if (event.payload.severity === Error.Severity.CRITICAL) {
this._isAdPlaying = false;
if (this._adsPluginControllers.every(controller => controller.done) && this._configAdBreaks.every(adBreak => adBreak.played)) {
this._allAdsCompleted = true;
if (this._adPlayed) {
AdsController._logger.debug(AdEventType.ALL_ADS_COMPLETED);
this.dispatchEvent(new FakeEvent(AdEventType.ALL_ADS_COMPLETED));
}
}
}
}
Expand Down
4 changes: 3 additions & 1 deletion src/kaltura-player.js
Original file line number Diff line number Diff line change
Expand Up @@ -877,8 +877,10 @@ class KalturaPlayer extends FakeEventTarget {
}

_handleAutoPause(visible: boolean) {
const isPlayingPlaybackOrAd = !this.paused || (this._adsController && this._adsController.isAdPlaying());
const shouldAutoPause = !this.isInPictureInPicture() && this._playbackStart && isPlayingPlaybackOrAd;
if (!visible) {
if (!this.isInPictureInPicture() && this._playbackStart && !this.paused) {
if (shouldAutoPause) {
this.pause();
this._autoPaused = true;
}
Expand Down

0 comments on commit 6495047

Please sign in to comment.