diff --git a/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java b/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java index 423f72f0e..23fe2fb9b 100644 --- a/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/VideoPlayer.java @@ -648,11 +648,11 @@ public abstract class VideoPlayer extends BasePlayer new SeekBarMarker(segment.startTime, segment.endTime, (int) simpleExoPlayer.getDuration(), color); markableSeekBar.seekBarMarkers.add(seekBarMarker); - markableSeekBar.invalidate(); Log.d("SPONSOR_BLOCK", "Progress bar marker: " + seekBarMarker.percentStart + ", " + seekBarMarker.percentEnd); } + markableSeekBar.drawMarkers(); } private Integer parseSegmentCategory(final String category) { diff --git a/app/src/main/java/org/schabi/newpipe/views/MarkableSeekBar.java b/app/src/main/java/org/schabi/newpipe/views/MarkableSeekBar.java index cad28978d..d37c5c58b 100644 --- a/app/src/main/java/org/schabi/newpipe/views/MarkableSeekBar.java +++ b/app/src/main/java/org/schabi/newpipe/views/MarkableSeekBar.java @@ -1,19 +1,23 @@ package org.schabi.newpipe.views; +import android.annotation.SuppressLint; import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Rect; -import android.graphics.RectF; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; +import android.graphics.drawable.LayerDrawable; import android.util.AttributeSet; import androidx.appcompat.widget.AppCompatSeekBar; +import androidx.core.content.ContextCompat; + +import org.schabi.newpipe.R; import java.util.ArrayList; public class MarkableSeekBar extends AppCompatSeekBar { public ArrayList seekBarMarkers = new ArrayList<>(); - private RectF markerRect = new RectF(); + private Drawable originalProgressDrawable; public MarkableSeekBar(final Context context) { super(context); @@ -29,26 +33,72 @@ public class MarkableSeekBar extends AppCompatSeekBar { super(context, attrs, defStyleAttr); } - protected synchronized void onDraw(final Canvas canvas) { - super.onDraw(canvas); + @Override + public void setProgressDrawable(final Drawable d) { + super.setProgressDrawable(d); - final Drawable progressDrawable = getProgressDrawable(); - final Rect progressDrawableBounds = progressDrawable.getBounds(); + // stored for when we draw (and potentially re-draw) markers + originalProgressDrawable = d; + } + + @Override + protected void onSizeChanged(final int w, final int h, final int oldW, final int oldH) { + super.onSizeChanged(w, h, oldW, oldH); + + // re-draw markers since the progress bar may have a different width + drawMarkers(); + } + + public void drawMarkers() { + if (seekBarMarkers.size() == 0) { + return; + } + + // Markers are drawn like so: + // + // - LayerDrawable (original drawable for the SeekBar) + // - GradientDrawable (background) + // - ScaleDrawable (secondaryProgress) + // - ScaleDrawable (progress) + // - LayerDrawable (we add our markers in a sub-LayerDrawable) + // - Drawable (marker) + // - Drawable (marker) + // - Drawable (marker) + // - etc... final int width = getMeasuredWidth() - (getPaddingStart() + getPaddingEnd()); - final int height = progressDrawable.getIntrinsicHeight(); - for (int i = 0; i < seekBarMarkers.size(); i++) { - final SeekBarMarker marker = seekBarMarkers.get(i); + LayerDrawable layerDrawable = (LayerDrawable) originalProgressDrawable; - markerRect.left = width - (float) Math.floor(width * (1.0 - marker.percentStart)) - + getPaddingStart(); - markerRect.top = progressDrawableBounds.bottom - height - 1; - markerRect.right = width - (float) Math.ceil(width * (1.0 - marker.percentEnd)) - + getPaddingStart(); - markerRect.bottom = progressDrawableBounds.bottom; + final ArrayList markerDrawables = new ArrayList<>(); + markerDrawables.add(layerDrawable); - canvas.drawRect(markerRect, marker.paint); + for (final SeekBarMarker seekBarMarker : seekBarMarkers) { + @SuppressLint("PrivateResource") + final Drawable markerDrawable = + ContextCompat.getDrawable( + getContext(), + R.drawable.abc_scrubber_primary_mtrl_alpha); + + final PorterDuffColorFilter colorFilter = + new PorterDuffColorFilter(seekBarMarker.color, PorterDuff.Mode.SRC_IN); + + assert markerDrawable != null; + markerDrawable.setColorFilter(colorFilter); + + markerDrawables.add(markerDrawable); } + + layerDrawable = new LayerDrawable(markerDrawables.toArray(new Drawable[0])); + + for (int i = 1; i < layerDrawable.getNumberOfLayers(); i++) { + final SeekBarMarker seekBarMarker = seekBarMarkers.get(i - 1); + final int l = (int) (width * seekBarMarker.percentStart); + final int r = (int) (width * (1.0 - seekBarMarker.percentEnd)); + + layerDrawable.setLayerInset(i, l, 0, r, 0); + } + + super.setProgressDrawable(layerDrawable); } } diff --git a/app/src/main/java/org/schabi/newpipe/views/SeekBarMarker.java b/app/src/main/java/org/schabi/newpipe/views/SeekBarMarker.java index 62d13932f..d71b895a3 100644 --- a/app/src/main/java/org/schabi/newpipe/views/SeekBarMarker.java +++ b/app/src/main/java/org/schabi/newpipe/views/SeekBarMarker.java @@ -1,13 +1,11 @@ package org.schabi.newpipe.views; -import android.graphics.Paint; - public class SeekBarMarker { public double startTime; public double endTime; public double percentStart; public double percentEnd; - public Paint paint; + public int color; public Object tag; public SeekBarMarker(final double startTime, @@ -18,19 +16,12 @@ public class SeekBarMarker { this.endTime = endTime; this.percentStart = Math.round((startTime / maxTime) * 100.0) / 100.0; this.percentEnd = Math.round((endTime / maxTime) * 100.0) / 100.0; - - initPaint(color); + this.color = color; } public SeekBarMarker(final double percentStart, final double percentEnd, final int color) { this.percentStart = percentStart; this.percentEnd = percentEnd; - - initPaint(color); - } - - private void initPaint(final int color) { - this.paint = new Paint(); - this.paint.setColor(color); + this.color = color; } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e1e3340e7..4adae4657 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -700,10 +700,10 @@ https://sponsor.ajay.app/api/ https://gist.github.com/ajayyy/aa9f8ded2b573d4f73a3ffa0ef74f796 Skipped sponsor - Skipped intermission/intro segment - Skipped endcards/credits segment - Skipped interaction reminder segment - Skipped unpaid/self promo segment - Skipped non-music segment + Skipped intermission/intro + Skipped endcards/credits + Skipped interaction reminder + Skipped unpaid/self promo + Skipped non-music Toggle skipping sponsors