diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTimeBar.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTimeBar.java index cc1e63bec6..523c7fd73d 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTimeBar.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTimeBar.java @@ -76,6 +76,7 @@ public class DefaultTimeBar extends View implements TimeBar { private final Paint bufferedPaint; private final Paint unplayedPaint; private final Paint adMarkerPaint; + private final Paint playedAdMarkerPaint; private final Paint scrubberPaint; private final int barHeight; private final int touchTargetHeight; @@ -103,6 +104,7 @@ public class DefaultTimeBar extends View implements TimeBar { private long bufferedPosition; private int adGroupCount; private long[] adGroupTimesMs; + private boolean[] playedAdGroups; /** * Creates a new time bar. @@ -117,6 +119,7 @@ public class DefaultTimeBar extends View implements TimeBar { bufferedPaint = new Paint(); unplayedPaint = new Paint(); adMarkerPaint = new Paint(); + playedAdMarkerPaint = new Paint(); scrubberPaint = new Paint(); scrubberPaint.setAntiAlias(true); @@ -155,11 +158,14 @@ public class DefaultTimeBar extends View implements TimeBar { getDefaultUnplayedColor(playedColor)); int adMarkerColor = a.getInt(R.styleable.DefaultTimeBar_ad_marker_color, DEFAULT_AD_MARKER_COLOR); + int playedAdMarkerColor = a.getInt(R.styleable.DefaultTimeBar_played_ad_marker_color, + getDefaultPlayedAdMarkerColor(adMarkerColor)); playedPaint.setColor(playedColor); scrubberPaint.setColor(scrubberColor); bufferedPaint.setColor(bufferedColor); unplayedPaint.setColor(unplayedColor); adMarkerPaint.setColor(adMarkerColor); + playedAdMarkerPaint.setColor(playedAdMarkerColor); } finally { a.recycle(); } @@ -238,10 +244,13 @@ public class DefaultTimeBar extends View implements TimeBar { } @Override - public void setAdGroupTimesMs(@Nullable long[] adGroupTimesMs, int adGroupCount) { - Assertions.checkArgument(adGroupCount == 0 || adGroupTimesMs != null); + public void setAdGroupTimesMs(@Nullable long[] adGroupTimesMs, @Nullable boolean[] playedAdGroups, + int adGroupCount) { + Assertions.checkArgument(adGroupCount == 0 + || (adGroupTimesMs != null && playedAdGroups != null)); this.adGroupCount = adGroupCount; this.adGroupTimesMs = adGroupTimesMs; + this.playedAdGroups = playedAdGroups; update(); } @@ -524,7 +533,8 @@ public class DefaultTimeBar extends View implements TimeBar { (int) (progressBar.width() * adGroupTimeMs / duration) - adMarkerOffset; int markerLeft = progressBar.left + Math.min(progressBar.width() - adMarkerWidth, Math.max(0, markerPositionOffset)); - canvas.drawRect(markerLeft, barTop, markerLeft + adMarkerWidth, barBottom, adMarkerPaint); + Paint paint = playedAdGroups[i] ? playedAdMarkerPaint : adMarkerPaint; + canvas.drawRect(markerLeft, barTop, markerLeft + adMarkerWidth, barBottom, paint); } } @@ -590,4 +600,8 @@ public class DefaultTimeBar extends View implements TimeBar { return 0xCC000000 | (playedColor & 0x00FFFFFF); } + private static int getDefaultPlayedAdMarkerColor(int adMarkerColor) { + return 0x33000000 | (adMarkerColor & 0x00FFFFFF); + } + } diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlaybackControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlaybackControlView.java index ce047fbbcd..3559512568 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlaybackControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlaybackControlView.java @@ -313,6 +313,7 @@ public class PlaybackControlView extends FrameLayout { private @RepeatToggleModes int repeatToggleModes; private long hideAtMs; private long[] adGroupTimesMs; + private boolean[] playedAdGroups; private final Runnable updateProgressAction = new Runnable() { @Override @@ -364,6 +365,7 @@ public class PlaybackControlView extends FrameLayout { formatBuilder = new StringBuilder(); formatter = new Formatter(formatBuilder, Locale.getDefault()); adGroupTimesMs = new long[0]; + playedAdGroups = new boolean[0]; componentListener = new ComponentListener(); controlDispatcher = DEFAULT_CONTROL_DISPATCHER; @@ -724,10 +726,6 @@ public class PlaybackControlView extends FrameLayout { } for (int adGroupIndex = 0; adGroupIndex < period.getAdGroupCount(); adGroupIndex++) { long adGroupTimeUs = period.getAdGroupTimeUs(adGroupIndex); - if (period.hasPlayedAdGroup(adGroupIndex)) { - // Don't show played ad groups. - continue; - } if (adGroupTimeUs == C.TIME_END_OF_SOURCE) { adGroupTimeUs = periodDurationUs; } @@ -736,10 +734,13 @@ public class PlaybackControlView extends FrameLayout { } if (adGroupTimeUs >= 0 && adGroupTimeUs <= window.durationUs) { if (adGroupTimesMsCount == adGroupTimesMs.length) { - adGroupTimesMs = Arrays.copyOf(adGroupTimesMs, - adGroupTimesMs.length == 0 ? 1 : adGroupTimesMs.length * 2); + int newLength = adGroupTimesMs.length == 0 ? 1 : adGroupTimesMs.length * 2; + adGroupTimesMs = Arrays.copyOf(adGroupTimesMs, newLength); + playedAdGroups = Arrays.copyOf(playedAdGroups, newLength); } - adGroupTimesMs[adGroupTimesMsCount++] = C.usToMs(durationUs + adGroupTimeUs); + adGroupTimesMs[adGroupTimesMsCount] = C.usToMs(durationUs + adGroupTimeUs); + playedAdGroups[adGroupTimesMsCount] = period.hasPlayedAdGroup(adGroupIndex); + adGroupTimesMsCount++; } } if (i < periodIndex) { @@ -757,7 +758,7 @@ public class PlaybackControlView extends FrameLayout { bufferedPosition += player.getBufferedPosition(); } if (timeBar != null) { - timeBar.setAdGroupTimesMs(adGroupTimesMs, adGroupTimesMsCount); + timeBar.setAdGroupTimesMs(adGroupTimesMs, playedAdGroups, adGroupTimesMsCount); } } else { position = player.getCurrentPosition(); diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/TimeBar.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/TimeBar.java index 44a7687089..4b448738d3 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/TimeBar.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/TimeBar.java @@ -78,13 +78,17 @@ public interface TimeBar { void setDuration(long duration); /** - * Sets the times of ad groups. + * Sets the times of ad groups and whether each ad group has been played. * * @param adGroupTimesMs An array where the first {@code adGroupCount} elements are the times of * ad groups in milliseconds. May be {@code null} if there are no ad groups. + * @param playedAdGroups An array where the first {@code adGroupCount} elements indicate whether + * the corresponding ad groups have been played. May be {@code null} if there are no ad + * groups. * @param adGroupCount The number of ad groups. */ - void setAdGroupTimesMs(@Nullable long[] adGroupTimesMs, int adGroupCount); + void setAdGroupTimesMs(@Nullable long[] adGroupTimesMs, @Nullable boolean[] playedAdGroups, + int adGroupCount); /** * Listener for scrubbing events. diff --git a/library/ui/src/main/res/values/attrs.xml b/library/ui/src/main/res/values/attrs.xml index ecf3900751..d1f45228b1 100644 --- a/library/ui/src/main/res/values/attrs.xml +++ b/library/ui/src/main/res/values/attrs.xml @@ -79,6 +79,7 @@ +