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

Commit 0068d59

Browse files
authored
Fixes #2545 Multiple media elements handling (#3201)
* Reset the media state when location changes * Better media elements handling
1 parent 2a620a1 commit 0068d59

File tree

5 files changed

+49
-26
lines changed

5 files changed

+49
-26
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@ public class Media implements MediaElement.Delegate {
2323
private MediaElement mMedia;
2424
private CopyOnWriteArrayList<MediaElement.Delegate> mMediaListeners;
2525
private ResizeDelegate mResizeDelegate;
26+
private long mLastStateUpdate;
2627

2728
public Media(@NonNull MediaElement aMediaElement) {
2829
mMedia = aMediaElement;
2930
mMediaListeners = new CopyOnWriteArrayList<>();
3031
aMediaElement.setDelegate(this);
32+
mLastStateUpdate = 0;
3133
}
3234

3335
public void addMediaListener(MediaElement.Delegate aListener) {
@@ -113,6 +115,10 @@ public void setMuted(boolean aIsMuted) {
113115
mMedia.setMuted(aIsMuted);
114116
}
115117

118+
public long getLastStateUpdate() {
119+
return mLastStateUpdate;
120+
}
121+
116122
public void unload() {
117123
mIsUnloaded = true;
118124
mMediaListeners.clear();
@@ -149,6 +155,7 @@ public void onPlaybackStateChange(MediaElement mediaElement, int playbackState)
149155
mPlaying = false;
150156
mIsUnloaded = true;
151157
}
158+
mLastStateUpdate = System.currentTimeMillis();
152159
mMediaListeners.forEach(listener -> listener.onPlaybackStateChange(mediaElement, playbackState));
153160
}
154161

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.mozilla.vrbrowser.browser;
22

3+
import androidx.annotation.NonNull;
4+
35
public interface VideoAvailabilityListener {
4-
default void onVideoAvailabilityChanged(boolean aVideosAvailable) {}
6+
default void onVideoAvailabilityChanged(@NonNull Media media, boolean aVideoAvailable) {}
57
}

app/src/common/shared/org/mozilla/vrbrowser/browser/engine/Session.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,12 @@
4949

5050
import java.net.URI;
5151
import java.net.URISyntaxException;
52+
import java.util.Comparator;
5253
import java.util.concurrent.CompletableFuture;
5354
import java.util.concurrent.CopyOnWriteArrayList;
5455
import java.util.concurrent.atomic.AtomicBoolean;
5556
import java.util.concurrent.atomic.AtomicInteger;
57+
import java.util.function.Predicate;
5658

5759
import static java.util.Objects.requireNonNull;
5860
import static org.mozilla.vrbrowser.utils.ServoUtils.createServoSession;
@@ -247,7 +249,9 @@ private void dumpState(GeckoSession.ContentDelegate aListener) {
247249
}
248250

249251
private void dumpState(VideoAvailabilityListener aListener) {
250-
aListener.onVideoAvailabilityChanged(mState.mMediaElements != null && mState.mMediaElements.size() > 0);
252+
mState.mMediaElements.forEach(element -> {
253+
aListener.onVideoAvailabilityChanged(element,true);
254+
});
251255
}
252256

253257
private void dumpState(WebXRStateChangedListener aListener) {
@@ -690,6 +694,7 @@ public boolean isFirstContentfulPaint() {
690694
return mFirstContentfulPaint;
691695
}
692696

697+
@Nullable
693698
public Media getFullScreenVideo() {
694699
for (Media media: mState.mMediaElements) {
695700
if (media.isFullscreen()) {
@@ -703,6 +708,19 @@ public Media getFullScreenVideo() {
703708
return null;
704709
}
705710

711+
@Nullable
712+
public Media getActiveVideo() {
713+
for (Media media: mState.mMediaElements) {
714+
if (media.isFullscreen()) {
715+
return media;
716+
}
717+
}
718+
return mState.mMediaElements.stream()
719+
.sorted((o1, o2) -> (int)o2.getLastStateUpdate() - (int)o1.getLastStateUpdate())
720+
.filter(Media::isPlayed)
721+
.findFirst().orElse(null);
722+
}
723+
706724
public boolean isInputActive() {
707725
return mState.mIsInputActive;
708726
}
@@ -1448,7 +1466,7 @@ public void onMediaAdd(@NonNull GeckoSession aSession, @NonNull MediaElement ele
14481466
mState.mMediaElements.add(media);
14491467

14501468
for (VideoAvailabilityListener listener: mVideoAvailabilityListeners) {
1451-
listener.onVideoAvailabilityChanged(true);
1469+
listener.onVideoAvailabilityChanged(media, true);
14521470
}
14531471
}
14541472

@@ -1462,10 +1480,8 @@ public void onMediaRemove(@NonNull GeckoSession aSession, @NonNull MediaElement
14621480
if (media.getMediaElement() == element) {
14631481
media.unload();
14641482
mState.mMediaElements.remove(i);
1465-
if (mState.mMediaElements.size() == 0) {
1466-
for (VideoAvailabilityListener listener: mVideoAvailabilityListeners) {
1467-
listener.onVideoAvailabilityChanged(false);
1468-
}
1483+
for (VideoAvailabilityListener listener: mVideoAvailabilityListeners) {
1484+
listener.onVideoAvailabilityChanged(media, false);
14691485
}
14701486
return;
14711487
}

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

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1668,37 +1668,29 @@ public void onExternalResponse(@NonNull GeckoSession geckoSession, @NonNull Geck
16681668

16691669
// VideoAvailabilityListener
16701670

1671-
private Media mMedia;
1672-
16731671
@Override
1674-
public void onVideoAvailabilityChanged(boolean aVideosAvailable) {
1672+
public void onVideoAvailabilityChanged(@NonNull Media aMedia, boolean aVideoAvailable) {
16751673
boolean mediaAvailable;
16761674
if (mSession != null) {
1677-
if (mMedia != null) {
1678-
mMedia.removeMediaListener(mMediaDelegate);
1679-
}
1680-
1681-
mMedia = mSession.getFullScreenVideo();
1682-
if (aVideosAvailable && mMedia != null) {
1683-
mMedia.addMediaListener(mMediaDelegate);
1684-
mediaAvailable = true;
1675+
if (aVideoAvailable) {
1676+
aMedia.addMediaListener(mMediaDelegate);
16851677

16861678
} else {
1687-
mediaAvailable = false;
1679+
aMedia.removeMediaListener(mMediaDelegate);
16881680
}
1681+
mediaAvailable = mSession.getActiveVideo() != null;
16891682

16901683
} else {
16911684
mediaAvailable = false;
16921685
}
16931686

16941687
if (mediaAvailable) {
1695-
if (mSession.getFullScreenVideo().isPlayed()) {
1696-
mViewModel.setIsMediaAvailable(true);
1688+
if (mSession.getActiveVideo().isPlayed()) {
16971689
mViewModel.setIsMediaPlaying(true);
16981690
}
1691+
mViewModel.setIsMediaAvailable(true);
16991692

17001693
} else {
1701-
mMedia = null;
17021694
mViewModel.setIsMediaAvailable(false);
17031695
mViewModel.setIsMediaPlaying(false);
17041696
}
@@ -1754,6 +1746,8 @@ public void captureImage() {
17541746
public void onLocationChange(@NonNull GeckoSession session, @Nullable String url) {
17551747
mViewModel.setUrl(url);
17561748
mViewModel.setIsDrmUsed(false);
1749+
mViewModel.setIsMediaAvailable(false);
1750+
mViewModel.setIsMediaPlaying(false);
17571751

17581752
if (StringUtils.isEmpty(url)) {
17591753
mViewModel.setIsBookmarked(false);

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1085,17 +1085,21 @@ public void onTitleClicked(@NonNull TitleBarWidget titleBar) {
10851085
@Override
10861086
public void onMediaPlayClicked(@NonNull TitleBarWidget titleBar) {
10871087
for (WindowWidget window : getCurrentWindows()) {
1088-
if (window.getTitleBar() == titleBar) {
1089-
window.getSession().getFullScreenVideo().play();
1088+
if (window.getTitleBar() == titleBar &&
1089+
window.getSession() != null &&
1090+
window.getSession().getActiveVideo() != null) {
1091+
window.getSession().getActiveVideo().play();
10901092
}
10911093
}
10921094
}
10931095

10941096
@Override
10951097
public void onMediaPauseClicked(@NonNull TitleBarWidget titleBar) {
10961098
for (WindowWidget window : getCurrentWindows()) {
1097-
if (window.getTitleBar() == titleBar) {
1098-
window.getSession().getFullScreenVideo().pause();
1099+
if (window.getTitleBar() == titleBar &&
1100+
window.getSession() != null &&
1101+
window.getSession().getActiveVideo() != null) {
1102+
window.getSession().getActiveVideo().pause();
10991103
}
11001104
}
11011105
}

0 commit comments

Comments
 (0)