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 @@
+