diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/ChangeTogglePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/ChangeTogglePatch.kt new file mode 100644 index 000000000..05c9370db --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/ChangeTogglePatch.kt @@ -0,0 +1,117 @@ +package app.revanced.patches.youtube.flyoutpanel.player + +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.annotation.CompatiblePackage +import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.youtube.flyoutpanel.player.fingerprints.AdditionalSettingsConfigFingerprint +import app.revanced.patches.youtube.flyoutpanel.player.fingerprints.CinematicLightingFingerprint +import app.revanced.patches.youtube.flyoutpanel.player.fingerprints.PlaybackLoopInitFingerprint +import app.revanced.patches.youtube.flyoutpanel.player.fingerprints.PlaybackLoopOnClickListenerFingerprint +import app.revanced.patches.youtube.flyoutpanel.player.fingerprints.StableVolumeFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.FLYOUT_PANEL +import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.exception +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction + +@Patch( + name = "Change player flyout panel toggles", + description = "Adds an option to use text toggles instead of switch toggles within the additional settings menu.", + dependencies = [SettingsPatch::class], + compatiblePackages = [ + CompatiblePackage( + "com.google.android.youtube", + [ + "18.25.40", + "18.27.36", + "18.29.38", + "18.30.37", + "18.31.40", + "18.32.39", + "18.33.40", + "18.34.38", + "18.35.36", + "18.36.39", + "18.37.36", + "18.38.44", + "18.39.41", + "18.40.34", + "18.41.39", + "18.42.41", + "18.43.45", + "18.44.41", + "18.45.43" + ] + ) + ] +) +@Suppress("unused") +object ChangeTogglePatch : BytecodePatch( + setOf( + AdditionalSettingsConfigFingerprint, + CinematicLightingFingerprint, + PlaybackLoopOnClickListenerFingerprint, + StableVolumeFingerprint + ) +) { + override fun execute(context: BytecodeContext) { + val additionalSettingsConfigResult = AdditionalSettingsConfigFingerprint.result + ?: throw AdditionalSettingsConfigFingerprint.exception + + val additionalSettingsConfigMethod = additionalSettingsConfigResult.mutableMethod + val methodToCall = additionalSettingsConfigMethod.definingClass + "->" + additionalSettingsConfigMethod.name + "()Z" + + // Resolves fingerprints + val playbackLoopOnClickListenerResult = PlaybackLoopOnClickListenerFingerprint.result + ?: throw PlaybackLoopOnClickListenerFingerprint.exception + PlaybackLoopInitFingerprint.resolve(context, playbackLoopOnClickListenerResult.classDef) + + arrayOf( + CinematicLightingFingerprint, + PlaybackLoopInitFingerprint, + PlaybackLoopOnClickListenerFingerprint, + StableVolumeFingerprint + ).forEach { fingerprint -> + fingerprint.injectCall(methodToCall) + } + + /** + * Add settings + */ + SettingsPatch.addPreference( + arrayOf( + "PREFERENCE: FLYOUT_PANEL_SETTINGS", + "SETTINGS: PLAYER_FLYOUT_PANEL_ADDITIONAL_SETTINGS_HEADER", + "SETTINGS: CHANGE_PLAYER_FLYOUT_PANEL_TOGGLE" + ) + ) + + SettingsPatch.updatePatchStatus("Change player flyout panel toggles") + + } + + private fun MethodFingerprint.injectCall(descriptor: String) { + result?.let { + it.mutableMethod.apply { + val insertIndex = implementation!!.instructions.indexOfFirst { instruction -> + instruction.opcode == Opcode.INVOKE_VIRTUAL + && (instruction as ReferenceInstruction).reference.toString().endsWith(descriptor) + } + 2 + val insertRegister = + getInstruction(insertIndex - 1).registerA + + addInstructions( + insertIndex, """ + invoke-static {v$insertRegister}, $FLYOUT_PANEL->changeSwitchToggle(Z)Z + move-result v$insertRegister + """ + ) + } + } ?: throw exception + } +} diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/PlayerFlyoutPanelPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/PlayerFlyoutPanelPatch.kt index a2ec4f669..c6f32ac21 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/PlayerFlyoutPanelPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/PlayerFlyoutPanelPatch.kt @@ -84,6 +84,7 @@ object PlayerFlyoutPanelPatch : BytecodePatch( arrayOf( "PREFERENCE: FLYOUT_PANEL_SETTINGS", "SETTINGS: PLAYER_FLYOUT_PANEL_HEADER", + "SETTINGS: PLAYER_FLYOUT_PANEL_ADDITIONAL_SETTINGS_HEADER", "SETTINGS: HIDE_PLAYER_FLYOUT_PANEL" ) ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/AdditionalSettingsConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/AdditionalSettingsConfigFingerprint.kt new file mode 100644 index 000000000..d23fb2659 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/AdditionalSettingsConfigFingerprint.kt @@ -0,0 +1,8 @@ +package app.revanced.patches.youtube.flyoutpanel.player.fingerprints + +import app.revanced.util.fingerprint.LiteralValueFingerprint + +object AdditionalSettingsConfigFingerprint : LiteralValueFingerprint( + returnType = "Z", + literalSupplier = { 45412662 } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/CinematicLightingFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/CinematicLightingFingerprint.kt new file mode 100644 index 000000000..ca00234ec --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/CinematicLightingFingerprint.kt @@ -0,0 +1,12 @@ +package app.revanced.patches.youtube.flyoutpanel.player.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +object CinematicLightingFingerprint : MethodFingerprint( + returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + parameters = listOf("Ljava/lang/Object;"), + strings = listOf("menu_item_cinematic_lighting") +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/PlaybackLoopInitFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/PlaybackLoopInitFingerprint.kt new file mode 100644 index 000000000..d2752bf4b --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/PlaybackLoopInitFingerprint.kt @@ -0,0 +1,15 @@ +package app.revanced.patches.youtube.flyoutpanel.player.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +/** + * Resolves with the class found in [PlaybackLoopOnClickListenerFingerprint]. + */ +object PlaybackLoopInitFingerprint : MethodFingerprint( + returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + parameters = listOf("L"), + strings = listOf("menu_item_single_video_playback_loop") +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/PlaybackLoopOnClickListenerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/PlaybackLoopOnClickListenerFingerprint.kt new file mode 100644 index 000000000..765553098 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/PlaybackLoopOnClickListenerFingerprint.kt @@ -0,0 +1,12 @@ +package app.revanced.patches.youtube.flyoutpanel.player.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +object PlaybackLoopOnClickListenerFingerprint : MethodFingerprint( + returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + parameters = listOf("I", "Z"), + strings = listOf("menu_item_single_video_playback_loop") +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/StableVolumeFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/StableVolumeFingerprint.kt new file mode 100644 index 000000000..d44533c35 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/StableVolumeFingerprint.kt @@ -0,0 +1,12 @@ +package app.revanced.patches.youtube.flyoutpanel.player.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +object StableVolumeFingerprint : MethodFingerprint( + returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + parameters = listOf("Ljava/lang/Object;"), + strings = listOf("menu_item_stable_volume") +) \ No newline at end of file diff --git a/src/main/resources/youtube/settings/host/values/strings.xml b/src/main/resources/youtube/settings/host/values/strings.xml index 8ed87b8d0..422edc11c 100644 --- a/src/main/resources/youtube/settings/host/values/strings.xml +++ b/src/main/resources/youtube/settings/host/values/strings.xml @@ -55,6 +55,9 @@ Tap here to learn more about DeArrow." Ambient mode is disabled in battery saver mode. Ambient mode is enabled in battery saver mode. Bypass ambient mode restrictions + Switch toggles are used. + Text toggles are used. + Change toggle type Default Explore History diff --git a/src/main/resources/youtube/settings/xml/revanced_prefs.xml b/src/main/resources/youtube/settings/xml/revanced_prefs.xml index e45ac787d..ee31bb186 100644 --- a/src/main/resources/youtube/settings/xml/revanced_prefs.xml +++ b/src/main/resources/youtube/settings/xml/revanced_prefs.xml @@ -111,9 +111,15 @@ - + SETTINGS: HIDE_PLAYER_FLYOUT_PANEL --> - + + + + +