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,
(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) {

View file

@ -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<SeekBarMarker> 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<Drawable> 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);
}
}

View file

@ -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;
}
}

View file

@ -700,10 +700,10 @@
<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_skip_sponsor_message">Skipped sponsor</string>
<string name="sponsorblock_skip_intro_message">Skipped intermission/intro segment</string>
<string name="sponsorblock_skip_outro_message">Skipped endcards/credits segment</string>
<string name="sponsorblock_skip_interaction_message">Skipped interaction reminder segment</string>
<string name="sponsorblock_skip_self_promo_message">Skipped unpaid/self promo segment</string>
<string name="sponsorblock_skip_non_music_message">Skipped non-music segment</string>
<string name="sponsorblock_skip_intro_message">Skipped intermission/intro</string>
<string name="sponsorblock_skip_outro_message">Skipped endcards/credits</string>
<string name="sponsorblock_skip_interaction_message">Skipped interaction reminder</string>
<string name="sponsorblock_skip_self_promo_message">Skipped unpaid/self promo</string>
<string name="sponsorblock_skip_non_music_message">Skipped non-music</string>
<string name="sponsorblock_toggle_skipping">Toggle skipping sponsors</string>
</resources>