Skip to content
This repository was archived by the owner on Jul 22, 2024. It is now read-only.

Commit 7667417

Browse files
keianhzoMortimerGoro
authored andcommitted
Allow multiple listeners for media state updates (#1693)
* Allow multiple listeners for media state updates * Fix PR review issues * Instance the correct class
1 parent 3ad2320 commit 7667417

3 files changed

Lines changed: 26 additions & 37 deletions

File tree

app/src/common/shared/org/mozilla/vrbrowser/browser/Media.java

Lines changed: 22 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package org.mozilla.vrbrowser.browser;
22

3+
import androidx.annotation.NonNull;
4+
35
import org.mozilla.geckoview.MediaElement;
46

5-
import androidx.annotation.NonNull;
6-
import androidx.annotation.Nullable;
7+
import java.util.concurrent.CopyOnWriteArrayList;
78

89
public class Media implements MediaElement.Delegate {
910
private static final String LOGTAG = "VRB";
@@ -17,17 +18,22 @@ public class Media implements MediaElement.Delegate {
1718
private double mVolume = 1.0f;
1819
private boolean mIsMuted = false;
1920
private boolean mIsUnloaded = false;
20-
private org.mozilla.geckoview.MediaElement mMedia;
21-
private MediaElement.Delegate mDelegate;
21+
private MediaElement mMedia;
22+
private CopyOnWriteArrayList<MediaElement.Delegate> mMediaListeners;
2223
private ResizeDelegate mResizeDelegate;
2324

2425
public Media(@NonNull MediaElement aMediaElement) {
2526
mMedia = aMediaElement;
27+
mMediaListeners = new CopyOnWriteArrayList<>();
2628
aMediaElement.setDelegate(this);
2729
}
2830

29-
public void setDelegate(@Nullable MediaElement.Delegate aDelegate) {
30-
mDelegate = aDelegate;
31+
public void addMediaListener(MediaElement.Delegate aListener) {
32+
mMediaListeners.add(aListener);
33+
}
34+
35+
public void removeMediaListener(MediaElement.Delegate aListener) {
36+
mMediaListeners.remove(aListener);
3137
}
3238

3339
public double getDuration() {
@@ -103,7 +109,7 @@ public void setMuted(boolean aIsMuted) {
103109

104110
public void unload() {
105111
mIsUnloaded = true;
106-
mDelegate = null;
112+
mMediaListeners.clear();
107113
}
108114

109115
public int getWidth() {
@@ -132,27 +138,21 @@ public void onPlaybackStateChange(MediaElement mediaElement, int playbackState)
132138
} else if (playbackState == MediaElement.MEDIA_STATE_ENDED) {
133139
mEnded = true;
134140
}
135-
if (mDelegate != null) {
136-
mDelegate.onPlaybackStateChange(mediaElement, playbackState);
137-
}
141+
mMediaListeners.forEach(listener -> listener.onPlaybackStateChange(mediaElement, playbackState));
138142
}
139143

140144
@Override
141145
public void onReadyStateChange(MediaElement mediaElement, int readyState) {
142146
mReadyState = readyState;
143-
if (mDelegate != null) {
144-
mDelegate.onReadyStateChange(mediaElement, readyState);
145-
}
147+
mMediaListeners.forEach(listener -> listener.onReadyStateChange(mediaElement, readyState));
146148
}
147149

148150
@Override
149151
public void onMetadataChange(MediaElement mediaElement, MediaElement.Metadata metaData) {
150152
final int oldWidth = getWidth();
151153
final int oldHeight = getHeight();
152154
mMetaData = metaData;
153-
if (mDelegate != null) {
154-
mDelegate.onMetadataChange(mediaElement, metaData);
155-
}
155+
mMediaListeners.forEach(listener -> listener.onMetadataChange(mediaElement, metaData));
156156

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

166166
@Override
167167
public void onLoadProgress(MediaElement mediaElement, MediaElement.LoadProgressInfo progressInfo) {
168-
if (mDelegate != null) {
169-
mDelegate.onLoadProgress(mediaElement, progressInfo);
170-
}
168+
mMediaListeners.forEach(listener -> listener.onLoadProgress(mediaElement, progressInfo));
171169
}
172170

173171
@Override
174172
public void onVolumeChange(MediaElement mediaElement, double volume, boolean muted) {
175173
mVolume = volume;
176174
mIsMuted = muted;
177-
if (mDelegate != null) {
178-
mDelegate.onVolumeChange(mediaElement, volume, muted);
179-
}
175+
mMediaListeners.forEach(listener -> listener.onVolumeChange(mediaElement, volume, muted));
180176
}
181177

182178
@Override
@@ -186,31 +182,23 @@ public void onTimeChange(MediaElement mediaElement, double time) {
186182
if (duration <= 0 || mCurrentTime < getDuration()) {
187183
mEnded = false;
188184
}
189-
if (mDelegate != null) {
190-
mDelegate.onTimeChange(mediaElement, time);
191-
}
185+
mMediaListeners.forEach(listener -> listener.onTimeChange(mediaElement, time));
192186
}
193187

194188
@Override
195189
public void onPlaybackRateChange(MediaElement mediaElement, double rate) {
196190
mPlaybackRate = rate;
197-
if (mDelegate != null) {
198-
mDelegate.onPlaybackRateChange(mediaElement, rate);
199-
}
191+
mMediaListeners.forEach(listener -> listener.onPlaybackRateChange(mediaElement, rate));
200192
}
201193

202194
@Override
203195
public void onFullscreenChange(MediaElement mediaElement, boolean fullscreen) {
204196
mIsFullscreen = fullscreen;
205-
if (mDelegate != null) {
206-
mDelegate.onFullscreenChange(mediaElement, fullscreen);
207-
}
197+
mMediaListeners.forEach(listener -> listener.onFullscreenChange(mediaElement, fullscreen));
208198
}
209199

210200
@Override
211201
public void onError(MediaElement mediaElement, int code) {
212-
if (mDelegate != null) {
213-
mDelegate.onError(mediaElement, code);
214-
}
202+
mMediaListeners.forEach(listener -> listener.onError(mediaElement, code));
215203
}
216204
}

app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/MediaControlsWidget.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ public void setMedia(Media aMedia) {
244244
return;
245245
}
246246
if (mMedia != null) {
247-
mMedia.setDelegate(null);
247+
mMedia.removeMediaListener(this);
248248
}
249249
mMedia = aMedia;
250250
boolean enabled = mMedia != null;
@@ -266,7 +266,7 @@ public void setMedia(Media aMedia) {
266266
onPlaybackStateChange(mMedia.getMediaElement(), MediaElement.MEDIA_STATE_PLAY);
267267
}
268268

269-
mMedia.setDelegate(this);
269+
mMedia.addMediaListener(this);
270270
}
271271

272272
public void setProjectionSelectorEnabled(boolean aEnabled) {

app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TitleBarWidget.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,8 @@ public void mediaAvailabilityChanged(boolean available) {
181181
mMedia = mAttachedWindow.getSessionStack().getFullScreenVideo();
182182
if (mMedia != null) {
183183
mBinding.setIsMediaPlaying(mMedia.isPlaying());
184-
mMedia.setDelegate(mMediaDelegate);
184+
mMedia.removeMediaListener(mMediaDelegate);
185+
mMedia.addMediaListener(mMediaDelegate);
185186
}
186187
}
187188
}

0 commit comments

Comments
 (0)