mirror of
https://github.com/inotia00/revanced-patches.git
synced 2025-04-29 22:24:31 +02:00
chore: Lint code
This commit is contained in:
parent
f249e88ce8
commit
28ff781786
@ -240,7 +240,11 @@ class StreamingDataRequest private constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleConnectionError(str("revanced_spoof_streaming_data_failed_forbidden"), null, true)
|
handleConnectionError(str("revanced_spoof_streaming_data_failed_forbidden"), null, true)
|
||||||
handleConnectionError(str("revanced_spoof_streaming_data_failed_forbidden_suggestion"), null, true)
|
handleConnectionError(
|
||||||
|
str("revanced_spoof_streaming_data_failed_forbidden_suggestion"),
|
||||||
|
null,
|
||||||
|
true
|
||||||
|
)
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -178,7 +178,7 @@ public class PlaybackSpeedPatch {
|
|||||||
}
|
}
|
||||||
}, TOAST_DELAY_MILLISECONDS);
|
}, TOAST_DELAY_MILLISECONDS);
|
||||||
}
|
}
|
||||||
} else if (!isShorts){
|
} else if (!isShorts) {
|
||||||
lastSelectedPlaybackSpeed = playbackSpeed;
|
lastSelectedPlaybackSpeed = playbackSpeed;
|
||||||
}
|
}
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
|
@ -637,31 +637,31 @@ public class Settings extends BaseSettings {
|
|||||||
public static final FloatSetting SB_CATEGORY_SPONSOR_OPACITY = new FloatSetting("sb_sponsor_opacity", 0.8f);
|
public static final FloatSetting SB_CATEGORY_SPONSOR_OPACITY = new FloatSetting("sb_sponsor_opacity", 0.8f);
|
||||||
public static final StringSetting SB_CATEGORY_SELF_PROMO = new StringSetting("sb_selfpromo", SKIP_AUTOMATICALLY.reVancedKeyValue);
|
public static final StringSetting SB_CATEGORY_SELF_PROMO = new StringSetting("sb_selfpromo", SKIP_AUTOMATICALLY.reVancedKeyValue);
|
||||||
public static final StringSetting SB_CATEGORY_SELF_PROMO_COLOR = new StringSetting("sb_selfpromo_color", "#FFFF00");
|
public static final StringSetting SB_CATEGORY_SELF_PROMO_COLOR = new StringSetting("sb_selfpromo_color", "#FFFF00");
|
||||||
public static final FloatSetting SB_CATEGORY_SELF_PROMO_OPACITY = new FloatSetting("sb_selfpromo_opacity", 0.8f);
|
public static final FloatSetting SB_CATEGORY_SELF_PROMO_OPACITY = new FloatSetting("sb_selfpromo_opacity", 0.8f);
|
||||||
public static final StringSetting SB_CATEGORY_INTERACTION = new StringSetting("sb_interaction", SKIP_AUTOMATICALLY_ONCE.reVancedKeyValue);
|
public static final StringSetting SB_CATEGORY_INTERACTION = new StringSetting("sb_interaction", SKIP_AUTOMATICALLY_ONCE.reVancedKeyValue);
|
||||||
public static final StringSetting SB_CATEGORY_INTERACTION_COLOR = new StringSetting("sb_interaction_color", "#CC00FF");
|
public static final StringSetting SB_CATEGORY_INTERACTION_COLOR = new StringSetting("sb_interaction_color", "#CC00FF");
|
||||||
public static final FloatSetting SB_CATEGORY_INTERACTION_OPACITY = new FloatSetting("sb_interaction_opacity", 0.8f);
|
public static final FloatSetting SB_CATEGORY_INTERACTION_OPACITY = new FloatSetting("sb_interaction_opacity", 0.8f);
|
||||||
public static final StringSetting SB_CATEGORY_HIGHLIGHT = new StringSetting("sb_highlight", MANUAL_SKIP.reVancedKeyValue);
|
public static final StringSetting SB_CATEGORY_HIGHLIGHT = new StringSetting("sb_highlight", MANUAL_SKIP.reVancedKeyValue);
|
||||||
public static final StringSetting SB_CATEGORY_HIGHLIGHT_COLOR = new StringSetting("sb_highlight_color", "#FF1684");
|
public static final StringSetting SB_CATEGORY_HIGHLIGHT_COLOR = new StringSetting("sb_highlight_color", "#FF1684");
|
||||||
public static final FloatSetting SB_CATEGORY_HIGHLIGHT_OPACITY = new FloatSetting("sb_highlight_opacity", 0.8f);
|
public static final FloatSetting SB_CATEGORY_HIGHLIGHT_OPACITY = new FloatSetting("sb_highlight_opacity", 0.8f);
|
||||||
public static final StringSetting SB_CATEGORY_INTRO = new StringSetting("sb_intro", SKIP_AUTOMATICALLY_ONCE.reVancedKeyValue);
|
public static final StringSetting SB_CATEGORY_INTRO = new StringSetting("sb_intro", SKIP_AUTOMATICALLY_ONCE.reVancedKeyValue);
|
||||||
public static final StringSetting SB_CATEGORY_INTRO_COLOR = new StringSetting("sb_intro_color", "#00FFFF");
|
public static final StringSetting SB_CATEGORY_INTRO_COLOR = new StringSetting("sb_intro_color", "#00FFFF");
|
||||||
public static final FloatSetting SB_CATEGORY_INTRO_OPACITY = new FloatSetting("sb_intro_opacity", 0.8f);
|
public static final FloatSetting SB_CATEGORY_INTRO_OPACITY = new FloatSetting("sb_intro_opacity", 0.8f);
|
||||||
public static final StringSetting SB_CATEGORY_OUTRO = new StringSetting("sb_outro", SKIP_AUTOMATICALLY_ONCE.reVancedKeyValue);
|
public static final StringSetting SB_CATEGORY_OUTRO = new StringSetting("sb_outro", SKIP_AUTOMATICALLY_ONCE.reVancedKeyValue);
|
||||||
public static final StringSetting SB_CATEGORY_OUTRO_COLOR = new StringSetting("sb_outro_color", "#0202ED");
|
public static final StringSetting SB_CATEGORY_OUTRO_COLOR = new StringSetting("sb_outro_color", "#0202ED");
|
||||||
public static final FloatSetting SB_CATEGORY_OUTRO_OPACITY = new FloatSetting("sb_outro_opacity", 0.8f);
|
public static final FloatSetting SB_CATEGORY_OUTRO_OPACITY = new FloatSetting("sb_outro_opacity", 0.8f);
|
||||||
public static final StringSetting SB_CATEGORY_PREVIEW = new StringSetting("sb_preview", SKIP_AUTOMATICALLY_ONCE.reVancedKeyValue);
|
public static final StringSetting SB_CATEGORY_PREVIEW = new StringSetting("sb_preview", SKIP_AUTOMATICALLY_ONCE.reVancedKeyValue);
|
||||||
public static final StringSetting SB_CATEGORY_PREVIEW_COLOR = new StringSetting("sb_preview_color", "#008FD6");
|
public static final StringSetting SB_CATEGORY_PREVIEW_COLOR = new StringSetting("sb_preview_color", "#008FD6");
|
||||||
public static final FloatSetting SB_CATEGORY_PREVIEW_OPACITY = new FloatSetting("sb_preview_opacity", 0.8f);
|
public static final FloatSetting SB_CATEGORY_PREVIEW_OPACITY = new FloatSetting("sb_preview_opacity", 0.8f);
|
||||||
public static final StringSetting SB_CATEGORY_FILLER = new StringSetting("sb_filler", SKIP_AUTOMATICALLY_ONCE.reVancedKeyValue);
|
public static final StringSetting SB_CATEGORY_FILLER = new StringSetting("sb_filler", SKIP_AUTOMATICALLY_ONCE.reVancedKeyValue);
|
||||||
public static final StringSetting SB_CATEGORY_FILLER_COLOR = new StringSetting("sb_filler_color", "#7300FF");
|
public static final StringSetting SB_CATEGORY_FILLER_COLOR = new StringSetting("sb_filler_color", "#7300FF");
|
||||||
public static final FloatSetting SB_CATEGORY_FILLER_OPACITY = new FloatSetting("sb_filler_opacity", 0.8f);
|
public static final FloatSetting SB_CATEGORY_FILLER_OPACITY = new FloatSetting("sb_filler_opacity", 0.8f);
|
||||||
public static final StringSetting SB_CATEGORY_MUSIC_OFFTOPIC = new StringSetting("sb_music_offtopic", MANUAL_SKIP.reVancedKeyValue);
|
public static final StringSetting SB_CATEGORY_MUSIC_OFFTOPIC = new StringSetting("sb_music_offtopic", MANUAL_SKIP.reVancedKeyValue);
|
||||||
public static final StringSetting SB_CATEGORY_MUSIC_OFFTOPIC_COLOR = new StringSetting("sb_music_offtopic_color", "#FF9900");
|
public static final StringSetting SB_CATEGORY_MUSIC_OFFTOPIC_COLOR = new StringSetting("sb_music_offtopic_color", "#FF9900");
|
||||||
public static final FloatSetting SB_CATEGORY_MUSIC_OFFTOPIC_OPACITY = new FloatSetting("sb_music_offtopic_opacity", 0.8f);
|
public static final FloatSetting SB_CATEGORY_MUSIC_OFFTOPIC_OPACITY = new FloatSetting("sb_music_offtopic_opacity", 0.8f);
|
||||||
public static final StringSetting SB_CATEGORY_UNSUBMITTED = new StringSetting("sb_unsubmitted", SKIP_AUTOMATICALLY.reVancedKeyValue);
|
public static final StringSetting SB_CATEGORY_UNSUBMITTED = new StringSetting("sb_unsubmitted", SKIP_AUTOMATICALLY.reVancedKeyValue);
|
||||||
public static final StringSetting SB_CATEGORY_UNSUBMITTED_COLOR = new StringSetting("sb_unsubmitted_color", "#FFFFFF");
|
public static final StringSetting SB_CATEGORY_UNSUBMITTED_COLOR = new StringSetting("sb_unsubmitted_color", "#FFFFFF");
|
||||||
public static final FloatSetting SB_CATEGORY_UNSUBMITTED_OPACITY = new FloatSetting("sb_unsubmitted_opacity", 1.0f);
|
public static final FloatSetting SB_CATEGORY_UNSUBMITTED_OPACITY = new FloatSetting("sb_unsubmitted_opacity", 1.0f);
|
||||||
|
|
||||||
// SB Setting not exported
|
// SB Setting not exported
|
||||||
public static final LongSetting SB_LAST_VIP_CHECK = new LongSetting("sb_last_vip_check", 0L, false, false);
|
public static final LongSetting SB_LAST_VIP_CHECK = new LongSetting("sb_last_vip_check", 0L, false, false);
|
||||||
|
@ -37,7 +37,6 @@ import app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockViewController
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Not thread safe. All fields/methods must be accessed from the main thread.
|
* Not thread safe. All fields/methods must be accessed from the main thread.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class SponsorBlockUtils {
|
public class SponsorBlockUtils {
|
||||||
private static final int LOCKED_COLOR = Color.parseColor("#FFC83D");
|
private static final int LOCKED_COLOR = Color.parseColor("#FFC83D");
|
||||||
|
@ -1,7 +1,36 @@
|
|||||||
package app.revanced.extension.youtube.sponsorblock.objects;
|
package app.revanced.extension.youtube.sponsorblock.objects;
|
||||||
|
|
||||||
import static app.revanced.extension.shared.utils.StringRef.sf;
|
import static app.revanced.extension.shared.utils.StringRef.sf;
|
||||||
import static app.revanced.extension.youtube.settings.Settings.*;
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_FILLER;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_FILLER_COLOR;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_FILLER_OPACITY;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_HIGHLIGHT;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_HIGHLIGHT_COLOR;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_HIGHLIGHT_OPACITY;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_INTERACTION;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_INTERACTION_COLOR;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_INTERACTION_OPACITY;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_INTRO;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_INTRO_COLOR;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_INTRO_OPACITY;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_MUSIC_OFFTOPIC;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_MUSIC_OFFTOPIC_COLOR;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_MUSIC_OFFTOPIC_OPACITY;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_OUTRO;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_OUTRO_COLOR;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_OUTRO_OPACITY;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_PREVIEW;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_PREVIEW_COLOR;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_PREVIEW_OPACITY;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_SELF_PROMO;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_SELF_PROMO_COLOR;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_SELF_PROMO_OPACITY;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_SPONSOR;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_SPONSOR_COLOR;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_SPONSOR_OPACITY;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_UNSUBMITTED;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_UNSUBMITTED_COLOR;
|
||||||
|
import static app.revanced.extension.youtube.settings.Settings.SB_CATEGORY_UNSUBMITTED_OPACITY;
|
||||||
|
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.graphics.Paint;
|
import android.graphics.Paint;
|
||||||
@ -56,7 +85,6 @@ public enum SegmentCategory {
|
|||||||
SB_CATEGORY_MUSIC_OFFTOPIC, SB_CATEGORY_MUSIC_OFFTOPIC_COLOR, SB_CATEGORY_MUSIC_OFFTOPIC_OPACITY),
|
SB_CATEGORY_MUSIC_OFFTOPIC, SB_CATEGORY_MUSIC_OFFTOPIC_COLOR, SB_CATEGORY_MUSIC_OFFTOPIC_OPACITY),
|
||||||
UNSUBMITTED("unsubmitted", StringRef.empty, sf("revanced_sb_skip_button_unsubmitted"), sf("revanced_sb_skipped_unsubmitted"),
|
UNSUBMITTED("unsubmitted", StringRef.empty, sf("revanced_sb_skip_button_unsubmitted"), sf("revanced_sb_skipped_unsubmitted"),
|
||||||
SB_CATEGORY_UNSUBMITTED, SB_CATEGORY_UNSUBMITTED_COLOR, SB_CATEGORY_UNSUBMITTED_OPACITY);
|
SB_CATEGORY_UNSUBMITTED, SB_CATEGORY_UNSUBMITTED_COLOR, SB_CATEGORY_UNSUBMITTED_OPACITY);
|
||||||
;
|
|
||||||
|
|
||||||
private static final StringRef skipSponsorTextCompact = sf("revanced_sb_skip_button_compact");
|
private static final StringRef skipSponsorTextCompact = sf("revanced_sb_skip_button_compact");
|
||||||
private static final StringRef skipSponsorTextCompactHighlight = sf("revanced_sb_skip_button_compact_highlight");
|
private static final StringRef skipSponsorTextCompactHighlight = sf("revanced_sb_skip_button_compact_highlight");
|
||||||
|
@ -145,8 +145,10 @@ class SwipeControlsOverlayLayout(
|
|||||||
addView(feedbackTextView)
|
addView(feedbackTextView)
|
||||||
// get icons scaled, assuming square icons
|
// get icons scaled, assuming square icons
|
||||||
val iconHeight = round(feedbackTextView.lineHeight * .8).toInt()
|
val iconHeight = round(feedbackTextView.lineHeight * .8).toInt()
|
||||||
autoBrightnessIcon = getDrawable("revanced_ic_sc_brightness_auto", iconHeight, iconHeight)
|
autoBrightnessIcon =
|
||||||
manualBrightnessIcon = getDrawable("revanced_ic_sc_brightness_manual", iconHeight, iconHeight)
|
getDrawable("revanced_ic_sc_brightness_auto", iconHeight, iconHeight)
|
||||||
|
manualBrightnessIcon =
|
||||||
|
getDrawable("revanced_ic_sc_brightness_manual", iconHeight, iconHeight)
|
||||||
mutedVolumeIcon = getDrawable("revanced_ic_sc_volume_mute", iconHeight, iconHeight)
|
mutedVolumeIcon = getDrawable("revanced_ic_sc_volume_mute", iconHeight, iconHeight)
|
||||||
normalVolumeIcon = getDrawable("revanced_ic_sc_volume_normal", iconHeight, iconHeight)
|
normalVolumeIcon = getDrawable("revanced_ic_sc_volume_normal", iconHeight, iconHeight)
|
||||||
}
|
}
|
||||||
@ -186,11 +188,18 @@ class SwipeControlsOverlayLayout(
|
|||||||
/**
|
/**
|
||||||
* Displays the progress bar with the appropriate value, icon, and type (brightness or volume).
|
* Displays the progress bar with the appropriate value, icon, and type (brightness or volume).
|
||||||
*/
|
*/
|
||||||
private fun showFeedbackView(value: String, progress: Int, max: Int, icon: Drawable, isBrightness: Boolean) {
|
private fun showFeedbackView(
|
||||||
|
value: String,
|
||||||
|
progress: Int,
|
||||||
|
max: Int,
|
||||||
|
icon: Drawable,
|
||||||
|
isBrightness: Boolean
|
||||||
|
) {
|
||||||
feedbackHideHandler.removeCallbacks(feedbackHideCallback)
|
feedbackHideHandler.removeCallbacks(feedbackHideCallback)
|
||||||
feedbackHideHandler.postDelayed(feedbackHideCallback, config.overlayShowTimeoutMillis)
|
feedbackHideHandler.postDelayed(feedbackHideCallback, config.overlayShowTimeoutMillis)
|
||||||
|
|
||||||
val viewToShow = if (config.isCircularProgressBar) circularProgressView else horizontalProgressView
|
val viewToShow =
|
||||||
|
if (config.isCircularProgressBar) circularProgressView else horizontalProgressView
|
||||||
viewToShow.apply {
|
viewToShow.apply {
|
||||||
setProgress(progress, max, value, isBrightness)
|
setProgress(progress, max, value, isBrightness)
|
||||||
this.icon = icon
|
this.icon = icon
|
||||||
@ -241,7 +250,13 @@ class SwipeControlsOverlayLayout(
|
|||||||
brightnessValue < 75 -> highBrightnessIcon
|
brightnessValue < 75 -> highBrightnessIcon
|
||||||
else -> fullBrightnessIcon
|
else -> fullBrightnessIcon
|
||||||
}
|
}
|
||||||
showFeedbackView("$brightnessValue%", brightnessValue, 100, icon, isBrightness = true)
|
showFeedbackView(
|
||||||
|
"$brightnessValue%",
|
||||||
|
brightnessValue,
|
||||||
|
100,
|
||||||
|
icon,
|
||||||
|
isBrightness = true
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
showFeedbackView("${round(brightness).toInt()}%", manualBrightnessIcon)
|
showFeedbackView("${round(brightness).toInt()}%", manualBrightnessIcon)
|
||||||
}
|
}
|
||||||
@ -274,7 +289,12 @@ abstract class AbstractProgressView(
|
|||||||
) : View(context, attrs, defStyleAttr) {
|
) : View(context, attrs, defStyleAttr) {
|
||||||
|
|
||||||
// Combined paint creation function for both fill and stroke styles
|
// Combined paint creation function for both fill and stroke styles
|
||||||
private fun createPaint(color: Int, style: Paint.Style = Paint.Style.FILL, strokeCap: Paint.Cap = Paint.Cap.BUTT, strokeWidth: Float = 0f) = Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
private fun createPaint(
|
||||||
|
color: Int,
|
||||||
|
style: Paint.Style = Paint.Style.FILL,
|
||||||
|
strokeCap: Paint.Cap = Paint.Cap.BUTT,
|
||||||
|
strokeWidth: Float = 0f
|
||||||
|
) = Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
||||||
this.style = style
|
this.style = style
|
||||||
this.color = color
|
this.color = color
|
||||||
this.strokeCap = strokeCap
|
this.strokeCap = strokeCap
|
||||||
@ -282,13 +302,18 @@ abstract class AbstractProgressView(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Initialize paints
|
// Initialize paints
|
||||||
val backgroundPaint = createPaint(overlayBackgroundOpacity, style = Paint.Style.FILL)
|
val backgroundPaint = createPaint(overlayBackgroundOpacity, style = Paint.Style.FILL)
|
||||||
val progressPaint = createPaint(overlayProgressColor, style = Paint.Style.STROKE, strokeCap = Paint.Cap.ROUND, strokeWidth = 20f)
|
val progressPaint = createPaint(
|
||||||
|
overlayProgressColor,
|
||||||
|
style = Paint.Style.STROKE,
|
||||||
|
strokeCap = Paint.Cap.ROUND,
|
||||||
|
strokeWidth = 20f
|
||||||
|
)
|
||||||
val fillBackgroundPaint = createPaint(overlayFillBackgroundPaint, style = Paint.Style.FILL)
|
val fillBackgroundPaint = createPaint(overlayFillBackgroundPaint, style = Paint.Style.FILL)
|
||||||
val textPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
val textPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
||||||
color = overlayTextColor
|
color = overlayTextColor
|
||||||
textAlign = Paint.Align.CENTER
|
textAlign = Paint.Align.CENTER
|
||||||
textSize = 40f // Can adjust based on need
|
textSize = 40f // Can adjust based on need
|
||||||
}
|
}
|
||||||
|
|
||||||
protected var progress = 0
|
protected var progress = 0
|
||||||
@ -337,11 +362,11 @@ class CircularProgressView(
|
|||||||
|
|
||||||
init {
|
init {
|
||||||
textPaint.textSize = 40f // Override default text size for circular view
|
textPaint.textSize = 40f // Override default text size for circular view
|
||||||
progressPaint.strokeWidth = 20f
|
progressPaint.strokeWidth = 20f
|
||||||
fillBackgroundPaint.strokeWidth = 20f
|
fillBackgroundPaint.strokeWidth = 20f
|
||||||
progressPaint.strokeCap = Paint.Cap.ROUND
|
progressPaint.strokeCap = Paint.Cap.ROUND
|
||||||
fillBackgroundPaint.strokeCap = Paint.Cap.BUTT
|
fillBackgroundPaint.strokeCap = Paint.Cap.BUTT
|
||||||
progressPaint.style = Paint.Style.STROKE
|
progressPaint.style = Paint.Style.STROKE
|
||||||
fillBackgroundPaint.style = Paint.Style.STROKE
|
fillBackgroundPaint.style = Paint.Style.STROKE
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -352,7 +377,12 @@ class CircularProgressView(
|
|||||||
rectF.set(20f, 20f, size - 20f, size - 20f)
|
rectF.set(20f, 20f, size - 20f, size - 20f)
|
||||||
|
|
||||||
canvas.drawOval(rectF, fillBackgroundPaint) // Draw the outer ring.
|
canvas.drawOval(rectF, fillBackgroundPaint) // Draw the outer ring.
|
||||||
canvas.drawCircle(width / 2f, height / 2f, size / 3, backgroundPaint) // Draw the inner circle.
|
canvas.drawCircle(
|
||||||
|
width / 2f,
|
||||||
|
height / 2f,
|
||||||
|
size / 3,
|
||||||
|
backgroundPaint
|
||||||
|
) // Draw the inner circle.
|
||||||
|
|
||||||
// Select the paint for drawing based on whether it's brightness or volume.
|
// Select the paint for drawing based on whether it's brightness or volume.
|
||||||
val sweepAngle = (progress.toFloat() / maxProgress) * 360
|
val sweepAngle = (progress.toFloat() / maxProgress) * 360
|
||||||
@ -399,13 +429,13 @@ class HorizontalProgressView(
|
|||||||
) {
|
) {
|
||||||
|
|
||||||
private val iconSize = 60f
|
private val iconSize = 60f
|
||||||
private val padding = 40f
|
private val padding = 40f
|
||||||
|
|
||||||
init {
|
init {
|
||||||
textPaint.textSize = 36f // Override default text size for horizontal view
|
textPaint.textSize = 36f // Override default text size for horizontal view
|
||||||
progressPaint.strokeWidth = 0f
|
progressPaint.strokeWidth = 0f
|
||||||
progressPaint.strokeCap = Paint.Cap.BUTT
|
progressPaint.strokeCap = Paint.Cap.BUTT
|
||||||
progressPaint.style = Paint.Style.FILL
|
progressPaint.style = Paint.Style.FILL
|
||||||
fillBackgroundPaint.style = Paint.Style.FILL
|
fillBackgroundPaint.style = Paint.Style.FILL
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -428,7 +458,15 @@ class HorizontalProgressView(
|
|||||||
if (!overlayShowOverlayMinimalStyle) {
|
if (!overlayShowOverlayMinimalStyle) {
|
||||||
canvas.drawRoundRect(0f, 0f, width, height, cornerRadius, cornerRadius, backgroundPaint)
|
canvas.drawRoundRect(0f, 0f, width, height, cornerRadius, cornerRadius, backgroundPaint)
|
||||||
} else {
|
} else {
|
||||||
canvas.drawRoundRect(minimalStartX, 0f, minimalStartX + minimalElementWidth, height, cornerRadius, cornerRadius, backgroundPaint)
|
canvas.drawRoundRect(
|
||||||
|
minimalStartX,
|
||||||
|
0f,
|
||||||
|
minimalStartX + minimalElementWidth,
|
||||||
|
height,
|
||||||
|
cornerRadius,
|
||||||
|
cornerRadius,
|
||||||
|
backgroundPaint
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!overlayShowOverlayMinimalStyle) {
|
if (!overlayShowOverlayMinimalStyle) {
|
||||||
@ -466,7 +504,12 @@ class HorizontalProgressView(
|
|||||||
padding + minimalStartX
|
padding + minimalStartX
|
||||||
}
|
}
|
||||||
val iconY = height / 2 - iconSize / 2
|
val iconY = height / 2 - iconSize / 2
|
||||||
it.setBounds(iconX.toInt(), iconY.toInt(), (iconX + iconSize).toInt(), (iconY + iconSize).toInt())
|
it.setBounds(
|
||||||
|
iconX.toInt(),
|
||||||
|
iconY.toInt(),
|
||||||
|
(iconX + iconSize).toInt(),
|
||||||
|
(iconY + iconSize).toInt()
|
||||||
|
)
|
||||||
it.draw(canvas)
|
it.draw(canvas)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -152,7 +152,10 @@ private enum class MethodCall(
|
|||||||
RegisterNetworkCallback1(
|
RegisterNetworkCallback1(
|
||||||
"Landroid/net/ConnectivityManager;",
|
"Landroid/net/ConnectivityManager;",
|
||||||
"registerNetworkCallback",
|
"registerNetworkCallback",
|
||||||
arrayOf("Landroid/net/NetworkRequest;", "Landroid/net/ConnectivityManager\$NetworkCallback;"),
|
arrayOf(
|
||||||
|
"Landroid/net/NetworkRequest;",
|
||||||
|
"Landroid/net/ConnectivityManager\$NetworkCallback;"
|
||||||
|
),
|
||||||
"V",
|
"V",
|
||||||
),
|
),
|
||||||
RegisterNetworkCallback2(
|
RegisterNetworkCallback2(
|
||||||
@ -174,13 +177,20 @@ private enum class MethodCall(
|
|||||||
RequestNetwork1(
|
RequestNetwork1(
|
||||||
"Landroid/net/ConnectivityManager;",
|
"Landroid/net/ConnectivityManager;",
|
||||||
"requestNetwork",
|
"requestNetwork",
|
||||||
arrayOf("Landroid/net/NetworkRequest;", "Landroid/net/ConnectivityManager\$NetworkCallback;"),
|
arrayOf(
|
||||||
|
"Landroid/net/NetworkRequest;",
|
||||||
|
"Landroid/net/ConnectivityManager\$NetworkCallback;"
|
||||||
|
),
|
||||||
"V",
|
"V",
|
||||||
),
|
),
|
||||||
RequestNetwork2(
|
RequestNetwork2(
|
||||||
"Landroid/net/ConnectivityManager;",
|
"Landroid/net/ConnectivityManager;",
|
||||||
"requestNetwork",
|
"requestNetwork",
|
||||||
arrayOf("Landroid/net/NetworkRequest;", "Landroid/net/ConnectivityManager\$NetworkCallback;", "I"),
|
arrayOf(
|
||||||
|
"Landroid/net/NetworkRequest;",
|
||||||
|
"Landroid/net/ConnectivityManager\$NetworkCallback;",
|
||||||
|
"I"
|
||||||
|
),
|
||||||
"V",
|
"V",
|
||||||
),
|
),
|
||||||
RequestNetwork3(
|
RequestNetwork3(
|
||||||
|
@ -19,7 +19,8 @@ val edgeToEdgeDisplayPatch = resourcePatch(
|
|||||||
// Instead, it checks compileSdkVersion and prints a warning.
|
// Instead, it checks compileSdkVersion and prints a warning.
|
||||||
try {
|
try {
|
||||||
val manifestElement = document.getNode("manifest") as Element
|
val manifestElement = document.getNode("manifest") as Element
|
||||||
val compileSdkVersion = Integer.parseInt(manifestElement.getAttribute("android:compileSdkVersion"))
|
val compileSdkVersion =
|
||||||
|
Integer.parseInt(manifestElement.getAttribute("android:compileSdkVersion"))
|
||||||
if (compileSdkVersion < 35) {
|
if (compileSdkVersion < 35) {
|
||||||
printWarn("This app may not be forcing edge to edge display (compileSdkVersion: $compileSdkVersion)")
|
printWarn("This app may not be forcing edge to edge display (compileSdkVersion: $compileSdkVersion)")
|
||||||
}
|
}
|
||||||
|
@ -88,7 +88,7 @@ val accountComponentsPatch = bytecodePatch(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// account switcher
|
// account switcher
|
||||||
val textViewField = with (
|
val textViewField = with(
|
||||||
channelHandleFingerprint
|
channelHandleFingerprint
|
||||||
.methodOrThrow(namesInactiveAccountThumbnailSizeFingerprint)
|
.methodOrThrow(namesInactiveAccountThumbnailSizeFingerprint)
|
||||||
) {
|
) {
|
||||||
@ -117,7 +117,8 @@ val accountComponentsPatch = bytecodePatch(
|
|||||||
.forEach { index ->
|
.forEach { index ->
|
||||||
val insertIndex = index - 1
|
val insertIndex = index - 1
|
||||||
if (!hook && getInstruction(insertIndex).opcode == Opcode.IF_NEZ) {
|
if (!hook && getInstruction(insertIndex).opcode == Opcode.IF_NEZ) {
|
||||||
val insertRegister = getInstruction<OneRegisterInstruction>(insertIndex).registerA
|
val insertRegister =
|
||||||
|
getInstruction<OneRegisterInstruction>(insertIndex).registerA
|
||||||
|
|
||||||
addInstructions(
|
addInstructions(
|
||||||
insertIndex, """
|
insertIndex, """
|
||||||
|
@ -115,7 +115,8 @@ val adsPatch = bytecodePatch(
|
|||||||
.methodOrThrow(getPremiumDialogParentFingerprint)
|
.methodOrThrow(getPremiumDialogParentFingerprint)
|
||||||
.apply {
|
.apply {
|
||||||
val setContentViewIndex = indexOfSetContentViewInstruction(this)
|
val setContentViewIndex = indexOfSetContentViewInstruction(this)
|
||||||
val dialogInstruction = getInstruction<FiveRegisterInstruction>(setContentViewIndex)
|
val dialogInstruction =
|
||||||
|
getInstruction<FiveRegisterInstruction>(setContentViewIndex)
|
||||||
val dialogRegister = dialogInstruction.registerC
|
val dialogRegister = dialogInstruction.registerC
|
||||||
val viewRegister = dialogInstruction.registerD
|
val viewRegister = dialogInstruction.registerD
|
||||||
|
|
||||||
|
@ -206,7 +206,8 @@ val changeHeaderPatch = resourcePatch(
|
|||||||
printWarn(warnings)
|
printWarn(warnings)
|
||||||
}
|
}
|
||||||
|
|
||||||
val isLegacyLogoExists = get("res").resolve("drawable-xxhdpi").resolve("ytm_logo.png").exists()
|
val isLegacyLogoExists =
|
||||||
|
get("res").resolve("drawable-xxhdpi").resolve("ytm_logo.png").exists()
|
||||||
if (is_7_27_or_greater && isLegacyLogoExists) {
|
if (is_7_27_or_greater && isLegacyLogoExists) {
|
||||||
document("res/layout/signin_fragment.xml").use { document ->
|
document("res/layout/signin_fragment.xml").use { document ->
|
||||||
document.doRecursively node@{ node ->
|
document.doRecursively node@{ node ->
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
package app.revanced.patches.music.misc.watchhistory
|
package app.revanced.patches.music.misc.watchhistory
|
||||||
|
|
||||||
import app.revanced.patcher.patch.bytecodePatch
|
import app.revanced.patcher.patch.bytecodePatch
|
||||||
import app.revanced.patches.shared.trackingurlhook.hookWatchHistory
|
|
||||||
import app.revanced.patches.shared.trackingurlhook.trackingUrlHookPatch
|
|
||||||
import app.revanced.patches.music.utils.compatibility.Constants.COMPATIBLE_PACKAGE
|
import app.revanced.patches.music.utils.compatibility.Constants.COMPATIBLE_PACKAGE
|
||||||
import app.revanced.patches.music.utils.patch.PatchList.WATCH_HISTORY
|
import app.revanced.patches.music.utils.patch.PatchList.WATCH_HISTORY
|
||||||
import app.revanced.patches.music.utils.settings.CategoryType
|
import app.revanced.patches.music.utils.settings.CategoryType
|
||||||
import app.revanced.patches.music.utils.settings.addPreferenceWithIntent
|
import app.revanced.patches.music.utils.settings.addPreferenceWithIntent
|
||||||
import app.revanced.patches.music.utils.settings.settingsPatch
|
import app.revanced.patches.music.utils.settings.settingsPatch
|
||||||
|
import app.revanced.patches.shared.trackingurlhook.hookWatchHistory
|
||||||
|
import app.revanced.patches.shared.trackingurlhook.trackingUrlHookPatch
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
val watchHistoryPatch = bytecodePatch(
|
val watchHistoryPatch = bytecodePatch(
|
||||||
|
@ -124,14 +124,17 @@ val navigationBarComponentsPatch = bytecodePatch(
|
|||||||
opcode == Opcode.IGET_OBJECT &&
|
opcode == Opcode.IGET_OBJECT &&
|
||||||
getReference<FieldReference>()?.type == "Ljava/lang/String;"
|
getReference<FieldReference>()?.type == "Ljava/lang/String;"
|
||||||
}
|
}
|
||||||
val browseIdReference = getInstruction<ReferenceInstruction>(browseIdIndex).reference as FieldReference
|
val browseIdReference =
|
||||||
|
getInstruction<ReferenceInstruction>(browseIdIndex).reference as FieldReference
|
||||||
val fieldName = browseIdReference.name
|
val fieldName = browseIdReference.name
|
||||||
val componentIndex = indexOfFirstInstructionOrThrow(stringIndex) {
|
val componentIndex = indexOfFirstInstructionOrThrow(stringIndex) {
|
||||||
opcode == Opcode.IGET_OBJECT &&
|
opcode == Opcode.IGET_OBJECT &&
|
||||||
getReference<FieldReference>()?.toString() == browseIdReference.toString()
|
getReference<FieldReference>()?.toString() == browseIdReference.toString()
|
||||||
}
|
}
|
||||||
val browseIdRegister = getInstruction<TwoRegisterInstruction>(componentIndex).registerA
|
val browseIdRegister =
|
||||||
val componentRegister = getInstruction<TwoRegisterInstruction>(componentIndex).registerB
|
getInstruction<TwoRegisterInstruction>(componentIndex).registerA
|
||||||
|
val componentRegister =
|
||||||
|
getInstruction<TwoRegisterInstruction>(componentIndex).registerB
|
||||||
|
|
||||||
val enumIndex = it.patternMatch!!.startIndex + 3
|
val enumIndex = it.patternMatch!!.startIndex + 3
|
||||||
val enumRegister = getInstruction<OneRegisterInstruction>(enumIndex).registerA
|
val enumRegister = getInstruction<OneRegisterInstruction>(enumIndex).registerA
|
||||||
|
@ -54,7 +54,7 @@ internal val engagementPanelHeightFingerprint = legacyFingerprint(
|
|||||||
parameters = emptyList(),
|
parameters = emptyList(),
|
||||||
customFingerprint = { method, _ ->
|
customFingerprint = { method, _ ->
|
||||||
AccessFlags.FINAL.isSet(method.accessFlags) &&
|
AccessFlags.FINAL.isSet(method.accessFlags) &&
|
||||||
method.containsLiteralInstruction(1) &&
|
method.containsLiteralInstruction(1) &&
|
||||||
method.indexOfFirstInstruction {
|
method.indexOfFirstInstruction {
|
||||||
opcode == Opcode.INVOKE_VIRTUAL &&
|
opcode == Opcode.INVOKE_VIRTUAL &&
|
||||||
getReference<MethodReference>()?.name == "booleanValue"
|
getReference<MethodReference>()?.name == "booleanValue"
|
||||||
|
@ -747,7 +747,8 @@ val playerComponentsPatch = bytecodePatch(
|
|||||||
getInstruction<FiveRegisterInstruction>(bottomSheetBehaviorIndex).registerD
|
getInstruction<FiveRegisterInstruction>(bottomSheetBehaviorIndex).registerD
|
||||||
|
|
||||||
val getFieldIndex = bottomSheetBehaviorIndex - 2
|
val getFieldIndex = bottomSheetBehaviorIndex - 2
|
||||||
val getFieldReference = getInstruction<ReferenceInstruction>(getFieldIndex).reference
|
val getFieldReference =
|
||||||
|
getInstruction<ReferenceInstruction>(getFieldIndex).reference
|
||||||
val getFieldInstruction = getInstruction<TwoRegisterInstruction>(getFieldIndex)
|
val getFieldInstruction = getInstruction<TwoRegisterInstruction>(getFieldIndex)
|
||||||
|
|
||||||
addInstructionsWithLabels(
|
addInstructionsWithLabels(
|
||||||
|
@ -22,7 +22,6 @@ import app.revanced.patches.music.utils.settings.ResourceUtils.updatePatchStatus
|
|||||||
import app.revanced.patches.music.utils.settings.addPreferenceWithIntent
|
import app.revanced.patches.music.utils.settings.addPreferenceWithIntent
|
||||||
import app.revanced.patches.music.utils.settings.addSwitchPreference
|
import app.revanced.patches.music.utils.settings.addSwitchPreference
|
||||||
import app.revanced.patches.music.utils.settings.settingsPatch
|
import app.revanced.patches.music.utils.settings.settingsPatch
|
||||||
import app.revanced.patches.shared.spoof.blockrequest.blockRequestPatch
|
|
||||||
import app.revanced.patches.shared.createPlayerRequestBodyWithModelFingerprint
|
import app.revanced.patches.shared.createPlayerRequestBodyWithModelFingerprint
|
||||||
import app.revanced.patches.shared.customspeed.customPlaybackSpeedPatch
|
import app.revanced.patches.shared.customspeed.customPlaybackSpeedPatch
|
||||||
import app.revanced.patches.shared.extension.Constants.PATCHES_PATH
|
import app.revanced.patches.shared.extension.Constants.PATCHES_PATH
|
||||||
@ -31,6 +30,7 @@ import app.revanced.patches.shared.indexOfBrandInstruction
|
|||||||
import app.revanced.patches.shared.indexOfManufacturerInstruction
|
import app.revanced.patches.shared.indexOfManufacturerInstruction
|
||||||
import app.revanced.patches.shared.indexOfModelInstruction
|
import app.revanced.patches.shared.indexOfModelInstruction
|
||||||
import app.revanced.patches.shared.indexOfReleaseInstruction
|
import app.revanced.patches.shared.indexOfReleaseInstruction
|
||||||
|
import app.revanced.patches.shared.spoof.blockrequest.blockRequestPatch
|
||||||
import app.revanced.util.findMethodOrThrow
|
import app.revanced.util.findMethodOrThrow
|
||||||
import app.revanced.util.fingerprint.injectLiteralInstructionBooleanCall
|
import app.revanced.util.fingerprint.injectLiteralInstructionBooleanCall
|
||||||
import app.revanced.util.fingerprint.matchOrThrow
|
import app.revanced.util.fingerprint.matchOrThrow
|
||||||
|
@ -142,7 +142,8 @@ internal val sharedResourceIdPatch = resourcePatch(
|
|||||||
endButtonsContainer = getResourceId(ID, "end_buttons_container")
|
endButtonsContainer = getResourceId(ID, "end_buttons_container")
|
||||||
floatingLayout = getResourceId(ID, "floating_layout")
|
floatingLayout = getResourceId(ID, "floating_layout")
|
||||||
historyMenuItem = getResourceId(ID, "history_menu_item")
|
historyMenuItem = getResourceId(ID, "history_menu_item")
|
||||||
inlineTimeBarAdBreakMarkerColor = getResourceId(COLOR, "inline_time_bar_ad_break_marker_color")
|
inlineTimeBarAdBreakMarkerColor =
|
||||||
|
getResourceId(COLOR, "inline_time_bar_ad_break_marker_color")
|
||||||
inlineTimeBarProgressColor = getResourceId(COLOR, "inline_time_bar_progress_color")
|
inlineTimeBarProgressColor = getResourceId(COLOR, "inline_time_bar_progress_color")
|
||||||
interstitialsContainer = getResourceId(ID, "interstitials_container")
|
interstitialsContainer = getResourceId(ID, "interstitials_container")
|
||||||
isTablet = getResourceId(BOOL, "is_tablet")
|
isTablet = getResourceId(BOOL, "is_tablet")
|
||||||
@ -156,7 +157,8 @@ internal val sharedResourceIdPatch = resourcePatch(
|
|||||||
modernDialogBackground = getResourceId(DRAWABLE, "modern_dialog_background")
|
modernDialogBackground = getResourceId(DRAWABLE, "modern_dialog_background")
|
||||||
musicNotifierShelf = getResourceId(LAYOUT, "music_notifier_shelf")
|
musicNotifierShelf = getResourceId(LAYOUT, "music_notifier_shelf")
|
||||||
musicTasteBuilderShelf = getResourceId(LAYOUT, "music_tastebuilder_shelf")
|
musicTasteBuilderShelf = getResourceId(LAYOUT, "music_tastebuilder_shelf")
|
||||||
namesInactiveAccountThumbnailSize = getResourceId(DIMEN, "names_inactive_account_thumbnail_size")
|
namesInactiveAccountThumbnailSize =
|
||||||
|
getResourceId(DIMEN, "names_inactive_account_thumbnail_size")
|
||||||
offlineSettingsMenuItem = getResourceId(ID, "offline_settings_menu_item")
|
offlineSettingsMenuItem = getResourceId(ID, "offline_settings_menu_item")
|
||||||
playerOverlayChip = getResourceId(ID, "player_overlay_chip")
|
playerOverlayChip = getResourceId(ID, "player_overlay_chip")
|
||||||
playerViewPager = getResourceId(ID, "player_view_pager")
|
playerViewPager = getResourceId(ID, "player_view_pager")
|
||||||
|
@ -25,7 +25,8 @@ val videoTypeHookPatch = bytecodePatch(
|
|||||||
|
|
||||||
videoTypeFingerprint.methodOrThrow(videoTypeParentFingerprint).apply {
|
videoTypeFingerprint.methodOrThrow(videoTypeParentFingerprint).apply {
|
||||||
val getEnumIndex = indexOfGetEnumInstruction(this)
|
val getEnumIndex = indexOfGetEnumInstruction(this)
|
||||||
val enumClass = (getInstruction<ReferenceInstruction>(getEnumIndex).reference as MethodReference).definingClass
|
val enumClass =
|
||||||
|
(getInstruction<ReferenceInstruction>(getEnumIndex).reference as MethodReference).definingClass
|
||||||
val referenceIndex = indexOfFirstInstructionOrThrow(getEnumIndex) {
|
val referenceIndex = indexOfFirstInstructionOrThrow(getEnumIndex) {
|
||||||
opcode == Opcode.SGET_OBJECT &&
|
opcode == Opcode.SGET_OBJECT &&
|
||||||
getReference<FieldReference>()?.type == enumClass
|
getReference<FieldReference>()?.type == enumClass
|
||||||
|
@ -71,7 +71,8 @@ val playerResponseMethodHookPatch = bytecodePatch(
|
|||||||
val beforeVideoIdHooks =
|
val beforeVideoIdHooks =
|
||||||
hooks.filterIsInstance<Hook.PlayerParameterBeforeVideoId>().asReversed()
|
hooks.filterIsInstance<Hook.PlayerParameterBeforeVideoId>().asReversed()
|
||||||
val videoIdHooks = hooks.filterIsInstance<Hook.VideoId>().asReversed()
|
val videoIdHooks = hooks.filterIsInstance<Hook.VideoId>().asReversed()
|
||||||
val videoIdAndPlaylistIdHooks = hooks.filterIsInstance<Hook.VideoIdAndPlaylistId>().asReversed()
|
val videoIdAndPlaylistIdHooks =
|
||||||
|
hooks.filterIsInstance<Hook.VideoIdAndPlaylistId>().asReversed()
|
||||||
val afterVideoIdHooks = hooks.filterIsInstance<Hook.PlayerParameter>().asReversed()
|
val afterVideoIdHooks = hooks.filterIsInstance<Hook.PlayerParameter>().asReversed()
|
||||||
|
|
||||||
// Add the hooks in this specific order as they insert instructions at the beginning of the method.
|
// Add the hooks in this specific order as they insert instructions at the beginning of the method.
|
||||||
|
@ -56,7 +56,8 @@ val navigationButtonsPatch = bytecodePatch(
|
|||||||
if (bottomNavScreenFingerprint.resolvable()) {
|
if (bottomNavScreenFingerprint.resolvable()) {
|
||||||
val bottomNavScreenMutableClass = with(bottomNavScreenFingerprint.methodOrThrow()) {
|
val bottomNavScreenMutableClass = with(bottomNavScreenFingerprint.methodOrThrow()) {
|
||||||
val startIndex = indexOfGetDimensionPixelSizeInstruction(this)
|
val startIndex = indexOfGetDimensionPixelSizeInstruction(this)
|
||||||
val targetIndex = indexOfFirstInstructionOrThrow(startIndex, Opcode.NEW_INSTANCE)
|
val targetIndex =
|
||||||
|
indexOfFirstInstructionOrThrow(startIndex, Opcode.NEW_INSTANCE)
|
||||||
val targetReference =
|
val targetReference =
|
||||||
getInstruction<ReferenceInstruction>(targetIndex).reference.toString()
|
getInstruction<ReferenceInstruction>(targetIndex).reference.toString()
|
||||||
|
|
||||||
@ -65,7 +66,9 @@ val navigationButtonsPatch = bytecodePatch(
|
|||||||
?: throw ClassNotFoundException("Failed to find class $targetReference")
|
?: throw ClassNotFoundException("Failed to find class $targetReference")
|
||||||
}
|
}
|
||||||
|
|
||||||
bottomNavScreenOnGlobalLayoutFingerprint.second.matchOrNull(bottomNavScreenMutableClass)
|
bottomNavScreenOnGlobalLayoutFingerprint.second.matchOrNull(
|
||||||
|
bottomNavScreenMutableClass
|
||||||
|
)
|
||||||
?.let {
|
?.let {
|
||||||
it.method.apply {
|
it.method.apply {
|
||||||
val startIndex = it.patternMatch!!.startIndex
|
val startIndex = it.patternMatch!!.startIndex
|
||||||
@ -82,7 +85,8 @@ val navigationButtonsPatch = bytecodePatch(
|
|||||||
// Legacy method.
|
// Legacy method.
|
||||||
bottomNavScreenHandlerFingerprint.methodOrThrow().apply {
|
bottomNavScreenHandlerFingerprint.methodOrThrow().apply {
|
||||||
val targetIndex = indexOfGetItemsInstruction(this) + 1
|
val targetIndex = indexOfGetItemsInstruction(this) + 1
|
||||||
val targetRegister = getInstruction<OneRegisterInstruction>(targetIndex).registerA
|
val targetRegister =
|
||||||
|
getInstruction<OneRegisterInstruction>(targetIndex).registerA
|
||||||
|
|
||||||
addInstructions(
|
addInstructions(
|
||||||
targetIndex + 1, """
|
targetIndex + 1, """
|
||||||
|
@ -42,7 +42,8 @@ val subRedditDialogPatch = bytecodePatch(
|
|||||||
.apply {
|
.apply {
|
||||||
listOfIsLoggedInInstruction(this)
|
listOfIsLoggedInInstruction(this)
|
||||||
.forEach { index ->
|
.forEach { index ->
|
||||||
val register = getInstruction<OneRegisterInstruction>(index + 1).registerA
|
val register =
|
||||||
|
getInstruction<OneRegisterInstruction>(index + 1).registerA
|
||||||
|
|
||||||
addInstructions(
|
addInstructions(
|
||||||
index + 2, """
|
index + 2, """
|
||||||
|
@ -62,7 +62,7 @@ fun baseAdsPatch(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
val getAdvertisingIdMethod = with (advertisingIdFingerprint.methodOrThrow()) {
|
val getAdvertisingIdMethod = with(advertisingIdFingerprint.methodOrThrow()) {
|
||||||
val getAdvertisingIdIndex = indexOfGetAdvertisingIdInstruction(this)
|
val getAdvertisingIdIndex = indexOfGetAdvertisingIdInstruction(this)
|
||||||
getWalkerMethod(getAdvertisingIdIndex)
|
getWalkerMethod(getAdvertisingIdIndex)
|
||||||
}
|
}
|
||||||
|
@ -6,8 +6,6 @@ import app.revanced.util.indexOfFirstInstruction
|
|||||||
import app.revanced.util.or
|
import app.revanced.util.or
|
||||||
import com.android.tools.smali.dexlib2.AccessFlags
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
import com.android.tools.smali.dexlib2.Opcode
|
import com.android.tools.smali.dexlib2.Opcode
|
||||||
import com.android.tools.smali.dexlib2.iface.Method
|
|
||||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
|
||||||
import com.android.tools.smali.dexlib2.iface.reference.StringReference
|
import com.android.tools.smali.dexlib2.iface.reference.StringReference
|
||||||
import com.android.tools.smali.dexlib2.util.MethodUtil
|
import com.android.tools.smali.dexlib2.util.MethodUtil
|
||||||
|
|
||||||
|
@ -83,9 +83,9 @@ fun gmsCoreSupportPatch(
|
|||||||
key = "gmsCoreVendorGroupId",
|
key = "gmsCoreVendorGroupId",
|
||||||
default = "app.revanced",
|
default = "app.revanced",
|
||||||
values =
|
values =
|
||||||
mapOf(
|
mapOf(
|
||||||
"ReVanced" to "app.revanced",
|
"ReVanced" to "app.revanced",
|
||||||
),
|
),
|
||||||
title = "GmsCore vendor group ID",
|
title = "GmsCore vendor group ID",
|
||||||
description = "The vendor's group ID for GmsCore.",
|
description = "The vendor's group ID for GmsCore.",
|
||||||
required = true,
|
required = true,
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package app.revanced.patches.shared.mapping
|
package app.revanced.patches.shared.mapping
|
||||||
|
|
||||||
import app.revanced.patcher.patch.PatchException
|
|
||||||
import app.revanced.patcher.patch.resourcePatch
|
import app.revanced.patcher.patch.resourcePatch
|
||||||
import org.w3c.dom.Element
|
import org.w3c.dom.Element
|
||||||
|
|
||||||
|
@ -147,7 +147,8 @@ fun ResourcePatchContext.baseTranslationsPatch(
|
|||||||
val length = text.length
|
val length = text.length
|
||||||
if (!text.endsWith("DEFAULT") &&
|
if (!text.endsWith("DEFAULT") &&
|
||||||
length >= 2 &&
|
length >= 2 &&
|
||||||
text.subSequence(length - 2, length) !in filteredAppLanguages) {
|
text.subSequence(length - 2, length) !in filteredAppLanguages
|
||||||
|
) {
|
||||||
nodesToRemove.add(item)
|
nodesToRemove.add(item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -262,8 +262,10 @@ val feedComponentsPatch = bytecodePatch(
|
|||||||
val insertIndex = indexOfBufferParserInstruction(this)
|
val insertIndex = indexOfBufferParserInstruction(this)
|
||||||
|
|
||||||
if (is_19_46_or_greater) {
|
if (is_19_46_or_greater) {
|
||||||
val objectIndex = indexOfFirstInstructionReversedOrThrow(insertIndex, Opcode.IGET_OBJECT)
|
val objectIndex =
|
||||||
val objectRegister = getInstruction<TwoRegisterInstruction>(objectIndex).registerA
|
indexOfFirstInstructionReversedOrThrow(insertIndex, Opcode.IGET_OBJECT)
|
||||||
|
val objectRegister =
|
||||||
|
getInstruction<TwoRegisterInstruction>(objectIndex).registerA
|
||||||
|
|
||||||
addInstructionsWithLabels(
|
addInstructionsWithLabels(
|
||||||
insertIndex, """
|
insertIndex, """
|
||||||
@ -275,7 +277,8 @@ val feedComponentsPatch = bytecodePatch(
|
|||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
val objectIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_OBJECT)
|
val objectIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_OBJECT)
|
||||||
val objectRegister = getInstruction<TwoRegisterInstruction>(objectIndex).registerA
|
val objectRegister =
|
||||||
|
getInstruction<TwoRegisterInstruction>(objectIndex).registerA
|
||||||
val jumpIndex = it.patternMatch!!.startIndex
|
val jumpIndex = it.patternMatch!!.startIndex
|
||||||
|
|
||||||
addInstructionsWithLabels(
|
addInstructionsWithLabels(
|
||||||
|
@ -90,7 +90,8 @@ val openChannelOfLiveAvatarPatch = bytecodePatch(
|
|||||||
)
|
)
|
||||||
|
|
||||||
val playbackStartIndex = indexOfPlaybackStartDescriptorInstruction(this) + 1
|
val playbackStartIndex = indexOfPlaybackStartDescriptorInstruction(this) + 1
|
||||||
val playbackStartRegister = getInstruction<OneRegisterInstruction>(playbackStartIndex).registerA
|
val playbackStartRegister =
|
||||||
|
getInstruction<OneRegisterInstruction>(playbackStartIndex).registerA
|
||||||
|
|
||||||
val mapIndex = indexOfFirstInstructionOrThrow(playbackStartIndex) {
|
val mapIndex = indexOfFirstInstructionOrThrow(playbackStartIndex) {
|
||||||
val reference = getReference<MethodReference>()
|
val reference = getReference<MethodReference>()
|
||||||
@ -169,15 +170,24 @@ val openChannelOfLiveAvatarPatch = bytecodePatch(
|
|||||||
val playbackStartIndex = indexOfFirstInstructionOrThrow {
|
val playbackStartIndex = indexOfFirstInstructionOrThrow {
|
||||||
getReference<MethodReference>()?.returnType == PLAYBACK_START_DESCRIPTOR_CLASS_DESCRIPTOR
|
getReference<MethodReference>()?.returnType == PLAYBACK_START_DESCRIPTOR_CLASS_DESCRIPTOR
|
||||||
}
|
}
|
||||||
val mapIndex = indexOfFirstInstructionReversedOrThrow(playbackStartIndex, Opcode.IPUT)
|
val mapIndex =
|
||||||
|
indexOfFirstInstructionReversedOrThrow(playbackStartIndex, Opcode.IPUT)
|
||||||
val mapRegister = getInstruction<TwoRegisterInstruction>(mapIndex).registerA
|
val mapRegister = getInstruction<TwoRegisterInstruction>(mapIndex).registerA
|
||||||
val playbackStartRegister = getInstruction<OneRegisterInstruction>(playbackStartIndex + 1).registerA
|
val playbackStartRegister =
|
||||||
val videoIdRegister = getInstruction<FiveRegisterInstruction>(playbackStartIndex).registerC
|
getInstruction<OneRegisterInstruction>(playbackStartIndex + 1).registerA
|
||||||
|
val videoIdRegister =
|
||||||
|
getInstruction<FiveRegisterInstruction>(playbackStartIndex).registerC
|
||||||
|
|
||||||
addInstructionsWithLabels(
|
addInstructionsWithLabels(
|
||||||
playbackStartIndex + 2, """
|
playbackStartIndex + 2, """
|
||||||
move-object/from16 v$mapRegister, p2
|
move-object/from16 v$mapRegister, p2
|
||||||
${fetchChannelIdInstructions(playbackStartRegister, mapRegister, videoIdRegister)}
|
${
|
||||||
|
fetchChannelIdInstructions(
|
||||||
|
playbackStartRegister,
|
||||||
|
mapRegister,
|
||||||
|
videoIdRegister
|
||||||
|
)
|
||||||
|
}
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -80,7 +80,8 @@ private val snackBarComponentsBytecodePatch = bytecodePatch(
|
|||||||
bottomUiContainerThemeFingerprint.matchOrThrow().let {
|
bottomUiContainerThemeFingerprint.matchOrThrow().let {
|
||||||
it.method.apply {
|
it.method.apply {
|
||||||
val darkThemeIndex = it.patternMatch!!.startIndex + 2
|
val darkThemeIndex = it.patternMatch!!.startIndex + 2
|
||||||
val darkThemeReference = getInstruction<ReferenceInstruction>(darkThemeIndex).reference.toString()
|
val darkThemeReference =
|
||||||
|
getInstruction<ReferenceInstruction>(darkThemeIndex).reference.toString()
|
||||||
|
|
||||||
implementation!!.instructions
|
implementation!!.instructions
|
||||||
.withIndex()
|
.withIndex()
|
||||||
@ -91,7 +92,8 @@ private val snackBarComponentsBytecodePatch = bytecodePatch(
|
|||||||
.map { (index, _) -> index }
|
.map { (index, _) -> index }
|
||||||
.reversed()
|
.reversed()
|
||||||
.forEach { index ->
|
.forEach { index ->
|
||||||
val appThemeIndex = indexOfFirstInstructionReversedOrThrow(index, Opcode.MOVE_RESULT_OBJECT)
|
val appThemeIndex =
|
||||||
|
indexOfFirstInstructionReversedOrThrow(index, Opcode.MOVE_RESULT_OBJECT)
|
||||||
val appThemeRegister =
|
val appThemeRegister =
|
||||||
getInstruction<OneRegisterInstruction>(appThemeIndex).registerA
|
getInstruction<OneRegisterInstruction>(appThemeIndex).registerA
|
||||||
val darkThemeRegister =
|
val darkThemeRegister =
|
||||||
|
@ -86,7 +86,11 @@ val shortsActionButtonsPatch = resourcePatch(
|
|||||||
|
|
||||||
// Some directory is missing in the bundles.
|
// Some directory is missing in the bundles.
|
||||||
if (inputStreamForLegacy != null && fromFileResolved.exists()) {
|
if (inputStreamForLegacy != null && fromFileResolved.exists()) {
|
||||||
Files.copy(inputStreamForLegacy, fromFileResolved.toPath(), StandardCopyOption.REPLACE_EXISTING)
|
Files.copy(
|
||||||
|
inputStreamForLegacy,
|
||||||
|
fromFileResolved.toPath(),
|
||||||
|
StandardCopyOption.REPLACE_EXISTING
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_19_36_or_greater) {
|
if (is_19_36_or_greater) {
|
||||||
@ -95,7 +99,11 @@ val shortsActionButtonsPatch = resourcePatch(
|
|||||||
|
|
||||||
// Some directory is missing in the bundles.
|
// Some directory is missing in the bundles.
|
||||||
if (inputStreamForNew != null && toFileResolved.exists()) {
|
if (inputStreamForNew != null && toFileResolved.exists()) {
|
||||||
Files.copy(inputStreamForNew, toFileResolved.toPath(), StandardCopyOption.REPLACE_EXISTING)
|
Files.copy(
|
||||||
|
inputStreamForNew,
|
||||||
|
toFileResolved.toPath(),
|
||||||
|
StandardCopyOption.REPLACE_EXISTING
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -249,7 +249,10 @@ val customBrandingIconPatch = resourcePatch(
|
|||||||
style.setAttribute("parent", nodeAttributeParent)
|
style.setAttribute("parent", nodeAttributeParent)
|
||||||
|
|
||||||
val splashScreenAnimatedIcon = document.createElement("item")
|
val splashScreenAnimatedIcon = document.createElement("item")
|
||||||
splashScreenAnimatedIcon.setAttribute("name", "android:windowSplashScreenAnimatedIcon")
|
splashScreenAnimatedIcon.setAttribute(
|
||||||
|
"name",
|
||||||
|
"android:windowSplashScreenAnimatedIcon"
|
||||||
|
)
|
||||||
splashScreenAnimatedIcon.textContent = "@drawable/avd_anim"
|
splashScreenAnimatedIcon.textContent = "@drawable/avd_anim"
|
||||||
|
|
||||||
// Deprecated in Android 13+
|
// Deprecated in Android 13+
|
||||||
@ -258,10 +261,11 @@ val customBrandingIconPatch = resourcePatch(
|
|||||||
"name",
|
"name",
|
||||||
"android:windowSplashScreenAnimationDuration"
|
"android:windowSplashScreenAnimationDuration"
|
||||||
)
|
)
|
||||||
splashScreenAnimationDuration.textContent = if (appIcon.startsWith("revancify"))
|
splashScreenAnimationDuration.textContent =
|
||||||
"1500"
|
if (appIcon.startsWith("revancify"))
|
||||||
else
|
"1500"
|
||||||
"1000"
|
else
|
||||||
|
"1000"
|
||||||
|
|
||||||
style.appendChild(splashScreenAnimatedIcon)
|
style.appendChild(splashScreenAnimatedIcon)
|
||||||
style.appendChild(splashScreenAnimationDuration)
|
style.appendChild(splashScreenAnimationDuration)
|
||||||
|
@ -61,8 +61,10 @@ val sharedThemePatch = resourcePatch(
|
|||||||
0 -> when (nodeAttributeName) {
|
0 -> when (nodeAttributeName) {
|
||||||
"Base.Theme.YouTube.Launcher.Dark",
|
"Base.Theme.YouTube.Launcher.Dark",
|
||||||
"Base.Theme.YouTube.Launcher.Cairo.Dark" -> "@color/yt_black1"
|
"Base.Theme.YouTube.Launcher.Cairo.Dark" -> "@color/yt_black1"
|
||||||
|
|
||||||
"Base.Theme.YouTube.Launcher.Light",
|
"Base.Theme.YouTube.Launcher.Light",
|
||||||
"Base.Theme.YouTube.Launcher.Cairo.Light" -> "@color/yt_white1"
|
"Base.Theme.YouTube.Launcher.Cairo.Light" -> "@color/yt_white1"
|
||||||
|
|
||||||
else -> "null"
|
else -> "null"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,8 +32,10 @@ val accessibilityPatch = bytecodePatch(
|
|||||||
.methods
|
.methods
|
||||||
.first { method -> method.name == "<init>" }
|
.first { method -> method.name == "<init>" }
|
||||||
.apply {
|
.apply {
|
||||||
val lifecycleObserverIndex = indexOfFirstInstructionReversedOrThrow(Opcode.NEW_INSTANCE)
|
val lifecycleObserverIndex =
|
||||||
val lifecycleObserverClass = getInstruction<ReferenceInstruction>(lifecycleObserverIndex).reference.toString()
|
indexOfFirstInstructionReversedOrThrow(Opcode.NEW_INSTANCE)
|
||||||
|
val lifecycleObserverClass =
|
||||||
|
getInstruction<ReferenceInstruction>(lifecycleObserverIndex).reference.toString()
|
||||||
|
|
||||||
findMethodOrThrow(lifecycleObserverClass) {
|
findMethodOrThrow(lifecycleObserverClass) {
|
||||||
accessFlags == AccessFlags.PUBLIC or AccessFlags.FINAL &&
|
accessFlags == AccessFlags.PUBLIC or AccessFlags.FINAL &&
|
||||||
|
@ -85,17 +85,19 @@ val backgroundPlaybackPatch = bytecodePatch(
|
|||||||
backgroundPlaybackManagerCairoFragmentPrimaryFingerprint,
|
backgroundPlaybackManagerCairoFragmentPrimaryFingerprint,
|
||||||
backgroundPlaybackManagerCairoFragmentSecondaryFingerprint
|
backgroundPlaybackManagerCairoFragmentSecondaryFingerprint
|
||||||
).forEach { fingerprint ->
|
).forEach { fingerprint ->
|
||||||
fingerprint.matchOrThrow(backgroundPlaybackManagerCairoFragmentParentFingerprint).let {
|
fingerprint.matchOrThrow(backgroundPlaybackManagerCairoFragmentParentFingerprint)
|
||||||
it.method.apply {
|
.let {
|
||||||
val insertIndex = it.patternMatch!!.startIndex + 4
|
it.method.apply {
|
||||||
val insertRegister = getInstruction<OneRegisterInstruction>(insertIndex).registerA
|
val insertIndex = it.patternMatch!!.startIndex + 4
|
||||||
|
val insertRegister =
|
||||||
|
getInstruction<OneRegisterInstruction>(insertIndex).registerA
|
||||||
|
|
||||||
addInstruction(
|
addInstruction(
|
||||||
insertIndex,
|
insertIndex,
|
||||||
"const/4 v$insertRegister, 0x0"
|
"const/4 v$insertRegister, 0x0"
|
||||||
)
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pipInputConsumerFeatureFlagFingerprint.injectLiteralInstructionBooleanCall(
|
pipInputConsumerFeatureFlagFingerprint.injectLiteralInstructionBooleanCall(
|
||||||
|
@ -57,20 +57,26 @@ val actionButtonsPatch = bytecodePatch(
|
|||||||
findMethodOrThrow(parameters[1].type) {
|
findMethodOrThrow(parameters[1].type) {
|
||||||
name == "toString"
|
name == "toString"
|
||||||
}
|
}
|
||||||
val identifierReference = with (conversionContextToStringMethod) {
|
val identifierReference = with(conversionContextToStringMethod) {
|
||||||
val identifierStringIndex =
|
val identifierStringIndex =
|
||||||
indexOfFirstStringInstructionOrThrow(", identifierProperty=")
|
indexOfFirstStringInstructionOrThrow(", identifierProperty=")
|
||||||
val identifierStringAppendIndex =
|
val identifierStringAppendIndex =
|
||||||
indexOfFirstInstructionOrThrow(identifierStringIndex, Opcode.INVOKE_VIRTUAL)
|
indexOfFirstInstructionOrThrow(identifierStringIndex, Opcode.INVOKE_VIRTUAL)
|
||||||
val identifierStringAppendIndexRegister = getInstruction<FiveRegisterInstruction>(identifierStringAppendIndex).registerD
|
val identifierStringAppendIndexRegister =
|
||||||
|
getInstruction<FiveRegisterInstruction>(identifierStringAppendIndex).registerD
|
||||||
val identifierAppendIndex =
|
val identifierAppendIndex =
|
||||||
indexOfFirstInstructionOrThrow(identifierStringAppendIndex + 1, Opcode.INVOKE_VIRTUAL)
|
indexOfFirstInstructionOrThrow(
|
||||||
val identifierRegister = getInstruction<FiveRegisterInstruction>(identifierAppendIndex).registerD
|
identifierStringAppendIndex + 1,
|
||||||
val identifierIndex = indexOfFirstInstructionReversedOrThrow(identifierAppendIndex) {
|
Opcode.INVOKE_VIRTUAL
|
||||||
opcode == Opcode.IGET_OBJECT &&
|
)
|
||||||
getReference<FieldReference>()?.type == "Ljava/lang/String;" &&
|
val identifierRegister =
|
||||||
(this as? TwoRegisterInstruction)?.registerA == identifierRegister
|
getInstruction<FiveRegisterInstruction>(identifierAppendIndex).registerD
|
||||||
}
|
val identifierIndex =
|
||||||
|
indexOfFirstInstructionReversedOrThrow(identifierAppendIndex) {
|
||||||
|
opcode == Opcode.IGET_OBJECT &&
|
||||||
|
getReference<FieldReference>()?.type == "Ljava/lang/String;" &&
|
||||||
|
(this as? TwoRegisterInstruction)?.registerA == identifierRegister
|
||||||
|
}
|
||||||
getInstruction<ReferenceInstruction>(identifierIndex).reference
|
getInstruction<ReferenceInstruction>(identifierIndex).reference
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,11 +10,11 @@ import app.revanced.patches.youtube.utils.resourceid.endScreenElementLayoutCircl
|
|||||||
import app.revanced.patches.youtube.utils.resourceid.endScreenElementLayoutIcon
|
import app.revanced.patches.youtube.utils.resourceid.endScreenElementLayoutIcon
|
||||||
import app.revanced.patches.youtube.utils.resourceid.endScreenElementLayoutVideo
|
import app.revanced.patches.youtube.utils.resourceid.endScreenElementLayoutVideo
|
||||||
import app.revanced.patches.youtube.utils.resourceid.offlineActionsVideoDeletedUndoSnackbarText
|
import app.revanced.patches.youtube.utils.resourceid.offlineActionsVideoDeletedUndoSnackbarText
|
||||||
import app.revanced.patches.youtube.utils.resourceid.verticalTouchOffsetToEnterFineScrubbing
|
|
||||||
import app.revanced.patches.youtube.utils.resourceid.seekEasyHorizontalTouchOffsetToStartScrubbing
|
import app.revanced.patches.youtube.utils.resourceid.seekEasyHorizontalTouchOffsetToStartScrubbing
|
||||||
import app.revanced.patches.youtube.utils.resourceid.suggestedAction
|
import app.revanced.patches.youtube.utils.resourceid.suggestedAction
|
||||||
import app.revanced.patches.youtube.utils.resourceid.tapBloomView
|
import app.revanced.patches.youtube.utils.resourceid.tapBloomView
|
||||||
import app.revanced.patches.youtube.utils.resourceid.touchArea
|
import app.revanced.patches.youtube.utils.resourceid.touchArea
|
||||||
|
import app.revanced.patches.youtube.utils.resourceid.verticalTouchOffsetToEnterFineScrubbing
|
||||||
import app.revanced.patches.youtube.utils.resourceid.verticalTouchOffsetToStartFineScrubbing
|
import app.revanced.patches.youtube.utils.resourceid.verticalTouchOffsetToStartFineScrubbing
|
||||||
import app.revanced.patches.youtube.utils.resourceid.videoZoomSnapIndicator
|
import app.revanced.patches.youtube.utils.resourceid.videoZoomSnapIndicator
|
||||||
import app.revanced.util.fingerprint.legacyFingerprint
|
import app.revanced.util.fingerprint.legacyFingerprint
|
||||||
|
@ -129,9 +129,11 @@ private val speedOverlayPatch = bytecodePatch(
|
|||||||
|
|
||||||
// region patch for Custom speed overlay float value
|
// region patch for Custom speed overlay float value
|
||||||
|
|
||||||
val speedFieldReference = with (speedOverlayFloatValueFingerprint.methodOrThrow()) {
|
val speedFieldReference = with(speedOverlayFloatValueFingerprint.methodOrThrow()) {
|
||||||
val literalIndex = indexOfFirstLiteralInstructionOrThrow(SPEED_OVERLAY_LEGACY_FEATURE_FLAG)
|
val literalIndex =
|
||||||
val floatIndex = indexOfFirstInstructionOrThrow(literalIndex, Opcode.DOUBLE_TO_FLOAT)
|
indexOfFirstLiteralInstructionOrThrow(SPEED_OVERLAY_LEGACY_FEATURE_FLAG)
|
||||||
|
val floatIndex =
|
||||||
|
indexOfFirstInstructionOrThrow(literalIndex, Opcode.DOUBLE_TO_FLOAT)
|
||||||
val floatRegister = getInstruction<TwoRegisterInstruction>(floatIndex).registerA
|
val floatRegister = getInstruction<TwoRegisterInstruction>(floatIndex).registerA
|
||||||
|
|
||||||
addInstructions(
|
addInstructions(
|
||||||
@ -604,7 +606,9 @@ val playerComponentsPatch = bytecodePatch(
|
|||||||
)
|
)
|
||||||
|
|
||||||
if (is_20_12_or_greater) {
|
if (is_20_12_or_greater) {
|
||||||
filmStripOverlayMotionEventPrimaryFingerprint.matchOrThrow(filmStripOverlayStartParentFingerprint).let {
|
filmStripOverlayMotionEventPrimaryFingerprint.matchOrThrow(
|
||||||
|
filmStripOverlayStartParentFingerprint
|
||||||
|
).let {
|
||||||
it.method.apply {
|
it.method.apply {
|
||||||
val index = it.patternMatch!!.startIndex
|
val index = it.patternMatch!!.startIndex
|
||||||
val register = getInstruction<TwoRegisterInstruction>(index).registerA
|
val register = getInstruction<TwoRegisterInstruction>(index).registerA
|
||||||
@ -613,7 +617,9 @@ val playerComponentsPatch = bytecodePatch(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
filmStripOverlayMotionEventSecondaryFingerprint.matchOrThrow(filmStripOverlayStartParentFingerprint).let {
|
filmStripOverlayMotionEventSecondaryFingerprint.matchOrThrow(
|
||||||
|
filmStripOverlayStartParentFingerprint
|
||||||
|
).let {
|
||||||
it.method.apply {
|
it.method.apply {
|
||||||
val index = it.patternMatch!!.startIndex + 2
|
val index = it.patternMatch!!.startIndex + 2
|
||||||
val register = getInstruction<OneRegisterInstruction>(index).registerA
|
val register = getInstruction<OneRegisterInstruction>(index).registerA
|
||||||
|
@ -7,7 +7,6 @@ import app.revanced.patches.youtube.utils.resourceid.quickActionsElementContaine
|
|||||||
import app.revanced.util.fingerprint.legacyFingerprint
|
import app.revanced.util.fingerprint.legacyFingerprint
|
||||||
import app.revanced.util.or
|
import app.revanced.util.or
|
||||||
import com.android.tools.smali.dexlib2.AccessFlags
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
import com.android.tools.smali.dexlib2.util.MethodUtil
|
|
||||||
|
|
||||||
internal val broadcastReceiverFingerprint = legacyFingerprint(
|
internal val broadcastReceiverFingerprint = legacyFingerprint(
|
||||||
name = "broadcastReceiverFingerprint",
|
name = "broadcastReceiverFingerprint",
|
||||||
|
@ -63,6 +63,7 @@ internal val miniplayerResponseModelSizeCheckFingerprint = legacyFingerprint(
|
|||||||
// region modern miniplayer
|
// region modern miniplayer
|
||||||
|
|
||||||
internal const val MINIPLAYER_MODERN_FEATURE_KEY = 45622882L
|
internal const val MINIPLAYER_MODERN_FEATURE_KEY = 45622882L
|
||||||
|
|
||||||
// In later targets this feature flag does nothing and is dead code.
|
// In later targets this feature flag does nothing and is dead code.
|
||||||
internal const val MINIPLAYER_MODERN_FEATURE_LEGACY_KEY = 45630429L
|
internal const val MINIPLAYER_MODERN_FEATURE_LEGACY_KEY = 45630429L
|
||||||
internal const val MINIPLAYER_DOUBLE_TAP_FEATURE_KEY = 45628823L
|
internal const val MINIPLAYER_DOUBLE_TAP_FEATURE_KEY = 45628823L
|
||||||
|
@ -239,7 +239,8 @@ val miniplayerPatch = bytecodePatch(
|
|||||||
val register = getInstruction<OneRegisterInstruction>(targetIndex).registerA
|
val register = getInstruction<OneRegisterInstruction>(targetIndex).registerA
|
||||||
|
|
||||||
addInstructions(
|
addInstructions(
|
||||||
targetIndex + 1, """
|
targetIndex + 1,
|
||||||
|
"""
|
||||||
invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getMiniplayerDefaultSize(I)I
|
invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getMiniplayerDefaultSize(I)I
|
||||||
move-result v$register
|
move-result v$register
|
||||||
""",
|
""",
|
||||||
|
@ -256,7 +256,8 @@ val overlayButtonsPatch = resourcePatch(
|
|||||||
width != "0.0dip",
|
width != "0.0dip",
|
||||||
)
|
)
|
||||||
|
|
||||||
val isButton = id.endsWith("_button") && id != "@id/multiview_button" || id == "@id/youtube_controls_fullscreen_button_stub"
|
val isButton =
|
||||||
|
id.endsWith("_button") && id != "@id/multiview_button" || id == "@id/youtube_controls_fullscreen_button_stub"
|
||||||
|
|
||||||
// Adjust TimeBar and Chapter bottom padding
|
// Adjust TimeBar and Chapter bottom padding
|
||||||
val timBarItem = mutableMapOf(
|
val timBarItem = mutableMapOf(
|
||||||
@ -286,7 +287,10 @@ val overlayButtonsPatch = resourcePatch(
|
|||||||
if (id.equals("@+id/bottom_margin")) {
|
if (id.equals("@+id/bottom_margin")) {
|
||||||
node.setAttribute("android:layout_height", marginBottom)
|
node.setAttribute("android:layout_height", marginBottom)
|
||||||
} else if (id.equals("@id/time_bar_reference_view")) {
|
} else if (id.equals("@id/time_bar_reference_view")) {
|
||||||
node.setAttribute("yt:layout_constraintBottom_toTopOf", "@id/quick_actions_container")
|
node.setAttribute(
|
||||||
|
"yt:layout_constraintBottom_toTopOf",
|
||||||
|
"@id/quick_actions_container"
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,6 @@ import com.android.tools.smali.dexlib2.AccessFlags
|
|||||||
import com.android.tools.smali.dexlib2.Opcode
|
import com.android.tools.smali.dexlib2.Opcode
|
||||||
import com.android.tools.smali.dexlib2.iface.Method
|
import com.android.tools.smali.dexlib2.iface.Method
|
||||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||||
import kotlin.collections.listOf
|
|
||||||
|
|
||||||
internal val shortsSeekbarColorFingerprint = legacyFingerprint(
|
internal val shortsSeekbarColorFingerprint = legacyFingerprint(
|
||||||
name = "shortsSeekbarColorFingerprint",
|
name = "shortsSeekbarColorFingerprint",
|
||||||
|
@ -139,7 +139,8 @@ val seekbarComponentsPatch = bytecodePatch(
|
|||||||
reference?.returnType == "V" &&
|
reference?.returnType == "V" &&
|
||||||
reference.parameterTypes.isEmpty()
|
reference.parameterTypes.isEmpty()
|
||||||
}
|
}
|
||||||
val thisInstanceRegister = getInstruction<FiveRegisterInstruction>(tapSeekIndex).registerC
|
val thisInstanceRegister =
|
||||||
|
getInstruction<FiveRegisterInstruction>(tapSeekIndex).registerC
|
||||||
|
|
||||||
val tapSeekClass = getInstruction(tapSeekIndex)
|
val tapSeekClass = getInstruction(tapSeekIndex)
|
||||||
.getReference<MethodReference>()!!
|
.getReference<MethodReference>()!!
|
||||||
@ -274,7 +275,10 @@ val seekbarComponentsPatch = bytecodePatch(
|
|||||||
playerSeekbarHandleColorPrimaryFingerprint,
|
playerSeekbarHandleColorPrimaryFingerprint,
|
||||||
playerSeekbarHandleColorSecondaryFingerprint
|
playerSeekbarHandleColorSecondaryFingerprint
|
||||||
).forEach {
|
).forEach {
|
||||||
it.methodOrThrow().addColorChangeInstructions(ytStaticBrandRed, "getVideoPlayerSeekbarColorAccent")
|
it.methodOrThrow().addColorChangeInstructions(
|
||||||
|
ytStaticBrandRed,
|
||||||
|
"getVideoPlayerSeekbarColorAccent"
|
||||||
|
)
|
||||||
}
|
}
|
||||||
// If hiding feed seekbar thumbnails, then turn off the cairo gradient
|
// If hiding feed seekbar thumbnails, then turn off the cairo gradient
|
||||||
// of the watch history menu items as they use the same gradient as the
|
// of the watch history menu items as they use the same gradient as the
|
||||||
|
@ -22,7 +22,6 @@ import com.android.tools.smali.dexlib2.Opcode
|
|||||||
import com.android.tools.smali.dexlib2.iface.Method
|
import com.android.tools.smali.dexlib2.iface.Method
|
||||||
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||||
import kotlin.collections.listOf
|
|
||||||
|
|
||||||
internal val bottomSheetMenuDismissFingerprint = legacyFingerprint(
|
internal val bottomSheetMenuDismissFingerprint = legacyFingerprint(
|
||||||
name = "bottomSheetMenuDismissFingerprint",
|
name = "bottomSheetMenuDismissFingerprint",
|
||||||
|
@ -344,7 +344,11 @@ private val shortsCustomActionsPatch = bytecodePatch(
|
|||||||
recyclerViewTreeObserverHook("$EXTENSION_CUSTOM_ACTIONS_CLASS_DESCRIPTOR->onFlyoutMenuCreate(Landroid/support/v7/widget/RecyclerView;)V")
|
recyclerViewTreeObserverHook("$EXTENSION_CUSTOM_ACTIONS_CLASS_DESCRIPTOR->onFlyoutMenuCreate(Landroid/support/v7/widget/RecyclerView;)V")
|
||||||
} else {
|
} else {
|
||||||
// The type of the Shorts flyout menu is ListView.
|
// The type of the Shorts flyout menu is ListView.
|
||||||
val dismissReference = with (bottomSheetMenuDismissFingerprint.methodOrThrow(bottomSheetMenuListBuilderFingerprint)) {
|
val dismissReference = with(
|
||||||
|
bottomSheetMenuDismissFingerprint.methodOrThrow(
|
||||||
|
bottomSheetMenuListBuilderFingerprint
|
||||||
|
)
|
||||||
|
) {
|
||||||
val dismissIndex = indexOfDismissInstruction(this)
|
val dismissIndex = indexOfDismissInstruction(this)
|
||||||
getInstruction<ReferenceInstruction>(dismissIndex).reference
|
getInstruction<ReferenceInstruction>(dismissIndex).reference
|
||||||
}
|
}
|
||||||
@ -352,7 +356,8 @@ private val shortsCustomActionsPatch = bytecodePatch(
|
|||||||
bottomSheetMenuItemClickFingerprint
|
bottomSheetMenuItemClickFingerprint
|
||||||
.methodOrThrow(bottomSheetMenuListBuilderFingerprint)
|
.methodOrThrow(bottomSheetMenuListBuilderFingerprint)
|
||||||
.addInstructionsWithLabels(
|
.addInstructionsWithLabels(
|
||||||
0, """
|
0,
|
||||||
|
"""
|
||||||
invoke-static/range {p2 .. p2}, $EXTENSION_CUSTOM_ACTIONS_CLASS_DESCRIPTOR->onBottomSheetMenuItemClick(Landroid/view/View;)Z
|
invoke-static/range {p2 .. p2}, $EXTENSION_CUSTOM_ACTIONS_CLASS_DESCRIPTOR->onBottomSheetMenuItemClick(Landroid/view/View;)Z
|
||||||
move-result v0
|
move-result v0
|
||||||
if-eqz v0, :ignore
|
if-eqz v0, :ignore
|
||||||
@ -430,7 +435,7 @@ private val shortsRepeatPatch = bytecodePatch(
|
|||||||
"setMainActivity"
|
"setMainActivity"
|
||||||
)
|
)
|
||||||
|
|
||||||
val endScreenReference = with (reelEnumConstructorFingerprint.methodOrThrow()) {
|
val endScreenReference = with(reelEnumConstructorFingerprint.methodOrThrow()) {
|
||||||
val insertIndex = indexOfFirstInstructionOrThrow(Opcode.RETURN_VOID)
|
val insertIndex = indexOfFirstInstructionOrThrow(Opcode.RETURN_VOID)
|
||||||
|
|
||||||
addInstructions(
|
addInstructions(
|
||||||
@ -510,7 +515,11 @@ private val shortsRepeatPatch = bytecodePatch(
|
|||||||
// Manually add the 'Autoplay' code that Google removed.
|
// Manually add the 'Autoplay' code that Google removed.
|
||||||
// Tested on YouTube 20.10.
|
// Tested on YouTube 20.10.
|
||||||
if (is_20_09_or_greater) {
|
if (is_20_09_or_greater) {
|
||||||
val (directReference, virtualReference) = with (reelPlaybackFingerprint.methodOrThrow(videoIdFingerprintShorts)) {
|
val (directReference, virtualReference) = with(
|
||||||
|
reelPlaybackFingerprint.methodOrThrow(
|
||||||
|
videoIdFingerprintShorts
|
||||||
|
)
|
||||||
|
) {
|
||||||
val directIndex = indexOfInitializationInstruction(this)
|
val directIndex = indexOfInitializationInstruction(this)
|
||||||
val virtualIndex = indexOfFirstInstructionOrThrow(directIndex) {
|
val virtualIndex = indexOfFirstInstructionOrThrow(directIndex) {
|
||||||
opcode == Opcode.INVOKE_VIRTUAL &&
|
opcode == Opcode.INVOKE_VIRTUAL &&
|
||||||
@ -528,7 +537,8 @@ private val shortsRepeatPatch = bytecodePatch(
|
|||||||
opcode == Opcode.INVOKE_STATIC &&
|
opcode == Opcode.INVOKE_STATIC &&
|
||||||
getReference<MethodReference>()?.definingClass == EXTENSION_REPEAT_STATE_CLASS_DESCRIPTOR
|
getReference<MethodReference>()?.definingClass == EXTENSION_REPEAT_STATE_CLASS_DESCRIPTOR
|
||||||
}
|
}
|
||||||
val enumRegister = getInstruction<OneRegisterInstruction>(extensionIndex + 1).registerA
|
val enumRegister =
|
||||||
|
getInstruction<OneRegisterInstruction>(extensionIndex + 1).registerA
|
||||||
val freeIndex = indexOfFirstInstructionOrThrow(extensionIndex) {
|
val freeIndex = indexOfFirstInstructionOrThrow(extensionIndex) {
|
||||||
opcode == Opcode.SGET_OBJECT &&
|
opcode == Opcode.SGET_OBJECT &&
|
||||||
getReference<FieldReference>()?.name != "a"
|
getReference<FieldReference>()?.name != "a"
|
||||||
@ -1014,7 +1024,8 @@ val shortsComponentPatch = bytecodePatch(
|
|||||||
getReference<MethodReference>()?.returnType == PLAYBACK_START_DESCRIPTOR_CLASS_DESCRIPTOR
|
getReference<MethodReference>()?.returnType == PLAYBACK_START_DESCRIPTOR_CLASS_DESCRIPTOR
|
||||||
}
|
}
|
||||||
val freeRegister = getInstruction<FiveRegisterInstruction>(index).registerC
|
val freeRegister = getInstruction<FiveRegisterInstruction>(index).registerC
|
||||||
val playbackStartRegister = getInstruction<OneRegisterInstruction>(index + 1).registerA
|
val playbackStartRegister =
|
||||||
|
getInstruction<OneRegisterInstruction>(index + 1).registerA
|
||||||
|
|
||||||
addInstructionsWithLabels(
|
addInstructionsWithLabels(
|
||||||
index + 2,
|
index + 2,
|
||||||
|
@ -116,7 +116,7 @@ val cairoFragmentPatch = resourcePatch(
|
|||||||
?.let { node ->
|
?.let { node ->
|
||||||
node.insertNode("Preference", node) {
|
node.insertNode("Preference", node) {
|
||||||
for (index in 0 until node.attributes.length) {
|
for (index in 0 until node.attributes.length) {
|
||||||
with (node.attributes.item(index)) {
|
with(node.attributes.item(index)) {
|
||||||
setAttribute(nodeName, nodeValue)
|
setAttribute(nodeName, nodeValue)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
package app.revanced.patches.youtube.utils.fix.cairo
|
package app.revanced.patches.youtube.utils.fix.cairo
|
||||||
|
|
||||||
|
import app.revanced.patches.youtube.utils.resourceid.settingsFragment
|
||||||
|
import app.revanced.patches.youtube.utils.resourceid.settingsFragmentCairo
|
||||||
import app.revanced.util.fingerprint.legacyFingerprint
|
import app.revanced.util.fingerprint.legacyFingerprint
|
||||||
import app.revanced.util.or
|
import app.revanced.util.or
|
||||||
import com.android.tools.smali.dexlib2.AccessFlags
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
import app.revanced.patches.youtube.utils.resourceid.settingsFragment
|
|
||||||
import app.revanced.patches.youtube.utils.resourceid.settingsFragmentCairo
|
|
||||||
import com.android.tools.smali.dexlib2.Opcode
|
import com.android.tools.smali.dexlib2.Opcode
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -22,7 +22,6 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
|
|||||||
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||||
import com.android.tools.smali.dexlib2.iface.reference.TypeReference
|
import com.android.tools.smali.dexlib2.iface.reference.TypeReference
|
||||||
import kotlin.collections.mutableListOf
|
|
||||||
|
|
||||||
private const val EXTENSION_VIDEO_UTILS_CLASS_DESCRIPTOR =
|
private const val EXTENSION_VIDEO_UTILS_CLASS_DESCRIPTOR =
|
||||||
"$EXTENSION_PATH/utils/VideoUtils;"
|
"$EXTENSION_PATH/utils/VideoUtils;"
|
||||||
@ -59,7 +58,10 @@ val fullscreenButtonHookPatch = bytecodePatch(
|
|||||||
getReference<MethodReference>()?.name == "addListener"
|
getReference<MethodReference>()?.name == "addListener"
|
||||||
}
|
}
|
||||||
val animatorListenerAdapterClass = getInstruction<ReferenceInstruction>(
|
val animatorListenerAdapterClass = getInstruction<ReferenceInstruction>(
|
||||||
indexOfFirstInstructionReversedOrThrow(addListenerIndex, Opcode.NEW_INSTANCE)
|
indexOfFirstInstructionReversedOrThrow(
|
||||||
|
addListenerIndex,
|
||||||
|
Opcode.NEW_INSTANCE
|
||||||
|
)
|
||||||
).reference.toString()
|
).reference.toString()
|
||||||
return Pair(
|
return Pair(
|
||||||
findMethodOrThrow(animatorListenerAdapterClass) { parameters.isEmpty() },
|
findMethodOrThrow(animatorListenerAdapterClass) { parameters.isEmpty() },
|
||||||
|
@ -86,7 +86,7 @@ internal val appCompatToolbarBackButtonFingerprint = legacyFingerprint(
|
|||||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
returnType = "Landroid/graphics/drawable/Drawable;",
|
returnType = "Landroid/graphics/drawable/Drawable;",
|
||||||
parameters = emptyList(),
|
parameters = emptyList(),
|
||||||
customFingerprint = { _, classDef ->
|
customFingerprint = { _, classDef ->
|
||||||
classDef.type == "Landroid/support/v7/widget/Toolbar;"
|
classDef.type == "Landroid/support/v7/widget/Toolbar;"
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -56,7 +56,7 @@ val playlistPatch = bytecodePatch(
|
|||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
|
|
||||||
val setVideoIdReference = with (playlistEndpointFingerprint.methodOrThrow()) {
|
val setVideoIdReference = with(playlistEndpointFingerprint.methodOrThrow()) {
|
||||||
val setVideoIdIndex = indexOfSetVideoIdInstruction(this)
|
val setVideoIdIndex = indexOfSetVideoIdInstruction(this)
|
||||||
getInstruction<ReferenceInstruction>(setVideoIdIndex).reference as FieldReference
|
getInstruction<ReferenceInstruction>(setVideoIdIndex).reference as FieldReference
|
||||||
}
|
}
|
||||||
@ -67,14 +67,16 @@ val playlistPatch = bytecodePatch(
|
|||||||
.let {
|
.let {
|
||||||
it.method.apply {
|
it.method.apply {
|
||||||
val castIndex = it.patternMatch!!.startIndex
|
val castIndex = it.patternMatch!!.startIndex
|
||||||
val castClass = getInstruction<ReferenceInstruction>(castIndex).reference.toString()
|
val castClass =
|
||||||
|
getInstruction<ReferenceInstruction>(castIndex).reference.toString()
|
||||||
|
|
||||||
if (castClass != setVideoIdReference.definingClass) {
|
if (castClass != setVideoIdReference.definingClass) {
|
||||||
throw PatchException("Method signature parameter did not match: $castClass")
|
throw PatchException("Method signature parameter did not match: $castClass")
|
||||||
}
|
}
|
||||||
val castRegister = getInstruction<OneRegisterInstruction>(castIndex).registerA
|
val castRegister = getInstruction<OneRegisterInstruction>(castIndex).registerA
|
||||||
val insertIndex = castIndex + 1
|
val insertIndex = castIndex + 1
|
||||||
val insertRegister = getInstruction<TwoRegisterInstruction>(insertIndex).registerA
|
val insertRegister =
|
||||||
|
getInstruction<TwoRegisterInstruction>(insertIndex).registerA
|
||||||
|
|
||||||
addInstructions(
|
addInstructions(
|
||||||
insertIndex, """
|
insertIndex, """
|
||||||
|
@ -316,9 +316,11 @@ internal val sharedResourceIdPatch = resourcePatch(
|
|||||||
fullScreenEngagementPanel = getResourceId(ID, "fullscreen_engagement_panel_holder")
|
fullScreenEngagementPanel = getResourceId(ID, "fullscreen_engagement_panel_holder")
|
||||||
horizontalCardList = getResourceId(LAYOUT, "horizontal_card_list")
|
horizontalCardList = getResourceId(LAYOUT, "horizontal_card_list")
|
||||||
imageOnlyTab = getResourceId(LAYOUT, "image_only_tab")
|
imageOnlyTab = getResourceId(LAYOUT, "image_only_tab")
|
||||||
inlineTimeBarColorizedBarPlayedColorDark = getResourceId(COLOR, "inline_time_bar_colorized_bar_played_color_dark")
|
inlineTimeBarColorizedBarPlayedColorDark =
|
||||||
|
getResourceId(COLOR, "inline_time_bar_colorized_bar_played_color_dark")
|
||||||
inlineTimeBarLiveSeekAbleRange = getResourceId(COLOR, "inline_time_bar_live_seekable_range")
|
inlineTimeBarLiveSeekAbleRange = getResourceId(COLOR, "inline_time_bar_live_seekable_range")
|
||||||
inlineTimeBarPlayedNotHighlightedColor = getResourceId(COLOR, "inline_time_bar_played_not_highlighted_color")
|
inlineTimeBarPlayedNotHighlightedColor =
|
||||||
|
getResourceId(COLOR, "inline_time_bar_played_not_highlighted_color")
|
||||||
insetOverlayViewLayout = getResourceId(ID, "inset_overlay_view_layout")
|
insetOverlayViewLayout = getResourceId(ID, "inset_overlay_view_layout")
|
||||||
interstitialsContainer = getResourceId(ID, "interstitials_container")
|
interstitialsContainer = getResourceId(ID, "interstitials_container")
|
||||||
insetElementsWrapper = getResourceId(LAYOUT, "inset_elements_wrapper")
|
insetElementsWrapper = getResourceId(LAYOUT, "inset_elements_wrapper")
|
||||||
@ -328,14 +330,19 @@ internal val sharedResourceIdPatch = resourcePatch(
|
|||||||
modernMiniPlayerClose = getResourceId(ID, "modern_miniplayer_close")
|
modernMiniPlayerClose = getResourceId(ID, "modern_miniplayer_close")
|
||||||
modernMiniPlayerExpand = getResourceId(ID, "modern_miniplayer_expand")
|
modernMiniPlayerExpand = getResourceId(ID, "modern_miniplayer_expand")
|
||||||
modernMiniPlayerForwardButton = getResourceId(ID, "modern_miniplayer_forward_button")
|
modernMiniPlayerForwardButton = getResourceId(ID, "modern_miniplayer_forward_button")
|
||||||
modernMiniPlayerOverlayActionButton = getResourceId(ID, "modern_miniplayer_overlay_action_button")
|
modernMiniPlayerOverlayActionButton =
|
||||||
|
getResourceId(ID, "modern_miniplayer_overlay_action_button")
|
||||||
modernMiniPlayerRewindButton = getResourceId(ID, "modern_miniplayer_rewind_button")
|
modernMiniPlayerRewindButton = getResourceId(ID, "modern_miniplayer_rewind_button")
|
||||||
musicAppDeeplinkButtonView = getResourceId(ID, "music_app_deeplink_button_view")
|
musicAppDeeplinkButtonView = getResourceId(ID, "music_app_deeplink_button_view")
|
||||||
notificationBigPictureIconWidth = getResourceId(DIMEN, "notification_big_picture_icon_width")
|
notificationBigPictureIconWidth =
|
||||||
offlineActionsVideoDeletedUndoSnackbarText = getResourceId(STRING, "offline_actions_video_deleted_undo_snackbar_text")
|
getResourceId(DIMEN, "notification_big_picture_icon_width")
|
||||||
|
offlineActionsVideoDeletedUndoSnackbarText =
|
||||||
|
getResourceId(STRING, "offline_actions_video_deleted_undo_snackbar_text")
|
||||||
playerCollapseButton = getResourceId(ID, "player_collapse_button")
|
playerCollapseButton = getResourceId(ID, "player_collapse_button")
|
||||||
playerControlPreviousButtonTouchArea = getResourceId(ID, "player_control_previous_button_touch_area")
|
playerControlPreviousButtonTouchArea =
|
||||||
playerControlNextButtonTouchArea = getResourceId(ID, "player_control_next_button_touch_area")
|
getResourceId(ID, "player_control_previous_button_touch_area")
|
||||||
|
playerControlNextButtonTouchArea =
|
||||||
|
getResourceId(ID, "player_control_next_button_touch_area")
|
||||||
playerVideoTitleView = getResourceId(ID, "player_video_title_view")
|
playerVideoTitleView = getResourceId(ID, "player_video_title_view")
|
||||||
posterArtWidthDefault = getResourceId(DIMEN, "poster_art_width_default")
|
posterArtWidthDefault = getResourceId(DIMEN, "poster_art_width_default")
|
||||||
qualityAuto = getResourceId(STRING, "quality_auto")
|
qualityAuto = getResourceId(STRING, "quality_auto")
|
||||||
@ -356,7 +363,8 @@ internal val sharedResourceIdPatch = resourcePatch(
|
|||||||
relatedChipCloudMargin = getResourceId(LAYOUT, "related_chip_cloud_reduced_margins")
|
relatedChipCloudMargin = getResourceId(LAYOUT, "related_chip_cloud_reduced_margins")
|
||||||
rightComment = getResourceId(DRAWABLE, "ic_right_comment_32c")
|
rightComment = getResourceId(DRAWABLE, "ic_right_comment_32c")
|
||||||
scrimOverlay = getResourceId(ID, "scrim_overlay")
|
scrimOverlay = getResourceId(ID, "scrim_overlay")
|
||||||
seekEasyHorizontalTouchOffsetToStartScrubbing = getResourceId(DIMEN, "seek_easy_horizontal_touch_offset_to_start_scrubbing")
|
seekEasyHorizontalTouchOffsetToStartScrubbing =
|
||||||
|
getResourceId(DIMEN, "seek_easy_horizontal_touch_offset_to_start_scrubbing")
|
||||||
seekUndoEduOverlayStub = getResourceId(ID, "seek_undo_edu_overlay_stub")
|
seekUndoEduOverlayStub = getResourceId(ID, "seek_undo_edu_overlay_stub")
|
||||||
settingsFragment = getResourceId(XML, "settings_fragment")
|
settingsFragment = getResourceId(XML, "settings_fragment")
|
||||||
settingsFragmentCairo = getResourceId(XML, "settings_fragment_cairo")
|
settingsFragmentCairo = getResourceId(XML, "settings_fragment_cairo")
|
||||||
@ -369,20 +377,26 @@ internal val sharedResourceIdPatch = resourcePatch(
|
|||||||
toolTipContentView = getResourceId(LAYOUT, "tooltip_content_view")
|
toolTipContentView = getResourceId(LAYOUT, "tooltip_content_view")
|
||||||
totalTime = getResourceId(STRING, "total_time")
|
totalTime = getResourceId(STRING, "total_time")
|
||||||
touchArea = getResourceId(ID, "touch_area")
|
touchArea = getResourceId(ID, "touch_area")
|
||||||
videoQualityBottomSheet = getResourceId(LAYOUT, "video_quality_bottom_sheet_list_fragment_title")
|
videoQualityBottomSheet =
|
||||||
|
getResourceId(LAYOUT, "video_quality_bottom_sheet_list_fragment_title")
|
||||||
varispeedUnavailableTitle = getResourceId(STRING, "varispeed_unavailable_title")
|
varispeedUnavailableTitle = getResourceId(STRING, "varispeed_unavailable_title")
|
||||||
verticalTouchOffsetToEnterFineScrubbing = getResourceId(DIMEN, "vertical_touch_offset_to_enter_fine_scrubbing")
|
verticalTouchOffsetToEnterFineScrubbing =
|
||||||
verticalTouchOffsetToStartFineScrubbing = getResourceId(DIMEN, "vertical_touch_offset_to_start_fine_scrubbing")
|
getResourceId(DIMEN, "vertical_touch_offset_to_enter_fine_scrubbing")
|
||||||
videoQualityUnavailableAnnouncement = getResourceId(STRING, "video_quality_unavailable_announcement")
|
verticalTouchOffsetToStartFineScrubbing =
|
||||||
|
getResourceId(DIMEN, "vertical_touch_offset_to_start_fine_scrubbing")
|
||||||
|
videoQualityUnavailableAnnouncement =
|
||||||
|
getResourceId(STRING, "video_quality_unavailable_announcement")
|
||||||
videoZoomSnapIndicator = getResourceId(ID, "video_zoom_snap_indicator")
|
videoZoomSnapIndicator = getResourceId(ID, "video_zoom_snap_indicator")
|
||||||
voiceSearch = getResourceId(ID, "voice_search")
|
voiceSearch = getResourceId(ID, "voice_search")
|
||||||
youTubeControlsOverlaySubtitleButton = getResourceId(LAYOUT, "youtube_controls_overlay_subtitle_button")
|
youTubeControlsOverlaySubtitleButton =
|
||||||
|
getResourceId(LAYOUT, "youtube_controls_overlay_subtitle_button")
|
||||||
youTubeLogo = getResourceId(ID, "youtube_logo")
|
youTubeLogo = getResourceId(ID, "youtube_logo")
|
||||||
ytCallToAction = getResourceId(ATTR, "ytCallToAction")
|
ytCallToAction = getResourceId(ATTR, "ytCallToAction")
|
||||||
ytFillBell = getResourceId(DRAWABLE, "yt_fill_bell_black_24")
|
ytFillBell = getResourceId(DRAWABLE, "yt_fill_bell_black_24")
|
||||||
ytOutlineLibrary = getResourceId(DRAWABLE, "yt_outline_library_black_24")
|
ytOutlineLibrary = getResourceId(DRAWABLE, "yt_outline_library_black_24")
|
||||||
ytOutlineMoonZ = getResourceId(DRAWABLE, "yt_outline_moon_z_vd_theme_24")
|
ytOutlineMoonZ = getResourceId(DRAWABLE, "yt_outline_moon_z_vd_theme_24")
|
||||||
ytOutlinePictureInPictureWhite = getResourceId(DRAWABLE, "yt_outline_picture_in_picture_white_24")
|
ytOutlinePictureInPictureWhite =
|
||||||
|
getResourceId(DRAWABLE, "yt_outline_picture_in_picture_white_24")
|
||||||
ytOutlineVideoCamera = getResourceId(DRAWABLE, "yt_outline_video_camera_black_24")
|
ytOutlineVideoCamera = getResourceId(DRAWABLE, "yt_outline_video_camera_black_24")
|
||||||
ytOutlineXWhite = getResourceId(DRAWABLE, "yt_outline_x_white_24")
|
ytOutlineXWhite = getResourceId(DRAWABLE, "yt_outline_x_white_24")
|
||||||
ytPremiumWordMarkHeader = getResourceId(ATTR, "ytPremiumWordmarkHeader")
|
ytPremiumWordMarkHeader = getResourceId(ATTR, "ytPremiumWordmarkHeader")
|
||||||
|
@ -162,13 +162,15 @@ val videoPlaybackPatch = bytecodePatch(
|
|||||||
loadVideoParamsFingerprint.matchOrThrow(loadVideoParamsParentFingerprint).let {
|
loadVideoParamsFingerprint.matchOrThrow(loadVideoParamsParentFingerprint).let {
|
||||||
it.method.apply {
|
it.method.apply {
|
||||||
val targetIndex = it.patternMatch!!.endIndex
|
val targetIndex = it.patternMatch!!.endIndex
|
||||||
val targetReference = getInstruction<ReferenceInstruction>(targetIndex).reference as MethodReference
|
val targetReference =
|
||||||
|
getInstruction<ReferenceInstruction>(targetIndex).reference as MethodReference
|
||||||
|
|
||||||
findMethodOrThrow(definingClass) {
|
findMethodOrThrow(definingClass) {
|
||||||
name == targetReference.name
|
name == targetReference.name
|
||||||
}.apply {
|
}.apply {
|
||||||
val insertIndex = implementation!!.instructions.lastIndex
|
val insertIndex = implementation!!.instructions.lastIndex
|
||||||
val insertRegister = getInstruction<OneRegisterInstruction>(insertIndex).registerA
|
val insertRegister =
|
||||||
|
getInstruction<OneRegisterInstruction>(insertIndex).registerA
|
||||||
|
|
||||||
addInstructions(
|
addInstructions(
|
||||||
insertIndex, """
|
insertIndex, """
|
||||||
|
@ -26,7 +26,8 @@ val playbackStartDescriptorPatch = bytecodePatch(
|
|||||||
&& reference.returnType == "Ljava/lang/String;"
|
&& reference.returnType == "Ljava/lang/String;"
|
||||||
}
|
}
|
||||||
|
|
||||||
playbackStartVideoIdReference = getInstruction<ReferenceInstruction>(stringMethodIndex).reference
|
playbackStartVideoIdReference =
|
||||||
|
getInstruction<ReferenceInstruction>(stringMethodIndex).reference
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -39,7 +39,8 @@ val playerResponseMethodHookPatch = bytecodePatch(
|
|||||||
playerResponseMethod.apply {
|
playerResponseMethod.apply {
|
||||||
val setIndex = parameterTypes.indexOfFirst { it == "Ljava/util/Set;" }
|
val setIndex = parameterTypes.indexOfFirst { it == "Ljava/util/Set;" }
|
||||||
val parameterSize = parameterTypes.size
|
val parameterSize = parameterTypes.size
|
||||||
val relativeIndex = parameterTypes.subList(setIndex, parameterSize - 1).indexOfFirst { it == "Z" }
|
val relativeIndex =
|
||||||
|
parameterTypes.subList(setIndex, parameterSize - 1).indexOfFirst { it == "Z" }
|
||||||
|
|
||||||
// YouTube 18.29 ~ 19.22 : p11
|
// YouTube 18.29 ~ 19.22 : p11
|
||||||
// YouTube 19.23 ~ 20.09 : p12
|
// YouTube 19.23 ~ 20.09 : p12
|
||||||
|
@ -16,7 +16,7 @@ internal object FilesCompat {
|
|||||||
// Check for the existence of java.nio.file.Files class
|
// Check for the existence of java.nio.file.Files class
|
||||||
Class.forName("java.nio.file.Files")
|
Class.forName("java.nio.file.Files")
|
||||||
false
|
false
|
||||||
} catch (_ : ClassNotFoundException) {
|
} catch (_: ClassNotFoundException) {
|
||||||
// Under Android 8.0
|
// Under Android 8.0
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user