From ddbfc747b8ae3e3ac26fa0f7583a81a9da68243a Mon Sep 17 00:00:00 2001 From: inotia00 <108592928+inotia00@users.noreply.github.com> Date: Tue, 11 Feb 2025 17:03:15 +0900 Subject: [PATCH] feat(YouTube): Add patch `Disable resuming Miniplayer on startup` https://github.com/inotia00/ReVanced_Extended/issues/469 --- .../patches/player/MiniplayerPatch.java | 10 ++++ .../extension/youtube/settings/Settings.java | 1 + .../miniplayer/{ => general}/Fingerprints.kt | 2 +- .../{ => general}/MiniplayerPatch.kt | 2 +- .../player/miniplayer/startup/Fingerprints.kt | 26 +++++++++ .../ResumingMiniplayerOnStartupPatch.kt | 55 +++++++++++++++++++ .../patches/youtube/utils/patch/PatchList.kt | 4 ++ .../youtube/settings/host/values/strings.xml | 7 ++- .../youtube/settings/xml/revanced_prefs.xml | 4 ++ 9 files changed, 107 insertions(+), 4 deletions(-) rename patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/{ => general}/Fingerprints.kt (99%) rename patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/{ => general}/MiniplayerPatch.kt (99%) create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/startup/Fingerprints.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/startup/ResumingMiniplayerOnStartupPatch.kt diff --git a/extensions/shared/src/main/java/app/revanced/extension/youtube/patches/player/MiniplayerPatch.java b/extensions/shared/src/main/java/app/revanced/extension/youtube/patches/player/MiniplayerPatch.java index 2ff66e4dd..687c0263f 100644 --- a/extensions/shared/src/main/java/app/revanced/extension/youtube/patches/player/MiniplayerPatch.java +++ b/extensions/shared/src/main/java/app/revanced/extension/youtube/patches/player/MiniplayerPatch.java @@ -147,6 +147,9 @@ public final class MiniplayerPatch { private static final int MODERN_OVERLAY_SUBTITLE_TEXT = ResourceUtils.getIdIdentifier("modern_miniplayer_subtitle_text"); + private static final boolean DISABLE_RESUMING_MINIPLAYER = + Settings.DISABLE_RESUMING_MINIPLAYER.get(); + private static final MiniplayerType CURRENT_TYPE = Settings.MINIPLAYER_TYPE.get(); /** @@ -219,6 +222,13 @@ public final class MiniplayerPatch { } } + /** + * Injection point. + */ + public static boolean disableResumingStartupMiniPlayer(boolean original) { + return !DISABLE_RESUMING_MINIPLAYER && original; + } + /** * Injection point. *

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 c78302d20..afd77628f 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 @@ -365,6 +365,7 @@ public class Settings extends BaseSettings { public static final BooleanSetting DISABLE_HAPTIC_FEEDBACK_ZOOM = new BooleanSetting("revanced_disable_haptic_feedback_zoom", FALSE); // PreferenceScreen: Player - Miniplayer + public static final BooleanSetting DISABLE_RESUMING_MINIPLAYER = new BooleanSetting("revanced_disable_resuming_miniplayer", FALSE, true); public static final EnumSetting MINIPLAYER_TYPE = new EnumSetting<>("revanced_miniplayer_type", MiniplayerType.DEFAULT, true); private static final Setting.Availability MINIPLAYER_ANY_MODERN = MINIPLAYER_TYPE.availability(MODERN_1, MODERN_2, MODERN_3, MODERN_4); public static final BooleanSetting MINIPLAYER_DOUBLE_TAP_ACTION = new BooleanSetting("revanced_miniplayer_double_tap_action", TRUE, true, MINIPLAYER_ANY_MODERN); diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/general/Fingerprints.kt similarity index 99% rename from patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/Fingerprints.kt rename to patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/general/Fingerprints.kt index 4569531c8..df9835b17 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/general/Fingerprints.kt @@ -1,6 +1,6 @@ @file:Suppress("SpellCheckingInspection") -package app.revanced.patches.youtube.player.miniplayer +package app.revanced.patches.youtube.player.miniplayer.general import app.revanced.patches.youtube.utils.resourceid.floatyBarTopMargin import app.revanced.patches.youtube.utils.resourceid.miniplayerMaxSize diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/MiniplayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/general/MiniplayerPatch.kt similarity index 99% rename from patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/MiniplayerPatch.kt rename to patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/general/MiniplayerPatch.kt index 6caf9882c..bdd835f99 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/MiniplayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/general/MiniplayerPatch.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.player.miniplayer +package app.revanced.patches.youtube.player.miniplayer.general import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/startup/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/startup/Fingerprints.kt new file mode 100644 index 000000000..6a70fc522 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/startup/Fingerprints.kt @@ -0,0 +1,26 @@ +@file:Suppress("SpellCheckingInspection") + +package app.revanced.patches.youtube.player.miniplayer.startup + +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 + +/** + * Tested on YouTube 18.25.40 ~ 20.05.44 + * + * This fingerprint is not compatible with YouTube 18.19.36 or earlier + */ +internal val showMiniplayerCommandFingerprint = legacyFingerprint( + name = "showMiniplayerCommandFingerprint", + returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + parameters = listOf("L", "Ljava/util/Map;"), + // Opcode pattern looks very weak, but it's not really. + opcodes = listOf( + Opcode.IF_NEZ, + Opcode.IF_EQZ, + ), + literals = listOf(121253L, 164817L), +) \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/startup/ResumingMiniplayerOnStartupPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/startup/ResumingMiniplayerOnStartupPatch.kt new file mode 100644 index 000000000..0add88cf9 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/startup/ResumingMiniplayerOnStartupPatch.kt @@ -0,0 +1,55 @@ +package app.revanced.patches.youtube.player.miniplayer.startup + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +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.extension.Constants.PLAYER_PATH +import app.revanced.patches.youtube.utils.patch.PatchList.DISABLE_RESUMING_MINIPLAYER_ON_STARTUP +import app.revanced.patches.youtube.utils.settings.ResourceUtils.addPreference +import app.revanced.patches.youtube.utils.settings.settingsPatch +import app.revanced.util.fingerprint.matchOrThrow +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction + +private const val EXTENSION_CLASS_DESCRIPTOR = + "$PLAYER_PATH/MiniplayerPatch;" + +// YT uses "Miniplayer" without a space between 'mini' and 'player: https://support.google.com/youtube/answer/9162927. +@Suppress("unused", "SpellCheckingInspection") +val resumingMiniplayerOnStartupPatch = bytecodePatch( + DISABLE_RESUMING_MINIPLAYER_ON_STARTUP.title, + DISABLE_RESUMING_MINIPLAYER_ON_STARTUP.summary, +) { + compatibleWith(COMPATIBLE_PACKAGE) + + dependsOn(settingsPatch) + + execute { + + showMiniplayerCommandFingerprint.matchOrThrow().let { + it.method.apply { + val insertIndex = it.patternMatch!!.endIndex + val insertRegister = + getInstruction(insertIndex).registerA + + addInstructions( + insertIndex, """ + invoke-static {v$insertRegister}, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupMiniPlayer(Z)Z + move-result v$insertRegister + """ + ) + } + } + + + addPreference( + arrayOf( + "PREFERENCE_SCREEN: PLAYER", + "SETTINGS: MINIPLAYER_COMPONENTS", + "SETTINGS: DISABLE_RESUMING_MINIPLAYER" + ), + DISABLE_RESUMING_MINIPLAYER_ON_STARTUP + ) + + } +} 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 29d9cd0b0..d56f8fb1d 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 @@ -81,6 +81,10 @@ internal enum class PatchList( "Disable haptic feedback", "Adds options to disable haptic feedback when swiping in the video player." ), + DISABLE_RESUMING_MINIPLAYER_ON_STARTUP( + "Disable resuming Miniplayer on startup", + "Adds an option to disable the Miniplayer 'Continue watching' from resuming on app startup." + ), DISABLE_RESUMING_SHORTS_ON_STARTUP( "Disable resuming Shorts on startup", "Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched." 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 15a84fd39..8b04f6dea 100644 --- a/patches/src/main/resources/youtube/settings/host/values/strings.xml +++ b/patches/src/main/resources/youtube/settings/host/values/strings.xml @@ -1085,8 +1085,11 @@ Limitation: Video title disappears when clicked." Miniplayer - Change the style of the in-app minimized player. + Hide or change components related to Miniplayer. + Disable resuming Miniplayer + <b>Continue watching</b> will not resume on app startup. + <b>Continue watching</b> will resume on app startup.<br><br>Info:<br>• <b>Continue watching</b> is the YouTube Premium feature.<br>• This setting does not force <b>Continue watching</b> to be enabled. Miniplayer type Disabled Default @@ -1102,7 +1105,7 @@ Limitation: Video title disappears when clicked." Enable double-tap and pinch to resize "Double-tap action and pinch to resize is enabled. -• Double tap to increase miniplayer size. +• Double tap to increase Miniplayer size. • Double tap again to restore original size." Double-tap action and pinch to resize is disabled. Enable drag and drop 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 0fe309bd4..c73dcf55a 100644 --- a/patches/src/main/resources/youtube/settings/xml/revanced_prefs.xml +++ b/patches/src/main/resources/youtube/settings/xml/revanced_prefs.xml @@ -418,6 +418,9 @@ + + @@ -923,6 +926,7 @@ +