From 1c2e85b7eb9ad9cb66cb7105bae245e20d2238f6 Mon Sep 17 00:00:00 2001 From: inotia00 <108592928+inotia00@users.noreply.github.com> Date: Fri, 31 Jan 2025 20:40:46 +0900 Subject: [PATCH] feat(YouTube): Add `Hide accessibility controls dialog` patch --- .../misc/accessibility/AccessibilityPatch.kt | 48 ++++++++++++++++++ .../misc/accessibility/Fingerprints.kt | 49 +++++++++++++++++++ .../patches/youtube/utils/patch/PatchList.kt | 4 ++ .../youtube/settings/xml/revanced_prefs.xml | 1 + 4 files changed, 102 insertions(+) create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/accessibility/AccessibilityPatch.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/accessibility/Fingerprints.kt diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/accessibility/AccessibilityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/accessibility/AccessibilityPatch.kt new file mode 100644 index 000000000..cf0098362 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/accessibility/AccessibilityPatch.kt @@ -0,0 +1,48 @@ +package app.revanced.patches.youtube.misc.accessibility + +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.youtube.utils.compatibility.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.patch.PatchList.HIDE_ACCESSIBILITY_CONTROLS_DIALOG +import app.revanced.patches.youtube.utils.settings.ResourceUtils.addPreference +import app.revanced.patches.youtube.utils.settings.settingsPatch +import app.revanced.util.findMethodOrThrow +import app.revanced.util.fingerprint.mutableClassOrThrow +import app.revanced.util.indexOfFirstInstruction +import app.revanced.util.indexOfFirstInstructionReversedOrThrow +import app.revanced.util.or +import app.revanced.util.returnEarly +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction + +@Suppress("unused") +val accessibilityPatch = bytecodePatch( + HIDE_ACCESSIBILITY_CONTROLS_DIALOG.title, + HIDE_ACCESSIBILITY_CONTROLS_DIALOG.summary, +) { + compatibleWith(COMPATIBLE_PACKAGE) + + dependsOn(settingsPatch) + + execute { + + playerAccessibilitySettingsEduControllerParentFingerprint + .mutableClassOrThrow() + .methods + .first { method -> method.name == "" } + .apply { + val lifecycleObserverIndex = indexOfFirstInstructionReversedOrThrow(Opcode.NEW_INSTANCE) + val lifecycleObserverClass = getInstruction(lifecycleObserverIndex).reference.toString() + + findMethodOrThrow(lifecycleObserverClass) { + accessFlags == AccessFlags.PUBLIC or AccessFlags.FINAL && + parameterTypes.size == 1 && + indexOfFirstInstruction(Opcode.INVOKE_DIRECT) >= 0 + }.returnEarly() + } + + addPreference(HIDE_ACCESSIBILITY_CONTROLS_DIALOG) + + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/accessibility/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/accessibility/Fingerprints.kt new file mode 100644 index 000000000..ef931211d --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/accessibility/Fingerprints.kt @@ -0,0 +1,49 @@ +package app.revanced.patches.youtube.misc.accessibility + +import app.revanced.util.fingerprint.legacyFingerprint +import app.revanced.util.or +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction +import com.android.tools.smali.dexlib2.iface.reference.FieldReference + +/** + * The name of the class to find is 'Lcom/google/android/apps/youtube/app/player/overlay/accessibility/PlayerAccessibilitySettingsEduController$LifecycleObserver;'. + * It is one of the types of fields in the class. + * This class name has been obfuscated since YouTube 18.25.40. + * This class is always the same structure despite not a synthetic class. + * (Same field and method, checked in YouTube 17.34.36 ~ 20.02.41). + */ +internal val playerAccessibilitySettingsEduControllerParentFingerprint = legacyFingerprint( + name = "playerAccessibilitySettingsEduControllerParentFingerprint", + returnType = "V", + accessFlags = AccessFlags.STATIC or AccessFlags.CONSTRUCTOR, + parameters = emptyList(), + opcodes = listOf( + Opcode.SGET_OBJECT, + Opcode.CONST_WIDE_16, + Opcode.INVOKE_VIRTUAL, + Opcode.MOVE_RESULT_WIDE, + Opcode.SPUT_WIDE, + Opcode.RETURN_VOID, + ), + customFingerprint = custom@{ method, classDef -> + // The number of fields is always 12. + if (classDef.fields.count() != 12) { + return@custom false + } + // The number of methods is always 2 or 3. + if (classDef.methods.count() > 3) { + return@custom false + } + val implementation = method.implementation + ?: return@custom false + val instructions = implementation.instructions + val instructionCount = instructions.count() + if (instructionCount != 6) { + return@custom false + } + + ((instructions.elementAt(0) as? ReferenceInstruction)?.reference as? FieldReference)?.toString() == "Ljava/util/concurrent/TimeUnit;->DAYS:Ljava/util/concurrent/TimeUnit;" + } +) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/utils/patch/PatchList.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/utils/patch/PatchList.kt index 41a56de93..29d9cd0b0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/utils/patch/PatchList.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/utils/patch/PatchList.kt @@ -113,6 +113,10 @@ internal enum class PatchList( "GmsCore support", "Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services." ), + HIDE_ACCESSIBILITY_CONTROLS_DIALOG( + "Hide accessibility controls dialog", + "Removes, at compile time, accessibility controls dialog 'Turn on accessibility controls for the video player?'." + ), HIDE_SHORTS_DIMMING( "Hide Shorts dimming", "Removes, at compile time, the dimming effect at the top and bottom of Shorts videos." diff --git a/patches/src/main/resources/youtube/settings/xml/revanced_prefs.xml b/patches/src/main/resources/youtube/settings/xml/revanced_prefs.xml index 413e4a368..344349316 100644 --- a/patches/src/main/resources/youtube/settings/xml/revanced_prefs.xml +++ b/patches/src/main/resources/youtube/settings/xml/revanced_prefs.xml @@ -980,6 +980,7 @@ +