SponsorBlock: Changed how MarkableSeekBar draws markers.

These changes should fix issues on different screen densities. Also removed unnecessary "segment" verbiage from toast notification strings.
This commit is contained in:
polymorphicshade 2020-08-16 20:59:59 -06:00
parent f7575da5a5
commit 76c649ada0
4 changed files with 77 additions and 36 deletions

View file

@ -648,11 +648,11 @@ public abstract class VideoPlayer extends BasePlayer
new SeekBarMarker(segment.startTime, segment.endTime, new SeekBarMarker(segment.startTime, segment.endTime,
(int) simpleExoPlayer.getDuration(), color); (int) simpleExoPlayer.getDuration(), color);
markableSeekBar.seekBarMarkers.add(seekBarMarker); markableSeekBar.seekBarMarkers.add(seekBarMarker);
markableSeekBar.invalidate();
Log.d("SPONSOR_BLOCK", "Progress bar marker: " Log.d("SPONSOR_BLOCK", "Progress bar marker: "
+ seekBarMarker.percentStart + ", " + seekBarMarker.percentEnd); + seekBarMarker.percentStart + ", " + seekBarMarker.percentEnd);
} }
markableSeekBar.drawMarkers();
} }
private Integer parseSegmentCategory(final String category) { private Integer parseSegmentCategory(final String category) {

View file

@ -1,19 +1,23 @@
package org.schabi.newpipe.views; package org.schabi.newpipe.views;
import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.graphics.Canvas; import android.graphics.PorterDuff;
import android.graphics.Rect; import android.graphics.PorterDuffColorFilter;
import android.graphics.RectF;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.util.AttributeSet; import android.util.AttributeSet;
import androidx.appcompat.widget.AppCompatSeekBar; import androidx.appcompat.widget.AppCompatSeekBar;
import androidx.core.content.ContextCompat;
import org.schabi.newpipe.R;
import java.util.ArrayList; import java.util.ArrayList;
public class MarkableSeekBar extends AppCompatSeekBar { public class MarkableSeekBar extends AppCompatSeekBar {
public ArrayList<SeekBarMarker> seekBarMarkers = new ArrayList<>(); public ArrayList<SeekBarMarker> seekBarMarkers = new ArrayList<>();
private RectF markerRect = new RectF(); private Drawable originalProgressDrawable;
public MarkableSeekBar(final Context context) { public MarkableSeekBar(final Context context) {
super(context); super(context);
@ -29,26 +33,72 @@ public class MarkableSeekBar extends AppCompatSeekBar {
super(context, attrs, defStyleAttr); super(context, attrs, defStyleAttr);
} }
protected synchronized void onDraw(final Canvas canvas) { @Override
super.onDraw(canvas); public void setProgressDrawable(final Drawable d) {
super.setProgressDrawable(d);
final Drawable progressDrawable = getProgressDrawable(); // stored for when we draw (and potentially re-draw) markers
final Rect progressDrawableBounds = progressDrawable.getBounds(); 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 width = getMeasuredWidth() - (getPaddingStart() + getPaddingEnd());
final int height = progressDrawable.getIntrinsicHeight();
for (int i = 0; i < seekBarMarkers.size(); i++) { LayerDrawable layerDrawable = (LayerDrawable) originalProgressDrawable;
final SeekBarMarker marker = seekBarMarkers.get(i);
markerRect.left = width - (float) Math.floor(width * (1.0 - marker.percentStart)) final ArrayList<Drawable> markerDrawables = new ArrayList<>();
+ getPaddingStart(); markerDrawables.add(layerDrawable);
markerRect.top = progressDrawableBounds.bottom - height - 1;
markerRect.right = width - (float) Math.ceil(width * (1.0 - marker.percentEnd))
+ getPaddingStart();
markerRect.bottom = progressDrawableBounds.bottom;
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);
} }
} }

View file

@ -1,13 +1,11 @@
package org.schabi.newpipe.views; package org.schabi.newpipe.views;
import android.graphics.Paint;
public class SeekBarMarker { public class SeekBarMarker {
public double startTime; public double startTime;
public double endTime; public double endTime;
public double percentStart; public double percentStart;
public double percentEnd; public double percentEnd;
public Paint paint; public int color;
public Object tag; public Object tag;
public SeekBarMarker(final double startTime, public SeekBarMarker(final double startTime,
@ -18,19 +16,12 @@ public class SeekBarMarker {
this.endTime = endTime; this.endTime = endTime;
this.percentStart = Math.round((startTime / maxTime) * 100.0) / 100.0; this.percentStart = Math.round((startTime / maxTime) * 100.0) / 100.0;
this.percentEnd = Math.round((endTime / maxTime) * 100.0) / 100.0; this.percentEnd = Math.round((endTime / maxTime) * 100.0) / 100.0;
this.color = color;
initPaint(color);
} }
public SeekBarMarker(final double percentStart, final double percentEnd, final int color) { public SeekBarMarker(final double percentStart, final double percentEnd, final int color) {
this.percentStart = percentStart; this.percentStart = percentStart;
this.percentEnd = percentEnd; this.percentEnd = percentEnd;
this.color = color;
initPaint(color);
}
private void initPaint(final int color) {
this.paint = new Paint();
this.paint.setColor(color);
} }
} }

View file

@ -700,10 +700,10 @@
<string name="sponsorblock_default_api_url">https://sponsor.ajay.app/api/</string> <string name="sponsorblock_default_api_url">https://sponsor.ajay.app/api/</string>
<string name="sponsorblock_privacy_policy_url">https://gist.github.com/ajayyy/aa9f8ded2b573d4f73a3ffa0ef74f796</string> <string name="sponsorblock_privacy_policy_url">https://gist.github.com/ajayyy/aa9f8ded2b573d4f73a3ffa0ef74f796</string>
<string name="sponsorblock_skip_sponsor_message">Skipped sponsor</string> <string name="sponsorblock_skip_sponsor_message">Skipped sponsor</string>
<string name="sponsorblock_skip_intro_message">Skipped intermission/intro segment</string> <string name="sponsorblock_skip_intro_message">Skipped intermission/intro</string>
<string name="sponsorblock_skip_outro_message">Skipped endcards/credits segment</string> <string name="sponsorblock_skip_outro_message">Skipped endcards/credits</string>
<string name="sponsorblock_skip_interaction_message">Skipped interaction reminder segment</string> <string name="sponsorblock_skip_interaction_message">Skipped interaction reminder</string>
<string name="sponsorblock_skip_self_promo_message">Skipped unpaid/self promo segment</string> <string name="sponsorblock_skip_self_promo_message">Skipped unpaid/self promo</string>
<string name="sponsorblock_skip_non_music_message">Skipped non-music segment</string> <string name="sponsorblock_skip_non_music_message">Skipped non-music</string>
<string name="sponsorblock_toggle_skipping">Toggle skipping sponsors</string> <string name="sponsorblock_toggle_skipping">Toggle skipping sponsors</string>
</resources> </resources>