Skip to content

Commit a895a03

Browse files
committed
YouTube: Add Enable Debugging patch
1 parent 033cde4 commit a895a03

File tree

3 files changed

+127
-0
lines changed

3 files changed

+127
-0
lines changed

app/src/main/java/io/github/chsbuffer/revancedxposed/youtube/YoutubeHook.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import io.github.chsbuffer.revancedxposed.youtube.layout.hide.shorts.HideShortsC
2121
import io.github.chsbuffer.revancedxposed.youtube.layout.sponsorblock.SponsorBlock
2222
import io.github.chsbuffer.revancedxposed.youtube.layout.startupshortsreset.DisableResumingShortsOnStartup
2323
import io.github.chsbuffer.revancedxposed.youtube.misc.backgroundplayback.BackgroundPlayback
24+
import io.github.chsbuffer.revancedxposed.youtube.misc.debugging.EnableDebugging
2425
import io.github.chsbuffer.revancedxposed.youtube.misc.privacy.RemoveTrackingQueryParameter
2526
import io.github.chsbuffer.revancedxposed.youtube.misc.settings.SettingsHook
2627
import io.github.chsbuffer.revancedxposed.youtube.video.quality.VideoQuality
@@ -49,6 +50,7 @@ class YoutubeHook(
4950
::HideLayoutComponents,
5051
::HideButtons,
5152
::PlaybackSpeed,
53+
::EnableDebugging,
5254
// make sure settingsHook at end to build preferences
5355
::SettingsHook
5456
)
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package io.github.chsbuffer.revancedxposed.youtube.misc.debugging
2+
3+
import app.revanced.extension.youtube.patches.EnableDebuggingPatch
4+
import io.github.chsbuffer.revancedxposed.shared.misc.settings.preference.NonInteractivePreference
5+
import io.github.chsbuffer.revancedxposed.shared.misc.settings.preference.PreferenceScreenPreference
6+
import io.github.chsbuffer.revancedxposed.shared.misc.settings.preference.PreferenceScreenPreference.*
7+
import io.github.chsbuffer.revancedxposed.shared.misc.settings.preference.SwitchPreference
8+
import io.github.chsbuffer.revancedxposed.youtube.YoutubeHook
9+
import io.github.chsbuffer.revancedxposed.youtube.misc.settings.PreferenceScreen
10+
11+
fun YoutubeHook.EnableDebugging() {
12+
PreferenceScreen.MISC.addPreferences(
13+
PreferenceScreenPreference(
14+
key = "revanced_debug_screen",
15+
sorting = Sorting.UNSORTED,
16+
preferences = setOf(
17+
SwitchPreference("revanced_debug"),
18+
SwitchPreference("revanced_debug_protobuffer"),
19+
SwitchPreference("revanced_debug_stacktrace"),
20+
SwitchPreference("revanced_debug_toast_on_error"),
21+
NonInteractivePreference(
22+
"revanced_debug_export_logs_to_clipboard",
23+
tag = app.revanced.extension.youtube.settings.preference.ExportLogToClipboardPreference::class.java,
24+
selectable = true,
25+
),
26+
NonInteractivePreference(
27+
"revanced_debug_logs_clear_buffer",
28+
tag = app.revanced.extension.youtube.settings.preference.ClearLogBufferPreference::class.java,
29+
selectable = true,
30+
),
31+
),
32+
),
33+
)
34+
35+
// Hook the methods that look up if a feature flag is active.
36+
::experimentalBooleanFeatureFlagFingerprint.hookMethod {
37+
after {
38+
it.result = EnableDebuggingPatch.isBooleanFeatureFlagEnabled(
39+
it.result as Boolean,
40+
it.args[1] as Long
41+
)
42+
}
43+
}
44+
45+
::experimentalDoubleFeatureFlagFingerprint.hookMethod {
46+
after {
47+
it.result = EnableDebuggingPatch.isDoubleFeatureFlagEnabled(
48+
it.result as Double,
49+
it.args[0] as Long,
50+
it.args[1] as Double
51+
)
52+
}
53+
}
54+
55+
::experimentalLongFeatureFlagFingerprint.hookMethod {
56+
after {
57+
it.result = EnableDebuggingPatch.isLongFeatureFlagEnabled(
58+
it.result as Long,
59+
it.args[0] as Long,
60+
it.args[1] as Long
61+
)
62+
}
63+
}
64+
65+
::experimentalStringFeatureFlagFingerprint.hookMethod {
66+
after {
67+
it.result = EnableDebuggingPatch.isStringFeatureFlagEnabled(
68+
it.result as String,
69+
it.args[0] as Long,
70+
it.args[1] as String
71+
)
72+
}
73+
}
74+
75+
// There exists other experimental accessor methods for byte[]
76+
// and wrappers for obfuscated classes, but currently none of those are hooked.
77+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package io.github.chsbuffer.revancedxposed.youtube.misc.debugging
2+
3+
import io.github.chsbuffer.revancedxposed.AccessFlags
4+
import io.github.chsbuffer.revancedxposed.accessFlags
5+
import io.github.chsbuffer.revancedxposed.findMethodDirect
6+
import io.github.chsbuffer.revancedxposed.fingerprint
7+
import io.github.chsbuffer.revancedxposed.parameters
8+
import io.github.chsbuffer.revancedxposed.returns
9+
import io.github.chsbuffer.revancedxposed.strings
10+
11+
internal val experimentalFeatureFlagParentFingerprint = findMethodDirect {
12+
findMethod {
13+
matcher {
14+
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
15+
returns("L")
16+
parameters("L", "J", "[B")
17+
strings("Unable to parse proto typed experiment flag: ")
18+
}
19+
}.first()
20+
}
21+
22+
internal val experimentalBooleanFeatureFlagFingerprint = fingerprint {
23+
classMatcher { className(experimentalFeatureFlagParentFingerprint(dexkit).declaredClassName) }
24+
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
25+
returns("Z")
26+
parameters("L", "J", "Z")
27+
}
28+
29+
internal val experimentalDoubleFeatureFlagFingerprint = fingerprint {
30+
classMatcher { className(experimentalFeatureFlagParentFingerprint(dexkit).declaredClassName) }
31+
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
32+
returns("D")
33+
parameters("J", "D")
34+
}
35+
36+
internal val experimentalLongFeatureFlagFingerprint = fingerprint {
37+
classMatcher { className(experimentalFeatureFlagParentFingerprint(dexkit).declaredClassName) }
38+
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
39+
returns("J")
40+
parameters("J", "J")
41+
}
42+
43+
internal val experimentalStringFeatureFlagFingerprint = fingerprint {
44+
classMatcher { className(experimentalFeatureFlagParentFingerprint(dexkit).declaredClassName) }
45+
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
46+
returns("Ljava/lang/String;")
47+
parameters("J", "Ljava/lang/String;")
48+
}

0 commit comments

Comments
 (0)