Skip to content

Commit 5b1351a

Browse files
authored
chore: hide marker for watched ad, also rename some method names. (#13)
* chore: hide marker for watched ad, also rename some method names. * chore: rename the method names.
1 parent 81eb430 commit 5b1351a

File tree

3 files changed

+57
-35
lines changed

3 files changed

+57
-35
lines changed

libraries/common/src/main/java/androidx/media3/common/endeavor/ExoConfig.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ private static class SingletonHolder {
99
// use L3 only if the widevineSecurityLevel set to "L3", otherwise use L1 (default)
1010
private String widevineSecurityLevel = null;
1111
private boolean obtainKeyIdsFromManifest = true;
12+
private boolean hideMarkerForWatchedAd = true;
1213

1314
private ExoConfig() {
1415
}
@@ -32,4 +33,12 @@ public boolean isObtainKeyIdsFromManifest() {
3233
public void setObtainKeyIdsFromManifest(boolean obtainKeyIdsFromManifest) {
3334
this.obtainKeyIdsFromManifest = obtainKeyIdsFromManifest;
3435
}
36+
37+
public boolean isHideMarkerForWatchedAd() {
38+
return hideMarkerForWatchedAd;
39+
}
40+
41+
public void setHideMarkerForWatchedAd(boolean hideMarkerForWatchedAd) {
42+
this.hideMarkerForWatchedAd = hideMarkerForWatchedAd;
43+
}
3544
}

libraries/common/src/main/java/androidx/media3/common/endeavor/LimitedSeekRange.java

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ private long getDurationMs() {
6565
return useAsLive || isWaitReady() ? C.DCE_UNSET : Math.max(0, endTimeMs - factStartTimeMs);
6666
}
6767

68-
public static boolean isUseAsVod(LimitedSeekRange limitedSeekRange) {
68+
public static boolean isUseLiveAsVod(LimitedSeekRange limitedSeekRange) {
6969
return limitedSeekRange != null && !limitedSeekRange.useAsLive;
7070
}
7171

@@ -91,23 +91,23 @@ private static boolean shouldUseOriginal(long timeMs, LimitedSeekRange limitedSe
9191
return timeMs == C.TIME_UNSET || limitedSeekRange == null || limitedSeekRange.isWaitReady();
9292
}
9393

94-
public static Position revertPosition(long adjustedPositionMs, LimitedSeekRange limitedSeekRange) {
95-
if (shouldUseOriginal(adjustedPositionMs, limitedSeekRange)) {
96-
return Position.legal(adjustedPositionMs);
94+
public static Position scaleSeekbarToTimelineMs(long seekbarMs, LimitedSeekRange limitedSeekRange) {
95+
if (shouldUseOriginal(seekbarMs, limitedSeekRange)) {
96+
return Position.legal(seekbarMs);
9797
}
98-
Position position = toPosition(adjustedPositionMs, limitedSeekRange);
98+
Position position = toPosition(seekbarMs, limitedSeekRange);
9999
return position.offset(limitedSeekRange.timestampOffsetMs);
100100
}
101101

102-
public static Position adjustPosition(long positionMs, LimitedSeekRange limitedSeekRange) {
103-
if (shouldUseOriginal(positionMs, limitedSeekRange)) {
104-
return Position.legal(positionMs);
102+
public static Position scaleTimelineToSeekbarMs(long timelineMs, LimitedSeekRange limitedSeekRange) {
103+
if (shouldUseOriginal(timelineMs, limitedSeekRange)) {
104+
return Position.legal(timelineMs);
105105
}
106-
long adjustedPositionMs = positionMs - limitedSeekRange.timestampOffsetMs;
106+
long adjustedPositionMs = timelineMs - limitedSeekRange.timestampOffsetMs;
107107
return toPosition(adjustedPositionMs, limitedSeekRange);
108108
}
109109

110-
public static long adjustDuration(long durationMs, LimitedSeekRange limitedSeekRange) {
110+
public static long scaleDurationToSeekbarMs(long durationMs, LimitedSeekRange limitedSeekRange) {
111111
if (shouldUseOriginal(durationMs, limitedSeekRange)) {
112112
return durationMs;
113113
}
@@ -117,21 +117,7 @@ public static long adjustDuration(long durationMs, LimitedSeekRange limitedSeekR
117117
return limitedSeekRange.getDurationMs();
118118
}
119119

120-
public static long revertTimestamp(long adjustedTimeMs, LimitedSeekRange limitedSeekRange) {
121-
if (shouldUseOriginal(adjustedTimeMs, limitedSeekRange)) {
122-
return adjustedTimeMs;
123-
}
124-
return adjustedTimeMs + limitedSeekRange.timestampOffsetMs;
125-
}
126-
127-
public static long adjustTimestamp(long timeMs, LimitedSeekRange limitedSeekRange) {
128-
if (shouldUseOriginal(timeMs, limitedSeekRange)) {
129-
return timeMs;
130-
}
131-
return timeMs - limitedSeekRange.timestampOffsetMs;
132-
}
133-
134-
public static @Player.State int adjustPlaybackState(@Player.State int state, LimitedSeekRange limitedSeekRange) {
120+
public static @Player.State int scalePlaybackState(@Player.State int state, LimitedSeekRange limitedSeekRange) {
135121
if (limitedSeekRange != null && limitedSeekRange.playbackEnded) {
136122
return Player.STATE_ENDED;
137123
}

libraries/ui/src/main/java/androidx/media3/ui/PlayerControlView.java

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
import androidx.media3.common.TrackSelectionOverride;
8282
import androidx.media3.common.TrackSelectionParameters;
8383
import androidx.media3.common.Tracks;
84+
import androidx.media3.common.endeavor.ExoConfig;
8485
import androidx.media3.common.endeavor.LimitedSeekRange;
8586
import androidx.media3.common.endeavor.TimelineAdjuster;
8687
import androidx.media3.common.util.Assertions;
@@ -724,8 +725,32 @@ public void setExtraAdGroupMarkers(
724725
} else {
725726
extraPlayedAdGroups = checkNotNull(extraPlayedAdGroups);
726727
Assertions.checkArgument(extraAdGroupTimesMs.length == extraPlayedAdGroups.length);
727-
this.extraAdGroupTimesMs = extraAdGroupTimesMs;
728-
this.extraPlayedAdGroups = extraPlayedAdGroups;
728+
729+
long[] newExtraAdGroupTimesMs = extraAdGroupTimesMs;
730+
boolean[] newExtraPlayedAdGroups = extraPlayedAdGroups;
731+
if (ExoConfig.getInstance().isHideMarkerForWatchedAd()) {
732+
int markerCount = 0;
733+
for (boolean markerPlayed : extraPlayedAdGroups) {
734+
if (!markerPlayed) {
735+
markerCount++;
736+
}
737+
}
738+
if (markerCount != extraPlayedAdGroups.length) {
739+
int index = 0;
740+
newExtraAdGroupTimesMs = new long[markerCount];
741+
newExtraPlayedAdGroups = new boolean[markerCount];
742+
for (int i = 0; i < extraPlayedAdGroups.length; i++) {
743+
if (extraPlayedAdGroups[i]) {
744+
continue;
745+
}
746+
newExtraAdGroupTimesMs[index] = extraAdGroupTimesMs[i];
747+
newExtraPlayedAdGroups[index] = false;
748+
index++;
749+
}
750+
}
751+
}
752+
this.extraAdGroupTimesMs = newExtraAdGroupTimesMs;
753+
this.extraPlayedAdGroups = newExtraPlayedAdGroups;
729754
}
730755
updateTimeline();
731756
}
@@ -741,23 +766,23 @@ public void setLimitedSeekRange(LimitedSeekRange limitedSeekRange) {
741766
}
742767

743768
protected long scaleSeekbarToTimelineMs(long seekbarMs) {
744-
long positionMs = LimitedSeekRange.revertPosition(seekbarMs, limitedSeekRange).getPositionMs();
769+
long positionMs = LimitedSeekRange.scaleSeekbarToTimelineMs(seekbarMs, limitedSeekRange).getPositionMs();
745770
if (timelineAdjuster != null) {
746771
positionMs = timelineAdjuster.scaleSeekbarToTimelineMs(positionMs);
747772
}
748773
return positionMs;
749774
}
750775

751776
protected long scaleTimelineToSeekbarMs(long timelineMs) {
752-
long positionMs = LimitedSeekRange.adjustPosition(timelineMs, limitedSeekRange).getPositionMs();
777+
long positionMs = LimitedSeekRange.scaleTimelineToSeekbarMs(timelineMs, limitedSeekRange).getPositionMs();
753778
if (timelineAdjuster != null) {
754779
positionMs = timelineAdjuster.scaleTimelineToSeekbarMs(positionMs);
755780
}
756781
return positionMs;
757782
}
758783

759-
protected long adjustDuration(long realDurationMs) {
760-
long durationMs = LimitedSeekRange.adjustDuration(realDurationMs, limitedSeekRange);
784+
protected long scaleDurationToSeekbarMs(long realDurationMs) {
785+
long durationMs = LimitedSeekRange.scaleDurationToSeekbarMs(realDurationMs, limitedSeekRange);
761786
if (timelineAdjuster != null) {
762787
durationMs = timelineAdjuster.scaleTimelineToSeekbarMs(durationMs);
763788
}
@@ -1326,7 +1351,9 @@ private void updateTimeline() {
13261351
}
13271352
adGroupTimesMs[adGroupCount] = Util.usToMs(durationUs + adGroupTimeInWindowUs);
13281353
playedAdGroups[adGroupCount] = period.hasPlayedAdGroup(adGroupIndex);
1329-
adGroupCount++;
1354+
if (!playedAdGroups[adGroupCount] || !ExoConfig.getInstance().isHideMarkerForWatchedAd()) {
1355+
adGroupCount++;
1356+
}
13301357
}
13311358
}
13321359
}
@@ -1341,8 +1368,8 @@ private void updateTimeline() {
13411368
// Apply the timeline converter.
13421369
// long durationMs = Util.usToMs(durationUs);
13431370
long realDurationMs = Util.usToMs(durationUs);
1344-
long durationMs = adjustDuration(realDurationMs);
1345-
boolean isVod = LimitedSeekRange.isUseAsVod(limitedSeekRange);
1371+
long durationMs = scaleDurationToSeekbarMs(realDurationMs);
1372+
boolean isVod = LimitedSeekRange.isUseLiveAsVod(limitedSeekRange);
13461373
if (dvrWindowListener != null && player.isCurrentMediaItemLive() && !isVod) {
13471374
dvrWindowListener.onDvrWindowUpdate(realDurationMs > MIN_LENGTH_OF_DVR_MS);
13481375
}
@@ -1395,7 +1422,7 @@ private void updateProgress() {
13951422
// Apply the timeline converter.
13961423
// int playbackState = player == null ? Player.STATE_IDLE : player.getPlaybackState();
13971424
int realPlaybackState = player == null ? Player.STATE_IDLE : player.getPlaybackState();
1398-
int playbackState = LimitedSeekRange.adjustPlaybackState(realPlaybackState, limitedSeekRange);
1425+
int playbackState = LimitedSeekRange.scalePlaybackState(realPlaybackState, limitedSeekRange);
13991426
if (player != null && player.isPlaying() && playbackState != Player.STATE_ENDED) {
14001427
long mediaTimeDelayMs =
14011428
timeBar != null ? timeBar.getPreferredUpdateDelay() : MAX_UPDATE_INTERVAL_MS;

0 commit comments

Comments
 (0)