mirror of
https://github.com/revanced/revanced-patches.git
synced 2025-12-07 09:53:55 +01:00
Compare commits
8 Commits
v5.9.0-dev
...
v5.9.1-dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
350ee02e3b | ||
|
|
df2d070a43 | ||
|
|
8167aaccc8 | ||
|
|
f4989ed0a5 | ||
|
|
8f5a0531bc | ||
|
|
622554de14 | ||
|
|
66e330ffe6 | ||
|
|
2afcd3d63d |
29
CHANGELOG.md
29
CHANGELOG.md
@@ -1,3 +1,32 @@
|
|||||||
|
## [5.9.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.9.1-dev.1...v5.9.1-dev.2) (2025-01-22)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **YouTube - Theme:** Fix 19.25 - 19.45 patch error ([5b47a5f](https://github.com/ReVanced/revanced-patches/commit/5b47a5f0f6299daaae209341064fd85f16ca18a6))
|
||||||
|
|
||||||
|
## [5.9.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.9.0...v5.9.1-dev.1) (2025-01-21)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **YouTube - Theme:** Replace custom seekbar gradient colors instead of disabling ([#4329](https://github.com/ReVanced/revanced-patches/issues/4329)) ([f03da98](https://github.com/ReVanced/revanced-patches/commit/f03da983051021e0c372557a5354d5d967409564))
|
||||||
|
|
||||||
|
# [5.9.0](https://github.com/ReVanced/revanced-patches/compare/v5.8.1...v5.9.0) (2025-01-20)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **YouTube - Spoof video streams:** Resolve playback issues after changing from cellular to wifi ([#4277](https://github.com/ReVanced/revanced-patches/issues/4277)) ([e93e1c8](https://github.com/ReVanced/revanced-patches/commit/e93e1c8ec3367e941034e9c4e3725ec1db429a60))
|
||||||
|
* **YouTube - Spoof video streams:** Update client user-agent ([#4304](https://github.com/ReVanced/revanced-patches/issues/4304)) ([7917871](https://github.com/ReVanced/revanced-patches/commit/7917871f510b6b805370ef98a0cf8a4e2df0e900))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **YouTube - Hide feed components:** Handle new type of surveys ([#4295](https://github.com/ReVanced/revanced-patches/issues/4295)) ([c770e03](https://github.com/ReVanced/revanced-patches/commit/c770e03f3801367cb531af860fbdfa43dca89af0))
|
||||||
|
* **YouTube - Playback speed:** Add option to change 2x tap and hold speed ([#4307](https://github.com/ReVanced/revanced-patches/issues/4307)) ([02fb26e](https://github.com/ReVanced/revanced-patches/commit/02fb26e9458fb8635d497e6e78f964055244d738))
|
||||||
|
* **YouTube - Settings:** Add option to use new Cairo settings menus ([#4305](https://github.com/ReVanced/revanced-patches/issues/4305)) ([7b8a2a2](https://github.com/ReVanced/revanced-patches/commit/7b8a2a2721ab5351f8c0251401aceddf0c5327df))
|
||||||
|
|
||||||
# [5.9.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.9.0-dev.3...v5.9.0-dev.4) (2025-01-20)
|
# [5.9.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.9.0-dev.3...v5.9.0-dev.4) (2025-01-20)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -25,20 +25,25 @@ public final class SeekbarColorPatch {
|
|||||||
private static final int ORIGINAL_SEEKBAR_COLOR = 0xFFFF0000;
|
private static final int ORIGINAL_SEEKBAR_COLOR = 0xFFFF0000;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default colors of the gradient seekbar.
|
* Feed default colors of the gradient seekbar.
|
||||||
*/
|
*/
|
||||||
private static final int[] ORIGINAL_SEEKBAR_GRADIENT_COLORS = { 0xFFFF0033, 0xFFFF2791 };
|
private static final int[] FEED_ORIGINAL_SEEKBAR_GRADIENT_COLORS = { 0xFFFF0033, 0xFFFF2791 };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default positions of the gradient seekbar.
|
* Feed default positions of the gradient seekbar.
|
||||||
*/
|
*/
|
||||||
private static final float[] ORIGINAL_SEEKBAR_GRADIENT_POSITIONS = { 0.8f, 1.0f };
|
private static final float[] FEED_ORIGINAL_SEEKBAR_GRADIENT_POSITIONS = { 0.8f, 1.0f };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default YouTube seekbar color brightness.
|
* Default YouTube seekbar color brightness.
|
||||||
*/
|
*/
|
||||||
private static final float ORIGINAL_SEEKBAR_COLOR_BRIGHTNESS;
|
private static final float ORIGINAL_SEEKBAR_COLOR_BRIGHTNESS;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empty seekbar gradient, if hide seekbar in feed is enabled.
|
||||||
|
*/
|
||||||
|
private static final int[] HIDDEN_SEEKBAR_GRADIENT_COLORS = { 0x00000000, 0x00000000 };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If {@link Settings#SEEKBAR_CUSTOM_COLOR} is enabled,
|
* If {@link Settings#SEEKBAR_CUSTOM_COLOR} is enabled,
|
||||||
* this is the color value of {@link Settings#SEEKBAR_CUSTOM_COLOR_VALUE}.
|
* this is the color value of {@link Settings#SEEKBAR_CUSTOM_COLOR_VALUE}.
|
||||||
@@ -51,6 +56,11 @@ public final class SeekbarColorPatch {
|
|||||||
*/
|
*/
|
||||||
private static final float[] customSeekbarColorHSV = new float[3];
|
private static final float[] customSeekbarColorHSV = new float[3];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom seekbar color, used for linear gradient replacements.
|
||||||
|
*/
|
||||||
|
private static final int[] customSeekbarColorInt = new int[2];
|
||||||
|
|
||||||
static {
|
static {
|
||||||
float[] hsv = new float[3];
|
float[] hsv = new float[3];
|
||||||
Color.colorToHSV(ORIGINAL_SEEKBAR_COLOR, hsv);
|
Color.colorToHSV(ORIGINAL_SEEKBAR_COLOR, hsv);
|
||||||
@@ -58,6 +68,8 @@ public final class SeekbarColorPatch {
|
|||||||
|
|
||||||
if (SEEKBAR_CUSTOM_COLOR_ENABLED) {
|
if (SEEKBAR_CUSTOM_COLOR_ENABLED) {
|
||||||
loadCustomSeekbarColor();
|
loadCustomSeekbarColor();
|
||||||
|
|
||||||
|
Arrays.fill(customSeekbarColorInt, seekbarColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,15 +88,6 @@ public final class SeekbarColorPatch {
|
|||||||
return seekbarColor;
|
return seekbarColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Injection point
|
|
||||||
*/
|
|
||||||
public static boolean playerSeekbarGradientEnabled(boolean original) {
|
|
||||||
if (SEEKBAR_CUSTOM_COLOR_ENABLED) return false;
|
|
||||||
|
|
||||||
return original;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Injection point
|
* Injection point
|
||||||
*/
|
*/
|
||||||
@@ -165,6 +168,36 @@ public final class SeekbarColorPatch {
|
|||||||
return colorValue;
|
return colorValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Injection point.
|
||||||
|
*/
|
||||||
|
public static int[] getLinearGradient(int[] original) {
|
||||||
|
if (Settings.HIDE_SEEKBAR_THUMBNAIL.get()) {
|
||||||
|
return HIDDEN_SEEKBAR_GRADIENT_COLORS;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SEEKBAR_CUSTOM_COLOR_ENABLED
|
||||||
|
? customSeekbarColorInt
|
||||||
|
: original;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String colorArrayToHex(int[] colors) {
|
||||||
|
final int length = colors.length;
|
||||||
|
StringBuilder builder = new StringBuilder(length * 10);
|
||||||
|
builder.append("[");
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
for (int color : colors) {
|
||||||
|
builder.append(String.format("#%X", color));
|
||||||
|
if (++i < length) {
|
||||||
|
builder.append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.append("]");
|
||||||
|
return builder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Injection point.
|
* Injection point.
|
||||||
*/
|
*/
|
||||||
@@ -174,15 +207,15 @@ public final class SeekbarColorPatch {
|
|||||||
if (SEEKBAR_CUSTOM_COLOR_ENABLED || hideSeekbar) {
|
if (SEEKBAR_CUSTOM_COLOR_ENABLED || hideSeekbar) {
|
||||||
// Most litho usage of linear gradients is hooked here,
|
// Most litho usage of linear gradients is hooked here,
|
||||||
// so must only change if the values are those for the seekbar.
|
// so must only change if the values are those for the seekbar.
|
||||||
if (Arrays.equals(ORIGINAL_SEEKBAR_GRADIENT_COLORS, colors)
|
if ((Arrays.equals(FEED_ORIGINAL_SEEKBAR_GRADIENT_COLORS, colors)
|
||||||
&& Arrays.equals(ORIGINAL_SEEKBAR_GRADIENT_POSITIONS, positions)) {
|
&& Arrays.equals(FEED_ORIGINAL_SEEKBAR_GRADIENT_POSITIONS, positions))) {
|
||||||
Arrays.fill(colors, hideSeekbar
|
Arrays.fill(colors, hideSeekbar
|
||||||
? 0x00000000
|
? 0x00000000
|
||||||
: seekbarColor);
|
: seekbarColor);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger.printDebug(() -> "Ignoring gradient colors: " + Arrays.toString(colors)
|
Logger.printDebug(() -> "Ignoring gradient colors: " + colorArrayToHex(colors)
|
||||||
+ " positions: " + Arrays.toString(positions));
|
+ " positions: " + Arrays.toString(positions));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
|
|||||||
org.gradle.parallel = true
|
org.gradle.parallel = true
|
||||||
android.useAndroidX = true
|
android.useAndroidX = true
|
||||||
kotlin.code.style = official
|
kotlin.code.style = official
|
||||||
version = 5.9.0-dev.4
|
version = 5.9.1-dev.2
|
||||||
|
|||||||
@@ -1365,6 +1365,7 @@ public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPat
|
|||||||
public static final fun is_19_43_or_greater ()Z
|
public static final fun is_19_43_or_greater ()Z
|
||||||
public static final fun is_19_46_or_greater ()Z
|
public static final fun is_19_46_or_greater ()Z
|
||||||
public static final fun is_19_47_or_greater ()Z
|
public static final fun is_19_47_or_greater ()Z
|
||||||
|
public static final fun is_19_49_or_greater ()Z
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatchKt {
|
public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatchKt {
|
||||||
|
|||||||
@@ -10,8 +10,7 @@ import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
|||||||
import app.revanced.patches.shared.misc.settings.preference.TextPreference
|
import app.revanced.patches.shared.misc.settings.preference.TextPreference
|
||||||
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
|
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
|
||||||
import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch
|
import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch
|
||||||
import app.revanced.patches.youtube.misc.playservice.is_19_23_or_greater
|
import app.revanced.patches.youtube.misc.playservice.is_19_43_or_greater
|
||||||
import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater
|
|
||||||
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
|
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
|
||||||
import app.revanced.patches.youtube.misc.settings.settingsPatch
|
import app.revanced.patches.youtube.misc.settings.settingsPatch
|
||||||
import app.revanced.patches.youtube.shared.mainActivityFingerprint
|
import app.revanced.patches.youtube.shared.mainActivityFingerprint
|
||||||
@@ -30,7 +29,7 @@ private val swipeControlsResourcePatch = resourcePatch {
|
|||||||
execute {
|
execute {
|
||||||
addResources("youtube", "interaction.swipecontrols.swipeControlsResourcePatch")
|
addResources("youtube", "interaction.swipecontrols.swipeControlsResourcePatch")
|
||||||
|
|
||||||
if (is_19_25_or_greater) {
|
if (is_19_43_or_greater) {
|
||||||
PreferenceScreen.SWIPE_CONTROLS.addPreferences(
|
PreferenceScreen.SWIPE_CONTROLS.addPreferences(
|
||||||
SwitchPreference("revanced_swipe_change_video")
|
SwitchPreference("revanced_swipe_change_video")
|
||||||
)
|
)
|
||||||
@@ -114,7 +113,7 @@ val swipeControlsPatch = bytecodePatch(
|
|||||||
|
|
||||||
// region patch to enable/disable swipe to change video.
|
// region patch to enable/disable swipe to change video.
|
||||||
|
|
||||||
if (is_19_23_or_greater) {
|
if (is_19_43_or_greater) {
|
||||||
swipeChangeVideoFingerprint.method.insertFeatureFlagBooleanOverride(
|
swipeChangeVideoFingerprint.method.insertFeatureFlagBooleanOverride(
|
||||||
SWIPE_CHANGE_VIDEO_FEATURE_FLAG,
|
SWIPE_CHANGE_VIDEO_FEATURE_FLAG,
|
||||||
"$EXTENSION_CLASS_DESCRIPTOR->allowSwipeChangeVideo(Z)Z"
|
"$EXTENSION_CLASS_DESCRIPTOR->allowSwipeChangeVideo(Z)Z"
|
||||||
|
|||||||
@@ -34,21 +34,55 @@ internal val shortsSeekbarColorFingerprint = fingerprint {
|
|||||||
literal { reelTimeBarPlayedColorId }
|
literal { reelTimeBarPlayedColorId }
|
||||||
}
|
}
|
||||||
|
|
||||||
internal const val PLAYER_SEEKBAR_GRADIENT_FEATURE_FLAG = 45617850L
|
|
||||||
|
|
||||||
internal val playerSeekbarGradientConfigFingerprint = fingerprint {
|
|
||||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
|
||||||
returns("Z")
|
|
||||||
parameters()
|
|
||||||
literal { PLAYER_SEEKBAR_GRADIENT_FEATURE_FLAG }
|
|
||||||
}
|
|
||||||
|
|
||||||
internal val lithoLinearGradientFingerprint = fingerprint {
|
internal val lithoLinearGradientFingerprint = fingerprint {
|
||||||
accessFlags(AccessFlags.STATIC)
|
accessFlags(AccessFlags.STATIC)
|
||||||
returns("Landroid/graphics/LinearGradient;")
|
returns("Landroid/graphics/LinearGradient;")
|
||||||
parameters("F", "F", "F", "F", "[I", "[F")
|
parameters("F", "F", "F", "F", "[I", "[F")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 19.49+
|
||||||
|
*/
|
||||||
|
internal val playerLinearGradientFingerprint = fingerprint {
|
||||||
|
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
|
||||||
|
parameters("I", "I", "I", "I", "Landroid/content/Context;", "I")
|
||||||
|
returns("Landroid/graphics/LinearGradient;")
|
||||||
|
opcodes(
|
||||||
|
Opcode.FILLED_NEW_ARRAY,
|
||||||
|
Opcode.MOVE_RESULT_OBJECT
|
||||||
|
)
|
||||||
|
literal { ytYoutubeMagentaColorId }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 19.46 - 19.47
|
||||||
|
*/
|
||||||
|
internal val playerLinearGradientLegacy1946Fingerprint = fingerprint {
|
||||||
|
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
||||||
|
parameters("I", "I", "I", "I")
|
||||||
|
returns("V")
|
||||||
|
opcodes(
|
||||||
|
Opcode.FILLED_NEW_ARRAY,
|
||||||
|
Opcode.MOVE_RESULT_OBJECT
|
||||||
|
)
|
||||||
|
custom { method, _ ->
|
||||||
|
method.name == "setBounds" && method.containsLiteralInstruction(ytYoutubeMagentaColorId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 19.25 - 19.45
|
||||||
|
*/
|
||||||
|
internal val playerLinearGradientLegacy1925Fingerprint = fingerprint {
|
||||||
|
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
|
||||||
|
parameters("Landroid/content/Context;")
|
||||||
|
opcodes(
|
||||||
|
Opcode.FILLED_NEW_ARRAY,
|
||||||
|
Opcode.MOVE_RESULT_OBJECT
|
||||||
|
)
|
||||||
|
literal { ytYoutubeMagentaColorId }
|
||||||
|
}
|
||||||
|
|
||||||
internal const val launchScreenLayoutTypeLotteFeatureFlag = 268507948L
|
internal const val launchScreenLayoutTypeLotteFeatureFlag = 268507948L
|
||||||
|
|
||||||
internal val launchScreenLayoutTypeFingerprint = fingerprint {
|
internal val launchScreenLayoutTypeFingerprint = fingerprint {
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import app.revanced.patches.youtube.layout.theme.lithoColorOverrideHook
|
|||||||
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
|
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
|
||||||
import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater
|
import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater
|
||||||
import app.revanced.patches.youtube.misc.playservice.is_19_46_or_greater
|
import app.revanced.patches.youtube.misc.playservice.is_19_46_or_greater
|
||||||
|
import app.revanced.patches.youtube.misc.playservice.is_19_49_or_greater
|
||||||
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
|
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
|
||||||
import app.revanced.patches.youtube.misc.settings.settingsPatch
|
import app.revanced.patches.youtube.misc.settings.settingsPatch
|
||||||
import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint
|
import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint
|
||||||
@@ -39,6 +40,8 @@ internal var inlineTimeBarColorizedBarPlayedColorDarkId = -1L
|
|||||||
private set
|
private set
|
||||||
internal var inlineTimeBarPlayedNotHighlightedColorId = -1L
|
internal var inlineTimeBarPlayedNotHighlightedColorId = -1L
|
||||||
private set
|
private set
|
||||||
|
internal var ytYoutubeMagentaColorId = -1L
|
||||||
|
private set
|
||||||
|
|
||||||
internal const val splashSeekbarColorAttributeName = "splash_custom_seekbar_color"
|
internal const val splashSeekbarColorAttributeName = "splash_custom_seekbar_color"
|
||||||
|
|
||||||
@@ -62,6 +65,10 @@ private val seekbarColorResourcePatch = resourcePatch {
|
|||||||
"color",
|
"color",
|
||||||
"inline_time_bar_played_not_highlighted_color",
|
"inline_time_bar_played_not_highlighted_color",
|
||||||
]
|
]
|
||||||
|
ytYoutubeMagentaColorId = resourceMappings[
|
||||||
|
"color",
|
||||||
|
"yt_youtube_magenta",
|
||||||
|
]
|
||||||
|
|
||||||
// Modify the resume playback drawable and replace the progress bar with a custom drawable.
|
// Modify the resume playback drawable and replace the progress bar with a custom drawable.
|
||||||
document("res/drawable/resume_playback_progressbar_drawable.xml").use { document ->
|
document("res/drawable/resume_playback_progressbar_drawable.xml").use { document ->
|
||||||
@@ -182,6 +189,7 @@ val seekbarColorPatch = bytecodePatch(
|
|||||||
sharedExtensionPatch,
|
sharedExtensionPatch,
|
||||||
lithoColorHookPatch,
|
lithoColorHookPatch,
|
||||||
seekbarColorResourcePatch,
|
seekbarColorResourcePatch,
|
||||||
|
versionCheckPatch
|
||||||
)
|
)
|
||||||
|
|
||||||
execute {
|
execute {
|
||||||
@@ -229,16 +237,34 @@ val seekbarColorPatch = bytecodePatch(
|
|||||||
|
|
||||||
// 19.25+ changes
|
// 19.25+ changes
|
||||||
|
|
||||||
playerSeekbarGradientConfigFingerprint.method.insertFeatureFlagBooleanOverride(
|
|
||||||
PLAYER_SEEKBAR_GRADIENT_FEATURE_FLAG,
|
|
||||||
"$EXTENSION_CLASS_DESCRIPTOR->playerSeekbarGradientEnabled(Z)Z"
|
|
||||||
)
|
|
||||||
|
|
||||||
lithoLinearGradientFingerprint.method.addInstruction(
|
lithoLinearGradientFingerprint.method.addInstruction(
|
||||||
0,
|
0,
|
||||||
"invoke-static/range { p4 .. p5 }, $EXTENSION_CLASS_DESCRIPTOR->setLinearGradient([I[F)V"
|
"invoke-static/range { p4 .. p5 }, $EXTENSION_CLASS_DESCRIPTOR->setLinearGradient([I[F)V"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
val playerFingerprint =
|
||||||
|
if (is_19_49_or_greater) {
|
||||||
|
playerLinearGradientFingerprint
|
||||||
|
} else if (is_19_46_or_greater) {
|
||||||
|
playerLinearGradientLegacy1946Fingerprint
|
||||||
|
} else {
|
||||||
|
playerLinearGradientLegacy1925Fingerprint
|
||||||
|
}
|
||||||
|
|
||||||
|
playerFingerprint.let {
|
||||||
|
it.method.apply {
|
||||||
|
val index = it.patternMatch!!.endIndex
|
||||||
|
val register = getInstruction<OneRegisterInstruction>(index).registerA
|
||||||
|
|
||||||
|
addInstructions(
|
||||||
|
index + 1,
|
||||||
|
"""
|
||||||
|
invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getLinearGradient([I)[I
|
||||||
|
move-result-object v$register
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// region apply seekbar custom color to splash screen animation.
|
// region apply seekbar custom color to splash screen animation.
|
||||||
|
|
||||||
|
|||||||
@@ -41,6 +41,8 @@ var is_19_46_or_greater = false
|
|||||||
private set
|
private set
|
||||||
var is_19_47_or_greater = false
|
var is_19_47_or_greater = false
|
||||||
private set
|
private set
|
||||||
|
var is_19_49_or_greater = false
|
||||||
|
private set
|
||||||
|
|
||||||
val versionCheckPatch = resourcePatch(
|
val versionCheckPatch = resourcePatch(
|
||||||
description = "Uses the Play Store service version to find the major/minor version of the YouTube target app.",
|
description = "Uses the Play Store service version to find the major/minor version of the YouTube target app.",
|
||||||
@@ -74,5 +76,6 @@ val versionCheckPatch = resourcePatch(
|
|||||||
is_19_43_or_greater = 244405000 <= playStoreServicesVersion
|
is_19_43_or_greater = 244405000 <= playStoreServicesVersion
|
||||||
is_19_46_or_greater = 244705000 <= playStoreServicesVersion
|
is_19_46_or_greater = 244705000 <= playStoreServicesVersion
|
||||||
is_19_47_or_greater = 244799000 <= playStoreServicesVersion
|
is_19_47_or_greater = 244799000 <= playStoreServicesVersion
|
||||||
|
is_19_49_or_greater = 245005000 <= playStoreServicesVersion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,31 +24,31 @@ class StringResource(
|
|||||||
if (value.startsWith('"') && value.endsWith('"')) {
|
if (value.startsWith('"') && value.endsWith('"')) {
|
||||||
// Raw strings allow unescaped single quote but not double quote.
|
// Raw strings allow unescaped single quote but not double quote.
|
||||||
if (!value.substring(1, value.length - 1).contains(Regex("(?<!\\\\)[\"]"))) {
|
if (!value.substring(1, value.length - 1).contains(Regex("(?<!\\\\)[\"]"))) {
|
||||||
return this;
|
return this
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (value.contains('\n')) {
|
if (value.contains('\n')) {
|
||||||
// Don't throw an exception, otherwise unnoticed mistakes
|
// Don't throw an exception, otherwise unnoticed mistakes
|
||||||
// in Crowdin can cause patching failures.
|
// in Crowdin can cause patching failures.
|
||||||
// Incorrectly escaped strings still work but do not display as intended.
|
// Incorrectly escaped strings still work but do not display as intended.
|
||||||
Logger.getLogger(StringResource.javaClass.name).severe(
|
Logger.getLogger(StringResource.javaClass.name).warning(
|
||||||
"String $name is not raw but contains encoded new line characters: $value")
|
"String $name is not raw but contains encoded new line characters: $value")
|
||||||
}
|
}
|
||||||
if (!value.contains(Regex("(?<!\\\\)['\"]"))) {
|
if (!value.contains(Regex("(?<!\\\\)['\"]"))) {
|
||||||
return this;
|
return this
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger.getLogger(StringResource.javaClass.name).severe(
|
Logger.getLogger(StringResource.javaClass.name).warning(
|
||||||
"String $name cannot contain unescaped quotes in value: $value")
|
"String $name cannot contain unescaped quotes in value: $value")
|
||||||
|
|
||||||
return this;
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
// if the string is un-formatted, explicitly add the formatted attribute
|
// if the string is un-formatted, explicitly add the formatted attribute
|
||||||
if (!formatted) setAttribute("formatted", "false")
|
if (!formatted) setAttribute("formatted", "false")
|
||||||
|
|
||||||
textContent = value.validateAndroidStringEscaping();
|
textContent = value.validateAndroidStringEscaping()
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ Second \"item\" text"</string>
|
|||||||
<string name="revanced_check_environment_failed_title">檢查失敗</string>
|
<string name="revanced_check_environment_failed_title">檢查失敗</string>
|
||||||
<string name="revanced_check_environment_dialog_open_official_source_button">開啟官方網站</string>
|
<string name="revanced_check_environment_dialog_open_official_source_button">開啟官方網站</string>
|
||||||
<string name="revanced_check_environment_dialog_ignore_button">忽略</string>
|
<string name="revanced_check_environment_dialog_ignore_button">忽略</string>
|
||||||
<string name="revanced_check_environment_failed_message"><h5>這個應用程式似乎並非由您修補。</h5><br>這個應用程式可能無法正常運作,<b>可能有害甚至存在危險。</b><br><br>這些檢查表明該應用程式是預先修補的或來自其他來源:<br><br><small>%1$s</small><br>強烈建議<b>解除安裝此應用程式並自行修補</b>,以確保您使用的是經過驗證且安全的應用程式。<p><br>如果忽略,此警告僅會顯示兩次。<2></string>
|
<string name="revanced_check_environment_failed_message"><h5>這個應用程式似乎並非由你修補。</h5><br>這個應用程式可能無法正常運作,<b>可能有害甚至存在危險。</b><br><br>這些檢查表明該應用程式是預先修補的或來自其他來源:<br><br><small>%1$s</small><br>強烈建議<b>解除安裝此應用程式並自行修補</b>,以確保你使用的是經過驗證且安全的應用程式。<p><br>如果忽略,此警告僅會顯示兩次。<2></string>
|
||||||
<string name="revanced_check_environment_not_same_patching_device">在其他裝置上修補</string>
|
<string name="revanced_check_environment_not_same_patching_device">在其他裝置上修補</string>
|
||||||
<string name="revanced_check_environment_manager_not_expected_installer">不是由 ReVanced Manager 安裝</string>
|
<string name="revanced_check_environment_manager_not_expected_installer">不是由 ReVanced Manager 安裝</string>
|
||||||
<string name="revanced_check_environment_not_near_patch_time">修補時間超過 10 分鐘</string>
|
<string name="revanced_check_environment_not_near_patch_time">修補時間超過 10 分鐘</string>
|
||||||
@@ -105,7 +105,7 @@ Second \"item\" text"</string>
|
|||||||
<!-- Settings about dialog. -->
|
<!-- Settings about dialog. -->
|
||||||
<string name="revanced_settings_about_links_body">您正在使用 ReVanced 修補版本 <i>%s</i></string>
|
<string name="revanced_settings_about_links_body">您正在使用 ReVanced 修補版本 <i>%s</i></string>
|
||||||
<string name="revanced_settings_about_links_dev_header">注意</string>
|
<string name="revanced_settings_about_links_dev_header">注意</string>
|
||||||
<string name="revanced_settings_about_links_dev_body">這個版本為預先發布版,您可能會遇到非預期的問題。</string>
|
<string name="revanced_settings_about_links_dev_body">這個版本為預先發布版,你可能會遇到非預期的問題。</string>
|
||||||
<string name="revanced_settings_about_links_header">官方連結</string>
|
<string name="revanced_settings_about_links_header">官方連結</string>
|
||||||
<!-- NOTE: the about strings above are duplicated in the TikTok about screen code,
|
<!-- NOTE: the about strings above are duplicated in the TikTok about screen code,
|
||||||
and changes made here must also be made there. -->
|
and changes made here must also be made there. -->
|
||||||
@@ -116,7 +116,7 @@ Second \"item\" text"</string>
|
|||||||
<string name="gms_core_dialog_title">需要採取行動</string>
|
<string name="gms_core_dialog_title">需要採取行動</string>
|
||||||
<string name="gms_core_dialog_not_whitelisted_not_allowed_in_background_message">"MicroG GmsCore 沒有權限在背景執行。
|
<string name="gms_core_dialog_not_whitelisted_not_allowed_in_background_message">"MicroG GmsCore 沒有權限在背景執行。
|
||||||
|
|
||||||
請按照您手機的「不要關閉我的應用程式」指南,並將說明套用於您的 MicroG 安裝。
|
請按照你手機的「不要關閉我的應用程式」指南,並將說明套用於你的 MicroG 安裝。
|
||||||
|
|
||||||
這項設定是應用程式運作的必要條件。"</string>
|
這項設定是應用程式運作的必要條件。"</string>
|
||||||
<string name="gms_core_dialog_open_website_text">開啟網站</string>
|
<string name="gms_core_dialog_open_website_text">開啟網站</string>
|
||||||
@@ -167,7 +167,7 @@ Second \"item\" text"</string>
|
|||||||
<string name="revanced_debug_toast_on_error_summary_off">若發生錯誤,不顯示提示</string>
|
<string name="revanced_debug_toast_on_error_summary_off">若發生錯誤,不顯示提示</string>
|
||||||
<string name="revanced_debug_toast_on_error_user_dialog_message">"關閉錯誤訊息提示會隱藏所有 ReVanced 的錯誤通知。
|
<string name="revanced_debug_toast_on_error_user_dialog_message">"關閉錯誤訊息提示會隱藏所有 ReVanced 的錯誤通知。
|
||||||
|
|
||||||
您將不會收到任何非預期事件的通知。"</string>
|
你將不會收到任何非預期事件的通知。"</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="layout.hide.general.hideLayoutComponentsPatch">
|
<patch id="layout.hide.general.hideLayoutComponentsPatch">
|
||||||
<string name="revanced_disable_like_subscribe_glow_title">停用「喜歡」和「訂閱」按鈕的發光效果</string>
|
<string name="revanced_disable_like_subscribe_glow_title">停用「喜歡」和「訂閱」按鈕的發光效果</string>
|
||||||
@@ -342,7 +342,7 @@ Second \"item\" text"</string>
|
|||||||
<string name="revanced_hide_doodles_summary_off">已顯示位於搜尋欄的 Doodles </string>
|
<string name="revanced_hide_doodles_summary_off">已顯示位於搜尋欄的 Doodles </string>
|
||||||
<string name="revanced_hide_doodles_user_dialog_message">"YouTube Doodles 每年會顯示幾天。
|
<string name="revanced_hide_doodles_user_dialog_message">"YouTube Doodles 每年會顯示幾天。
|
||||||
|
|
||||||
如果塗鴉目前在您所在國家/地區顯示,而且此隱藏設定處於啟用狀態,搜尋列下方顯示的篩選列也會隱藏。"</string>
|
如果塗鴉目前在你所在國家/地區顯示,而且此隱藏設定處於啟用狀態,搜尋列下方顯示的篩選列也會隱藏。"</string>
|
||||||
<string name="revanced_custom_filter_screen_title">自訂篩選器</string>
|
<string name="revanced_custom_filter_screen_title">自訂篩選器</string>
|
||||||
<string name="revanced_custom_filter_screen_summary">使用自訂篩選器隱藏元件</string>
|
<string name="revanced_custom_filter_screen_summary">使用自訂篩選器隱藏元件</string>
|
||||||
<string name="revanced_custom_filter_title">啟用自訂篩選器</string>
|
<string name="revanced_custom_filter_title">啟用自訂篩選器</string>
|
||||||
@@ -942,7 +942,7 @@ Second \"item\" text"</string>
|
|||||||
<string name="revanced_sb_settings_ie">匯入/匯出設定</string>
|
<string name="revanced_sb_settings_ie">匯入/匯出設定</string>
|
||||||
<string name="revanced_sb_settings_copy">複製</string>
|
<string name="revanced_sb_settings_copy">複製</string>
|
||||||
<string name="revanced_sb_settings_ie_sum">您的 SponsorBlock JSON 設定可以匯入/匯出到 ReVanced 和其他 SponsorBlock 平台</string>
|
<string name="revanced_sb_settings_ie_sum">您的 SponsorBlock JSON 設定可以匯入/匯出到 ReVanced 和其他 SponsorBlock 平台</string>
|
||||||
<string name="revanced_sb_settings_ie_sum_warning">您的 SponsorBlock JSON 設定可以匯入/匯出到 ReVanced 和其他 SponsorBlock 平台。這個檔案包含您的個人使用者 ID。請小心使用。</string>
|
<string name="revanced_sb_settings_ie_sum_warning">你的 SponsorBlock JSON 設定可以匯入/匯出到 ReVanced 和其他 SponsorBlock 平台。這個檔案包含你的個人使用者 ID。請小心使用。</string>
|
||||||
<string name="revanced_sb_settings_import_successful">已成功匯入設定</string>
|
<string name="revanced_sb_settings_import_successful">已成功匯入設定</string>
|
||||||
<string name="revanced_sb_settings_import_failed">無法匯入:%s</string>
|
<string name="revanced_sb_settings_import_failed">無法匯入:%s</string>
|
||||||
<string name="revanced_sb_settings_export_failed">無法匯出:%s</string>
|
<string name="revanced_sb_settings_export_failed">無法匯出:%s</string>
|
||||||
@@ -1061,7 +1061,7 @@ Second \"item\" text"</string>
|
|||||||
<string name="revanced_sb_stats_username_changed">使用者名稱變更成功</string>
|
<string name="revanced_sb_stats_username_changed">使用者名稱變更成功</string>
|
||||||
<string name="revanced_sb_stats_reputation">你的評價是 <b>%.2f</b></string>
|
<string name="revanced_sb_stats_reputation">你的評價是 <b>%.2f</b></string>
|
||||||
<string name="revanced_sb_stats_submissions">你已建立 <b>%s</b> 個片段</string>
|
<string name="revanced_sb_stats_submissions">你已建立 <b>%s</b> 個片段</string>
|
||||||
<string name="revanced_sb_stats_submissions_sum">輕觸這裡查看您的片段</string>
|
<string name="revanced_sb_stats_submissions_sum">輕觸這裡查看你的片段</string>
|
||||||
<string name="revanced_sb_stats_saved_zero">SponsorBlock 排行榜</string>
|
<string name="revanced_sb_stats_saved_zero">SponsorBlock 排行榜</string>
|
||||||
<string name="revanced_sb_stats_saved">您已為人們省下了觀看 <b>%s</b> 個片段的時間</string>
|
<string name="revanced_sb_stats_saved">您已為人們省下了觀看 <b>%s</b> 個片段的時間</string>
|
||||||
<string name="revanced_sb_stats_saved_sum_zero">輕觸這裡查看全球統計資料和最佳貢獻者</string>
|
<string name="revanced_sb_stats_saved_sum_zero">輕觸這裡查看全球統計資料和最佳貢獻者</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user