11package org .mozilla .vrbrowser .browser ;
22
3+ import androidx .annotation .NonNull ;
4+
35import org .mozilla .geckoview .MediaElement ;
46
5- import androidx .annotation .NonNull ;
6- import androidx .annotation .Nullable ;
7+ import java .util .concurrent .CopyOnWriteArrayList ;
78
89public 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}
0 commit comments