Skip to content

Commit

Permalink
Allow multiple listeners for media state updates (#1693)
Browse files Browse the repository at this point in the history
* Allow multiple listeners for media state updates

* Fix PR review issues

* Instance the correct class
  • Loading branch information
keianhzo authored and MortimerGoro committed Aug 28, 2019
1 parent 3ad2320 commit 7667417
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 37 deletions.
56 changes: 22 additions & 34 deletions app/src/common/shared/org/mozilla/vrbrowser/browser/Media.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package org.mozilla.vrbrowser.browser;

import androidx.annotation.NonNull;

import org.mozilla.geckoview.MediaElement;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.concurrent.CopyOnWriteArrayList;

public class Media implements MediaElement.Delegate {
private static final String LOGTAG = "VRB";
Expand All @@ -17,17 +18,22 @@ public class Media implements MediaElement.Delegate {
private double mVolume = 1.0f;
private boolean mIsMuted = false;
private boolean mIsUnloaded = false;
private org.mozilla.geckoview.MediaElement mMedia;
private MediaElement.Delegate mDelegate;
private MediaElement mMedia;
private CopyOnWriteArrayList<MediaElement.Delegate> mMediaListeners;
private ResizeDelegate mResizeDelegate;

public Media(@NonNull MediaElement aMediaElement) {
mMedia = aMediaElement;
mMediaListeners = new CopyOnWriteArrayList<>();
aMediaElement.setDelegate(this);
}

public void setDelegate(@Nullable MediaElement.Delegate aDelegate) {
mDelegate = aDelegate;
public void addMediaListener(MediaElement.Delegate aListener) {
mMediaListeners.add(aListener);
}

public void removeMediaListener(MediaElement.Delegate aListener) {
mMediaListeners.remove(aListener);
}

public double getDuration() {
Expand Down Expand Up @@ -103,7 +109,7 @@ public void setMuted(boolean aIsMuted) {

public void unload() {
mIsUnloaded = true;
mDelegate = null;
mMediaListeners.clear();
}

public int getWidth() {
Expand Down Expand Up @@ -132,27 +138,21 @@ public void onPlaybackStateChange(MediaElement mediaElement, int playbackState)
} else if (playbackState == MediaElement.MEDIA_STATE_ENDED) {
mEnded = true;
}
if (mDelegate != null) {
mDelegate.onPlaybackStateChange(mediaElement, playbackState);
}
mMediaListeners.forEach(listener -> listener.onPlaybackStateChange(mediaElement, playbackState));
}

@Override
public void onReadyStateChange(MediaElement mediaElement, int readyState) {
mReadyState = readyState;
if (mDelegate != null) {
mDelegate.onReadyStateChange(mediaElement, readyState);
}
mMediaListeners.forEach(listener -> listener.onReadyStateChange(mediaElement, readyState));
}

@Override
public void onMetadataChange(MediaElement mediaElement, MediaElement.Metadata metaData) {
final int oldWidth = getWidth();
final int oldHeight = getHeight();
mMetaData = metaData;
if (mDelegate != null) {
mDelegate.onMetadataChange(mediaElement, metaData);
}
mMediaListeners.forEach(listener -> listener.onMetadataChange(mediaElement, metaData));

if (mResizeDelegate!= null && metaData != null) {
final int w = getWidth();
Expand All @@ -165,18 +165,14 @@ public void onMetadataChange(MediaElement mediaElement, MediaElement.Metadata me

@Override
public void onLoadProgress(MediaElement mediaElement, MediaElement.LoadProgressInfo progressInfo) {
if (mDelegate != null) {
mDelegate.onLoadProgress(mediaElement, progressInfo);
}
mMediaListeners.forEach(listener -> listener.onLoadProgress(mediaElement, progressInfo));
}

@Override
public void onVolumeChange(MediaElement mediaElement, double volume, boolean muted) {
mVolume = volume;
mIsMuted = muted;
if (mDelegate != null) {
mDelegate.onVolumeChange(mediaElement, volume, muted);
}
mMediaListeners.forEach(listener -> listener.onVolumeChange(mediaElement, volume, muted));
}

@Override
Expand All @@ -186,31 +182,23 @@ public void onTimeChange(MediaElement mediaElement, double time) {
if (duration <= 0 || mCurrentTime < getDuration()) {
mEnded = false;
}
if (mDelegate != null) {
mDelegate.onTimeChange(mediaElement, time);
}
mMediaListeners.forEach(listener -> listener.onTimeChange(mediaElement, time));
}

@Override
public void onPlaybackRateChange(MediaElement mediaElement, double rate) {
mPlaybackRate = rate;
if (mDelegate != null) {
mDelegate.onPlaybackRateChange(mediaElement, rate);
}
mMediaListeners.forEach(listener -> listener.onPlaybackRateChange(mediaElement, rate));
}

@Override
public void onFullscreenChange(MediaElement mediaElement, boolean fullscreen) {
mIsFullscreen = fullscreen;
if (mDelegate != null) {
mDelegate.onFullscreenChange(mediaElement, fullscreen);
}
mMediaListeners.forEach(listener -> listener.onFullscreenChange(mediaElement, fullscreen));
}

@Override
public void onError(MediaElement mediaElement, int code) {
if (mDelegate != null) {
mDelegate.onError(mediaElement, code);
}
mMediaListeners.forEach(listener -> listener.onError(mediaElement, code));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ public void setMedia(Media aMedia) {
return;
}
if (mMedia != null) {
mMedia.setDelegate(null);
mMedia.removeMediaListener(this);
}
mMedia = aMedia;
boolean enabled = mMedia != null;
Expand All @@ -266,7 +266,7 @@ public void setMedia(Media aMedia) {
onPlaybackStateChange(mMedia.getMediaElement(), MediaElement.MEDIA_STATE_PLAY);
}

mMedia.setDelegate(this);
mMedia.addMediaListener(this);
}

public void setProjectionSelectorEnabled(boolean aEnabled) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,8 @@ public void mediaAvailabilityChanged(boolean available) {
mMedia = mAttachedWindow.getSessionStack().getFullScreenVideo();
if (mMedia != null) {
mBinding.setIsMediaPlaying(mMedia.isPlaying());
mMedia.setDelegate(mMediaDelegate);
mMedia.removeMediaListener(mMediaDelegate);
mMedia.addMediaListener(mMediaDelegate);
}
}
}
Expand Down

0 comments on commit 7667417

Please sign in to comment.