diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/media/MediaTrack.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/media/MediaTrack.java index 61be8a1efb8..9da7c3e3f14 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/media/MediaTrack.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/media/MediaTrack.java @@ -25,6 +25,7 @@ public class MediaTrack implements Serializable { private static final long serialVersionUID = 1L; + @Deprecated public enum Status { UNDEFINED('?'), CANNOT_PLAY('-'), NOT_REACHABLE('#'), REACHABLE('+'); @@ -155,5 +156,4 @@ public class MediaTrack implements Serializable { return false; } } - } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/videoplayer/VideoPlayer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/videoplayer/VideoPlayer.java index ec9b0bfe920..434d387eaec 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/videoplayer/VideoPlayer.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/videoplayer/VideoPlayer.java @@ -1,6 +1,6 @@ package com.sap.sailing.gwt.home.shared.partials.videoplayer; -import com.google.gwt.dom.client.VideoElement; +import com.google.gwt.dom.client.Element; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.ui.Composite; @@ -73,7 +73,7 @@ public class VideoPlayer extends Composite { videoJSPlayer.setVideo(video.getMimeType(), video.getSourceRef()); } - public VideoElement getVideoElement() { + public Element getVideoElement() { return videoJSPlayer.getVideoElement(); } public boolean isFullscreen() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/AudioHtmlPlayer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/AudioHtmlPlayer.java deleted file mode 100644 index 62fdd87e7fb..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/AudioHtmlPlayer.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.sap.sailing.gwt.ui.client.media; - -import com.google.gwt.media.client.Audio; -import com.google.gwt.media.client.MediaBase; -import com.sap.sailing.domain.common.media.MediaTrack; -import com.sap.sailing.gwt.ui.client.media.shared.AudioPlayer; - -public class AudioHtmlPlayer extends AbstractHtmlMediaPlayer implements AudioPlayer { - - public AudioHtmlPlayer(MediaTrack mediaTrack) { - super(mediaTrack); - } - - @Override - protected MediaBase createMediaElement() { - return Audio.createIfSupported(); - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/MediaManagementControl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/MediaManagementControl.java index 948e6abf4f3..7d7686508f4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/MediaManagementControl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/MediaManagementControl.java @@ -16,7 +16,6 @@ import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.DialogBox; -import com.google.gwt.user.client.ui.FocusWidget; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; @@ -47,10 +46,10 @@ public class MediaManagementControl extends AbstractMediaSelectionControl implem public void show() { Collection videoTracks = new ArrayList<>(); Collection audioTracks = new ArrayList<>(); - addAssignedMediaTracksTo(videoTracks, audioTracks); - addOverlappingMediaTracksTo(videoTracks, audioTracks); + filterGivenMediaTracksTo(videoTracks, audioTracks, mediaPlayerManager.getAssignedMediaTracks()); + filterGivenMediaTracksTo(videoTracks, audioTracks, mediaPlayerManager.getOverlappingMediaTracks()); Panel grid = new VerticalPanel(); - addVideoTracksToGridPanel(audioTracks, grid); + addAudioTracksToGridPanel(audioTracks, grid); addVideoTracksToGridPanel(videoTracks, grid); addNewMediaButtonsTo(grid); dialogControl.add(grid); @@ -81,59 +80,41 @@ public class MediaManagementControl extends AbstractMediaSelectionControl implem grid.add(controlButtons); } - private void addVideoTracksToGridPanel(Collection reachableVideoTracks, Panel grid) { - if (!reachableVideoTracks.isEmpty()) { - grid.add(createVideoHeader()); - for (MediaTrack videoTrack : reachableVideoTracks) { + private void addVideoTracksToGridPanel(Collection videoTracks, Panel grid) { + if (!videoTracks.isEmpty()) { + grid.add(new Label(stringMessages.videos())); + for (MediaTrack videoTrack : videoTracks) { grid.add(createVideoOptions(videoTrack, mediaPlayerManager.getPlayingVideoTracks())); } } } - private void addAudioTracksToGridPanel(Collection reachableAudioTracks, Panel grid) { - if (!reachableAudioTracks.isEmpty()) { - grid.add(createAudioHeader()); - grid.add((RadioButton) createAudioButton(null, mediaPlayerManager.getPlayingAudioTrack())); - for (MediaTrack audioTrack : reachableAudioTracks) { + private void addAudioTracksToGridPanel(Collection audioTracks, Panel grid) { + if (!audioTracks.isEmpty()) { + // TODO + grid.add(new Label("i18n Audio Tracks")); + grid.add(createAudioButton(null, mediaPlayerManager.getPlayingAudioTrack())); + for (MediaTrack audioTrack : audioTracks) { grid.add(createAudioButton(audioTrack, mediaPlayerManager.getPlayingAudioTrack())); } } } - private void addOverlappingMediaTracksTo(Collection reachableVideoTracks, - Collection reachableAudioTracks) { - for (MediaTrack mediaTrack : mediaPlayerManager.getOverlappingMediaTracks()) { - if (mediaTrack.mimeType != null) { - switch (mediaTrack.mimeType.mediaType) { - case video: - reachableVideoTracks.add(mediaTrack); - case audio: // intentional fall through - reachableAudioTracks.add(mediaTrack); - case image: // no image media tracks produced by an image - break; - case unknown: // we won't overlay an unknown media source - break; - default: - break; - } - } - } - } - - private void addAssignedMediaTracksTo(Collection reachableVideoTracks, - Collection reachableAudioTracks) { - for (MediaTrack mediaTrack : mediaPlayerManager.getAssignedMediaTracks()) { + private void filterGivenMediaTracksTo(Collection videoTracks, + Collection audioTracks, Iterable source) { + for (MediaTrack mediaTrack : source) { if (mediaTrack.mimeType == null) { - reachableVideoTracks.add(mediaTrack); // allow user to remove this strange artifact + videoTracks.add(mediaTrack); // allow user to remove this strange artifact } else { switch (mediaTrack.mimeType.mediaType) { case video: - reachableVideoTracks.add(mediaTrack); - case audio: // intentional fall through - reachableAudioTracks.add(mediaTrack); - case image: // images don't play as video tracks + videoTracks.add(mediaTrack); break; - case unknown: // unknown formats won't be played either + case audio: + audioTracks.add(mediaTrack); + break; + case image: + case unknown: break; default: break; @@ -143,12 +124,26 @@ public class MediaManagementControl extends AbstractMediaSelectionControl implem } private Widget createVideoOptions(final MediaTrack videoTrack, Set selectedVideos) { - CheckBox playCheckBox = createPlayCheckBox(videoTrack, selectedVideos); + CheckBox videoCheckBox = new CheckBox(videoTrack.title); + videoCheckBoxes.put(videoTrack, videoCheckBox); + videoCheckBox.setTitle(videoTrack.toString()); + videoCheckBox.setValue(selectedVideos.contains(videoTrack)); + videoCheckBox.addValueChangeHandler(new ValueChangeHandler() { + + @Override + public void onValueChange(ValueChangeEvent changeEvent) { + if (changeEvent.getValue()) { + mediaPlayerManager.playFloatingVideo(videoTrack); + } else { + mediaPlayerManager.closeFloatingVideo(videoTrack); + } + } + }); if (mediaPlayerManager.allowsEditing()) { HorizontalPanel panel = new HorizontalPanel(); panel.setWidth("100%"); - panel.add(playCheckBox); + panel.add(videoCheckBox); Button deleteButton = createDeleteButton(videoTrack); panel.add(deleteButton); @@ -157,10 +152,10 @@ public class MediaManagementControl extends AbstractMediaSelectionControl implem panel.add(connectButton); panel.setCellHorizontalAlignment(connectButton, HasHorizontalAlignment.ALIGN_RIGHT); panel.setCellWidth(connectButton, "13"); - setEnableOfVideoTrack(connectButton, connectButton.getValue()); + setVideoPlayCheckboxEnabled(videoTrack, connectButton.getValue()); return panel; } else { - return playCheckBox; + return videoCheckBox; } } @@ -184,16 +179,9 @@ public class MediaManagementControl extends AbstractMediaSelectionControl implem return connectButton; } - private void setEnableOfVideoTrack(ToggleButton connectButton, boolean enable) { - Panel videoTrack = (HorizontalPanel)connectButton.getParent(); - for (Widget widget : videoTrack) { - if(widget != connectButton && widget instanceof FocusWidget){ - ((FocusWidget)widget).setEnabled(enable); - if(widget instanceof CheckBox){ - ((CheckBox)widget).setValue(false); - } - } - } + private void setVideoPlayCheckboxEnabled(MediaTrack videoTrack, boolean enable) { + CheckBox videoCheckBox = videoCheckBoxes.get(videoTrack); + videoCheckBox.setEnabled(enable); } private void disconnectVideoFromRace(final MediaTrack videoTrack, final ToggleButton connectButton) { @@ -207,7 +195,7 @@ public class MediaManagementControl extends AbstractMediaSelectionControl implem @Override public void onSuccess(Void allMediaTracks) { - setEnableOfVideoTrack(connectButton, false); + setVideoPlayCheckboxEnabled(videoTrack, false); mediaPlayerManager.closeFloatingVideo(videoTrack); } }); @@ -225,7 +213,7 @@ public class MediaManagementControl extends AbstractMediaSelectionControl implem @Override public void onSuccess(Void allMediaTracks) { - setEnableOfVideoTrack(connectButton, true); + setVideoPlayCheckboxEnabled(videoTrack, true); } }); } @@ -242,44 +230,6 @@ public class MediaManagementControl extends AbstractMediaSelectionControl implem return deleteButton; } - private CheckBox createPlayCheckBox(final MediaTrack videoTrack, Set selectedVideos) { - CheckBox videoCheckBox = new CheckBox(videoTrack.title); - videoCheckBoxes.put(videoTrack, videoCheckBox); - videoCheckBox.setTitle(videoTrack.toString()); - videoCheckBox.setValue(selectedVideos.contains(videoTrack)); - videoCheckBox.addValueChangeHandler(new ValueChangeHandler() { - - @Override - public void onValueChange(ValueChangeEvent changeEvent) { - if (changeEvent.getValue()) { - mediaPlayerManager.playFloatingVideo(videoTrack); - } else { - mediaPlayerManager.closeFloatingVideo(videoTrack); - } - } - }); - return videoCheckBox; - } - - public void selectVideo(MediaTrack videoTrack) { - CheckBox videoCheckBox = videoCheckBoxes.get(videoTrack); - if (videoCheckBox != null) { - videoCheckBox.setValue(true); - } - } - - public void unselectVideo(MediaTrack videoTrack) { - CheckBox videoCheckBox = videoCheckBoxes.get(videoTrack); - if (videoCheckBox != null) { - videoCheckBox.setValue(false); - } - } - - private Widget createVideoHeader() { - Label audioHeader = new Label("Videos"); - return audioHeader; - } - private Widget createAudioButton(final MediaTrack audioTrack, MediaTrack selectedAudioTrack) { String label = audioTrack != null ? audioTrack.title : "Sound off"; String title = audioTrack != null ? audioTrack.toString() : "Turn off all sound channels."; @@ -287,7 +237,6 @@ public class MediaManagementControl extends AbstractMediaSelectionControl implem audioButton.setTitle(title); audioButton.setValue(audioTrack == selectedAudioTrack); audioButton.addValueChangeHandler(new ValueChangeHandler() { - @Override public void onValueChange(ValueChangeEvent changeEvent) { if (changeEvent.getValue()) { @@ -295,12 +244,19 @@ public class MediaManagementControl extends AbstractMediaSelectionControl implem } } }); - return audioButton; - } - private Widget createAudioHeader() { - Label audioHeader = new Label("Audio Tracks"); - return audioHeader; + if (mediaPlayerManager.allowsEditing() && audioTrack != null) { + HorizontalPanel panel = new HorizontalPanel(); + panel.setWidth("100%"); + panel.add(audioButton); + + Button deleteButton = createDeleteButton(audioTrack); + panel.add(deleteButton); + panel.setCellHorizontalAlignment(deleteButton, HasHorizontalAlignment.ALIGN_RIGHT); + return panel; + } else { + return audioButton; + } } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/MediaPlayerManagerComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/MediaPlayerManagerComponent.java index d6ae2ca9216..88d0ba2d4e6 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/MediaPlayerManagerComponent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/MediaPlayerManagerComponent.java @@ -10,7 +10,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.MediaElement; import com.google.gwt.dom.client.VideoElement; import com.google.gwt.event.logical.shared.CloseEvent; @@ -25,7 +24,6 @@ import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.media.MediaTrack; -import com.sap.sailing.domain.common.media.MediaTrack.Status; import com.sap.sailing.domain.common.security.Permission; import com.sap.sailing.domain.common.security.SailingPermissionsForRoleProvider; import com.sap.sailing.gwt.ui.client.MediaServiceAsync; @@ -73,6 +71,7 @@ public class MediaPlayerManagerComponent extends AbstractComponent activeVideoContainers = new HashMap(); private Collection assignedMediaTracks = new ArrayList<>(); private Collection overlappingMediaTracks = new ArrayList<>(); + private Map mediaTrackStatus = new HashMap<>(); private final RegattaAndRaceIdentifier raceIdentifier; private final RaceTimesInfoProvider raceTimesInfoProvider; @@ -87,6 +86,23 @@ public class MediaPlayerManagerComponent extends AbstractComponent playerChangeListener = new ArrayList<>(); + public enum Status { + UNDEFINED('?'), + CANNOT_PLAY('-'), + NOT_REACHABLE('#'), + REACHABLE('+'); + + private final char symbol; + + private Status(char symbol) { + this.symbol = symbol; + } + + public String toString() { + return String.valueOf(this.symbol); + } + } + public MediaPlayerManagerComponent(Component parent, ComponentContext context, MediaPlayerLifecycle mediaPlayerLifecycle, RegattaAndRaceIdentifier selectedRaceIdentifier, @@ -116,13 +132,15 @@ public class MediaPlayerManagerComponent extends AbstractComponent Youtube videos can't be played for audio-only. - // So add a video player first. - playFloatingVideo(audioTrack); - } + playFloatingVideo(audioTrack); VideoContainer playingVideoContainer = activeVideoContainers.get(audioTrack); - if (playingVideoContainer != null) { - VideoPlayer playingVideoPlayer = playingVideoContainer.getVideoPlayer(); - activeAudioPlayer = playingVideoPlayer; - activeAudioPlayer.setMuted(false); - } else { - assignNewAudioPlayer(audioTrack); - } + activeAudioPlayer = playingVideoContainer.getVideoPlayer(); + activeAudioPlayer.setMuted(false); notifyStateChange(); } else { // nothing changed @@ -405,14 +410,7 @@ public class MediaPlayerManagerComponent extends AbstractComponent then reset active audio player - - if (activeVideoContainers.containsKey(activeAudioPlayer.getMediaTrack())) { // pre-change audioPlayer is one - // of the - // videoPlayers - activeAudioPlayer.setMuted(true); - } else { // pre-change audioPlayer is a dedicated audio-only player - activeAudioPlayer.shutDown(); - } + activeAudioPlayer.shutDown(); activeAudioPlayer = null; notifyStateChange(); } else { @@ -484,6 +482,7 @@ public class MediaPlayerManagerComponent extends AbstractComponenttrue if the player is running in full screen mode, false otherwise */ public native boolean isFullscreen() /*-{ - if(this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player == null) { + if (this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player == null) { return false; } - return this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player.isFullscreen(); + return this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player + .isFullscreen(); }-*/; /** @@ -203,10 +225,11 @@ public class VideoJSPlayer extends Widget implements RequiresResize { * @return true if the player is paused, false if it is playing */ public native boolean paused() /*-{ - if(this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player == null) { + if (this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player == null) { return true; } - return this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player.paused(); + return this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player + .paused(); }-*/; private void onPlay() { @@ -225,58 +248,66 @@ public class VideoJSPlayer extends Widget implements RequiresResize { native void _onLoad(boolean autoplay, boolean withPanorama, String messageThreeSixty) /*-{ var that = this; var elemid = this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::elementId; - - var player = $wnd.videojs( - elemid, - { - "playsInline" : true, - "customControlsOnMobile" : true - }).ready(function() { - this.on('play', function() { - that.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::onPlay()(); - }); - this.on('pause', function() { - that.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::onPause()(); - }); - - console.log("play: " + autoplay); - if (autoplay) { - this.play(); - } - }); - if(withPanorama){ - player.panorama({ - showNotice:true, - autoMobileOrientation: true, - clickAndDrag: true, - clickToToggle: false, - NoticeMessage: messageThreeSixty, - backToVerticalCenter: false, - backToHorizonCenter: false, + + var player = $wnd + .videojs(elemid, { + "playsInline" : true, + "customControlsOnMobile" : true + }) + .ready( + function() { + this + .on( + 'play', + function() { + that.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::onPlay()(); + }); + this + .on( + 'pause', + function() { + that.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::onPause()(); + }); + + console.log("play: " + autoplay); + if (autoplay) { + this.play(); + } + }); + if (withPanorama) { + player.panorama({ + showNotice : true, + autoMobileOrientation : true, + clickAndDrag : true, + clickToToggle : false, + NoticeMessage : messageThreeSixty, + backToVerticalCenter : false, + backToHorizonCenter : false, }); } - + this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player = player; }-*/; private native void disposeNative() /*-{ - var player = this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player; - player.dispose(); + var player = this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player; + player.dispose(); }-*/; private native void handleResize() /*-{ var player = this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player; var canvas = player.getChild('Canvas'); - if(canvas){ + if (canvas) { canvas.handleResize(); } }-*/; public native void pause() /*-{ - if(this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player == null) { + if (this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player == null) { return; } - return this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player.pause(); + return this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player + .pause(); }-*/; public int getVideoWidth() { @@ -302,7 +333,8 @@ public class VideoJSPlayer extends Widget implements RequiresResize { } private native void setVolumeNative(float volume) /*-{ - this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player.volume(volume); + this.@com.sap.sailing.gwt.ui.client.media.VideoJSPlayer::player + .volume(volume); }-*/; public void setPlaybackRate(double newPlaySpeedFactor) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/VideoJSPlayer.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/VideoJSPlayer.ui.xml index 1e32751182c..9d0222a4ac9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/VideoJSPlayer.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/VideoJSPlayer.ui.xml @@ -15,7 +15,6 @@ transform: rotate(180deg) translateX(50%) translateZ(0) !important; } -
- +
\ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/popup/VideoPopupWindow.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/popup/VideoPopupWindow.java index dadb217de4e..cdfe634674c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/popup/VideoPopupWindow.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/popup/VideoPopupWindow.java @@ -1,6 +1,6 @@ package com.sap.sailing.gwt.ui.client.media.popup; -import com.google.gwt.dom.client.VideoElement; +import com.google.gwt.dom.client.Element; import com.google.gwt.event.dom.client.ContextMenuEvent; import com.google.gwt.event.dom.client.ContextMenuHandler; import com.google.gwt.user.client.Window; @@ -39,12 +39,12 @@ public class VideoPopupWindow extends AbstractPopupWindow implements ContextMenu - native void initPlay(VideoElement videoElement) /*-{ + native void initPlay(Element videoElement) /*-{ var that = this; - var deferredPlayState = $wnd.deferredPlayState - if (deferredPlayState && !$wnd.videoPlayer) { - that.@com.sap.sailing.gwt.ui.client.media.popup.VideoPopupWindow::initPlayState(DZDZ)(deferredPlayState.deferredMediaTime, deferredPlayState.deferredIsMuted, deferredPlayState.deferredPlaybackSpeed, deferredPlayState.deferredIsPlaying); - } + var deferredPlayState = $wnd.deferredPlayState + if (deferredPlayState && !$wnd.videoPlayer) { + that.@com.sap.sailing.gwt.ui.client.media.popup.VideoPopupWindow::initPlayState(DZDZ)(deferredPlayState.deferredMediaTime, deferredPlayState.deferredIsMuted, deferredPlayState.deferredPlaybackSpeed, deferredPlayState.deferredIsPlaying); + } }-*/; public void loadedmetadata() {