mirror of
https://github.com/inotia00/revanced-patches.git
synced 2025-04-30 06:34:37 +02:00
feat(YouTube): Add Hide accessibility controls dialog
patch
This commit is contained in:
parent
e72ff471ae
commit
1c2e85b7eb
@ -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 == "<init>" }
|
||||||
|
.apply {
|
||||||
|
val lifecycleObserverIndex = indexOfFirstInstructionReversedOrThrow(Opcode.NEW_INSTANCE)
|
||||||
|
val lifecycleObserverClass = getInstruction<ReferenceInstruction>(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)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -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;"
|
||||||
|
}
|
||||||
|
)
|
@ -113,6 +113,10 @@ internal enum class PatchList(
|
|||||||
"GmsCore support",
|
"GmsCore support",
|
||||||
"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services."
|
"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(
|
||||||
"Hide Shorts dimming",
|
"Hide Shorts dimming",
|
||||||
"Removes, at compile time, the dimming effect at the top and bottom of Shorts videos."
|
"Removes, at compile time, the dimming effect at the top and bottom of Shorts videos."
|
||||||
|
@ -980,6 +980,7 @@
|
|||||||
<Preference android:title="Custom double tap length" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
|
<Preference android:title="Custom double tap length" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
|
||||||
<Preference android:title="Custom Shorts action buttons" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
|
<Preference android:title="Custom Shorts action buttons" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
|
||||||
<Preference android:title="GmsCore support" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
|
<Preference android:title="GmsCore support" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
|
||||||
|
<Preference android:title="Hide accessibility controls dialog" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
|
||||||
<Preference android:title="Hide Shorts dimming" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
|
<Preference android:title="Hide Shorts dimming" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
|
||||||
<Preference android:title="Hide shortcuts" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
|
<Preference android:title="Hide shortcuts" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
|
||||||
<Preference android:title="Icon" android:summary="@string/revanced_icon_default" android:selectable="false"/>
|
<Preference android:title="Icon" android:summary="@string/revanced_icon_default" android:selectable="false"/>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user