From 1c06f2eee45cca9b1bfcd003b32970f371f0cdb4 Mon Sep 17 00:00:00 2001 From: inotia00 <108592928+inotia00@users.noreply.github.com> Date: Sat, 21 Dec 2024 13:38:12 +0900 Subject: [PATCH] feat(YouTube - Swipe controls): Change the setting name `Enable watch panel gestures` to `Disable watch panel gestures`, and change the setting name `Enable swipe to change video` to `Disable swipe to change video` --- .../patches/swipe/SwipeControlsPatch.java | 8 +- .../extension/youtube/settings/Settings.java | 4 +- .../youtube/swipe/controls/Fingerprints.kt | 16 +++- .../swipe/controls/SwipeControlsPatch.kt | 78 ++++++++++++++----- .../utils/playservice/VersionCheckPatch.kt | 6 ++ .../utils/resourceid/SharedResourceIdPatch.kt | 6 ++ .../youtube/settings/host/values/strings.xml | 12 +-- .../youtube/settings/xml/revanced_prefs.xml | 8 +- 8 files changed, 101 insertions(+), 37 deletions(-) diff --git a/extensions/shared/src/main/java/app/revanced/extension/youtube/patches/swipe/SwipeControlsPatch.java b/extensions/shared/src/main/java/app/revanced/extension/youtube/patches/swipe/SwipeControlsPatch.java index 24ee3f4a3..01b302675 100644 --- a/extensions/shared/src/main/java/app/revanced/extension/youtube/patches/swipe/SwipeControlsPatch.java +++ b/extensions/shared/src/main/java/app/revanced/extension/youtube/patches/swipe/SwipeControlsPatch.java @@ -20,15 +20,15 @@ public class SwipeControlsPatch { /** * Injection point. */ - public static boolean enableSwipeToSwitchVideo() { - return Settings.ENABLE_SWIPE_TO_SWITCH_VIDEO.get(); + public static boolean disableSwipeToSwitchVideo() { + return !Settings.DISABLE_SWIPE_TO_SWITCH_VIDEO.get(); } /** * Injection point. */ - public static boolean enableWatchPanelGestures() { - return Settings.ENABLE_WATCH_PANEL_GESTURES.get(); + public static boolean disableWatchPanelGestures() { + return !Settings.DISABLE_WATCH_PANEL_GESTURES.get(); } /** diff --git a/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/Settings.java b/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/Settings.java index 3855c6676..f8ec174c3 100644 --- a/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/Settings.java +++ b/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/Settings.java @@ -514,8 +514,8 @@ public class Settings extends BaseSettings { */ @Deprecated // Patch is obsolete and no longer works with 19.09+ public static final BooleanSetting DISABLE_HDR_AUTO_BRIGHTNESS = new BooleanSetting("revanced_disable_hdr_auto_brightness", TRUE, true, parent(ENABLE_SWIPE_BRIGHTNESS)); - public static final BooleanSetting ENABLE_SWIPE_TO_SWITCH_VIDEO = new BooleanSetting("revanced_enable_swipe_to_switch_video", FALSE, true); - public static final BooleanSetting ENABLE_WATCH_PANEL_GESTURES = new BooleanSetting("revanced_enable_watch_panel_gestures", FALSE, true); + public static final BooleanSetting DISABLE_SWIPE_TO_SWITCH_VIDEO = new BooleanSetting("revanced_disable_swipe_to_switch_video", FALSE, true); + public static final BooleanSetting DISABLE_WATCH_PANEL_GESTURES = new BooleanSetting("revanced_disable_watch_panel_gestures", FALSE, true); public static final BooleanSetting SWIPE_BRIGHTNESS_AUTO = new BooleanSetting("revanced_swipe_brightness_auto", TRUE, false, false); public static final FloatSetting SWIPE_BRIGHTNESS_VALUE = new FloatSetting("revanced_swipe_brightness_value", -1.0f, false, false); diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/Fingerprints.kt index 4c5555a51..1447cc97c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/Fingerprints.kt @@ -1,6 +1,7 @@ package app.revanced.patches.youtube.swipe.controls import app.revanced.patches.youtube.utils.extension.Constants.EXTENSION_PATH +import app.revanced.patches.youtube.utils.resourceid.autoNavScrollCancelPadding import app.revanced.patches.youtube.utils.resourceid.fullScreenEngagementOverlay import app.revanced.util.fingerprint.legacyFingerprint import app.revanced.util.or @@ -27,20 +28,29 @@ internal val swipeControlsHostActivityFingerprint = legacyFingerprint( } ) +internal const val SWIPE_TO_SWITCH_VIDEO_FEATURE_FLAG = 45631116L + /** * This fingerprint is compatible with YouTube v19.19.39+ */ internal val swipeToSwitchVideoFingerprint = legacyFingerprint( name = "swipeToSwitchVideoFingerprint", returnType = "V", - literals = listOf(45631116L), + literals = listOf(SWIPE_TO_SWITCH_VIDEO_FEATURE_FLAG), ) +internal const val WATCH_PANEL_GESTURES_FEATURE_FLAG = 45372793L + /** - * This fingerprint is compatible with YouTube v18.29.38+ + * This fingerprint is compatible with YouTube v18.29.38 ~ v19.34.42 */ internal val watchPanelGesturesFingerprint = legacyFingerprint( name = "watchPanelGesturesFingerprint", returnType = "V", - literals = listOf(45372793L), + literals = listOf(WATCH_PANEL_GESTURES_FEATURE_FLAG), +) + +internal val watchPanelGesturesAlternativeFingerprint = legacyFingerprint( + name = "watchPanelGesturesAlternativeFingerprint", + literals = listOf(autoNavScrollCancelPadding), ) \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/SwipeControlsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/SwipeControlsPatch.kt index ed84af9ec..2d1a3ca0b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/SwipeControlsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/SwipeControlsPatch.kt @@ -3,6 +3,8 @@ package app.revanced.patches.youtube.swipe.controls import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction +import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patcher.util.smali.ExternalLabel @@ -13,6 +15,11 @@ import app.revanced.patches.youtube.utils.lockmodestate.lockModeStateHookPatch import app.revanced.patches.youtube.utils.mainactivity.mainActivityResolvePatch import app.revanced.patches.youtube.utils.patch.PatchList.SWIPE_CONTROLS import app.revanced.patches.youtube.utils.playertype.playerTypeHookPatch +import app.revanced.patches.youtube.utils.playservice.is_19_09_or_greater +import app.revanced.patches.youtube.utils.playservice.is_19_23_or_greater +import app.revanced.patches.youtube.utils.playservice.is_19_36_or_greater +import app.revanced.patches.youtube.utils.playservice.versionCheckPatch +import app.revanced.patches.youtube.utils.resourceid.autoNavScrollCancelPadding import app.revanced.patches.youtube.utils.resourceid.fullScreenEngagementOverlay import app.revanced.patches.youtube.utils.resourceid.sharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.ResourceUtils.addPreference @@ -23,12 +30,18 @@ import app.revanced.util.copyResources import app.revanced.util.fingerprint.injectLiteralInstructionBooleanCall import app.revanced.util.fingerprint.methodOrThrow import app.revanced.util.fingerprint.mutableClassOrThrow -import app.revanced.util.fingerprint.resolvable +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.indexOfFirstLiteralInstruction import app.revanced.util.indexOfFirstLiteralInstructionOrThrow import app.revanced.util.transformMethods import app.revanced.util.traverseClassHierarchy import com.android.tools.smali.dexlib2.AccessFlags +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 +import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction +import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.immutable.ImmutableMethod private const val EXTENSION_SWIPE_CONTROLS_PATCH_CLASS_DESCRIPTOR = @@ -47,6 +60,7 @@ val swipeControlsPatch = bytecodePatch( playerTypeHookPatch, sharedResourceIdPatch, settingsPatch, + versionCheckPatch, ) execute { @@ -91,14 +105,15 @@ val swipeControlsPatch = bytecodePatch( // endregion var settingArray = arrayOf( - "PREFERENCE_SCREEN: SWIPE_CONTROLS" + "PREFERENCE_SCREEN: SWIPE_CONTROLS", + "SETTINGS: DISABLE_WATCH_PANEL_GESTURES" ) // region patch for disable HDR auto brightness // Since it does not support all versions, // add settings only if the patch is successful. - if (hdrBrightnessFingerprint.resolvable()) { + if (!is_19_09_or_greater) { hdrBrightnessFingerprint.methodOrThrow().apply { addInstructionsWithLabels( 0, """ @@ -114,33 +129,60 @@ val swipeControlsPatch = bytecodePatch( // endregion - // region patch for enable swipe to switch video + // region patch for disable swipe to switch video - // Since it does not support all versions, - // add settings only if the patch is successful. - - if (swipeToSwitchVideoFingerprint.resolvable()) { + if (is_19_23_or_greater) { swipeToSwitchVideoFingerprint.injectLiteralInstructionBooleanCall( - 45631116L, - "$EXTENSION_SWIPE_CONTROLS_PATCH_CLASS_DESCRIPTOR->enableSwipeToSwitchVideo()Z" + SWIPE_TO_SWITCH_VIDEO_FEATURE_FLAG, + "$EXTENSION_SWIPE_CONTROLS_PATCH_CLASS_DESCRIPTOR->disableSwipeToSwitchVideo()Z" ) - settingArray += "SETTINGS: ENABLE_SWIPE_TO_SWITCH_VIDEO" + settingArray += "SETTINGS: DISABLE_SWIPE_TO_SWITCH_VIDEO" } // endregion - // region patch for enable watch panel gestures + // region patch for disable watch panel gestures - // Since it does not support all versions, - // add settings only if the patch is successful. - if (watchPanelGesturesFingerprint.resolvable()) { + if (!is_19_36_or_greater) { watchPanelGesturesFingerprint.injectLiteralInstructionBooleanCall( - 45372793L, - "$EXTENSION_SWIPE_CONTROLS_PATCH_CLASS_DESCRIPTOR->enableWatchPanelGestures()Z" + WATCH_PANEL_GESTURES_FEATURE_FLAG, + "$EXTENSION_SWIPE_CONTROLS_PATCH_CLASS_DESCRIPTOR->disableWatchPanelGestures()Z" ) + } else { + watchPanelGesturesAlternativeFingerprint.methodOrThrow().apply { + val literalIndex = indexOfFirstLiteralInstruction(autoNavScrollCancelPadding) + val middleIndex = indexOfFirstInstructionOrThrow(literalIndex) { + val reference = getReference() + opcode == Opcode.INVOKE_VIRTUAL && + reference?.returnType == "V" && + reference.parameterTypes.size == 0 + } + val targetIndex = indexOfFirstInstructionOrThrow(middleIndex + 1) { + val reference = getReference() + opcode == Opcode.INVOKE_VIRTUAL && + reference?.returnType == "V" && + reference.parameterTypes.size == 0 + } + if (getInstruction(targetIndex - 1).opcode != Opcode.IGET_OBJECT) { + throw PatchException("Previous Opcode pattern does not match: ${getInstruction(targetIndex - 1).opcode}") + } + if (getInstruction(targetIndex + 1).opcode != Opcode.IF_EQZ) { + throw PatchException("Next Opcode pattern does not match: ${getInstruction(targetIndex + 1).opcode}") + } + val fieldReference = getInstruction(targetIndex - 1).reference + val fieldInstruction = getInstruction(targetIndex - 1) - settingArray += "SETTINGS: ENABLE_WATCH_PANEL_GESTURES" + addInstructionsWithLabels( + targetIndex, """ + invoke-static {}, $EXTENSION_SWIPE_CONTROLS_PATCH_CLASS_DESCRIPTOR->disableWatchPanelGestures()Z + move-result v${fieldInstruction.registerA} + if-eqz v${fieldInstruction.registerA}, :disable + iget-object v${fieldInstruction.registerA}, v${fieldInstruction.registerB}, $fieldReference + """, ExternalLabel("disable", getInstruction(targetIndex + 1)) + ) + removeInstruction(targetIndex - 1) + } } // endregion diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/utils/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/utils/playservice/VersionCheckPatch.kt index 9ed174ff0..f7cdcea1f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/utils/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/utils/playservice/VersionCheckPatch.kt @@ -17,6 +17,10 @@ var is_18_49_or_greater = false private set var is_19_02_or_greater = false private set +var is_19_04_or_greater = false + private set +var is_19_09_or_greater = false + private set var is_19_15_or_greater = false private set var is_19_17_or_greater = false @@ -68,6 +72,8 @@ val versionCheckPatch = resourcePatch( is_18_42_or_greater = 234302000 <= playStoreServicesVersion is_18_49_or_greater = 235000000 <= playStoreServicesVersion is_19_02_or_greater = 240204000 < playStoreServicesVersion + is_19_04_or_greater = 240502000 <= playStoreServicesVersion + is_19_09_or_greater = 241002000 <= playStoreServicesVersion is_19_15_or_greater = 241602000 <= playStoreServicesVersion is_19_17_or_greater = 241802000 <= playStoreServicesVersion is_19_23_or_greater = 242402000 <= playStoreServicesVersion diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/utils/resourceid/SharedResourceIdPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/utils/resourceid/SharedResourceIdPatch.kt index 31bb20af6..959faaedb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/utils/resourceid/SharedResourceIdPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/utils/resourceid/SharedResourceIdPatch.kt @@ -28,6 +28,8 @@ var appRelatedEndScreenResults = -1L private set var autoNavPreviewStub = -1L private set +var autoNavScrollCancelPadding = -1L + private set var autoNavToggle = -1L private set var backgroundCategory = -1L @@ -264,6 +266,10 @@ internal val sharedResourceIdPatch = resourcePatch( ID, "autonav_preview_stub" ] + autoNavScrollCancelPadding = resourceMappings[ + DIMEN, + "autonav_scroll_cancel_padding" + ] autoNavToggle = resourceMappings[ ID, "autonav_toggle" diff --git a/patches/src/main/resources/youtube/settings/host/values/strings.xml b/patches/src/main/resources/youtube/settings/host/values/strings.xml index 16607117c..2a9d6a5b5 100644 --- a/patches/src/main/resources/youtube/settings/host/values/strings.xml +++ b/patches/src/main/resources/youtube/settings/host/values/strings.xml @@ -1478,12 +1478,12 @@ Limitations: Disable auto HDR brightness Auto HDR brightness is disabled. Auto HDR brightness is enabled. - Enable watch panel gestures - Entering fullscreen when swiping down below the video player is enabled. - Entering fullscreen when swiping down below the video player is disabled. - Enable swipe to change video - Swiping up / down will play the next / previous video. - Swiping up / down will not play the next / previous video. + Disable watch panel gestures + Entering fullscreen when swiping down below the video player is disabled. + Entering fullscreen when swiping down below the video player is enabled. + Disable swipe to change video + Swiping up / down will not play the next / previous video. + Swiping up / down will play the next / previous video. Auto 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 fca8e7024..472e600ce 100644 --- a/patches/src/main/resources/youtube/settings/xml/revanced_prefs.xml +++ b/patches/src/main/resources/youtube/settings/xml/revanced_prefs.xml @@ -667,11 +667,11 @@ - + - +