Skip to content

Commit ddbfc74

Browse files
committed
feat(YouTube): Add patch Disable resuming Miniplayer on startup inotia00/ReVanced_Extended#469
1 parent 8e5ea0a commit ddbfc74

File tree

9 files changed

+107
-4
lines changed

9 files changed

+107
-4
lines changed

extensions/shared/src/main/java/app/revanced/extension/youtube/patches/player/MiniplayerPatch.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ private static void setMiniPlayerSize() {
147147
private static final int MODERN_OVERLAY_SUBTITLE_TEXT
148148
= ResourceUtils.getIdIdentifier("modern_miniplayer_subtitle_text");
149149

150+
private static final boolean DISABLE_RESUMING_MINIPLAYER =
151+
Settings.DISABLE_RESUMING_MINIPLAYER.get();
152+
150153
private static final MiniplayerType CURRENT_TYPE = Settings.MINIPLAYER_TYPE.get();
151154

152155
/**
@@ -219,6 +222,13 @@ public boolean isAvailable() {
219222
}
220223
}
221224

225+
/**
226+
* Injection point.
227+
*/
228+
public static boolean disableResumingStartupMiniPlayer(boolean original) {
229+
return !DISABLE_RESUMING_MINIPLAYER && original;
230+
}
231+
222232
/**
223233
* Injection point.
224234
* <p>

extensions/shared/src/main/java/app/revanced/extension/youtube/settings/Settings.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,7 @@ public class Settings extends BaseSettings {
365365
public static final BooleanSetting DISABLE_HAPTIC_FEEDBACK_ZOOM = new BooleanSetting("revanced_disable_haptic_feedback_zoom", FALSE);
366366

367367
// PreferenceScreen: Player - Miniplayer
368+
public static final BooleanSetting DISABLE_RESUMING_MINIPLAYER = new BooleanSetting("revanced_disable_resuming_miniplayer", FALSE, true);
368369
public static final EnumSetting<MiniplayerType> MINIPLAYER_TYPE = new EnumSetting<>("revanced_miniplayer_type", MiniplayerType.DEFAULT, true);
369370
private static final Setting.Availability MINIPLAYER_ANY_MODERN = MINIPLAYER_TYPE.availability(MODERN_1, MODERN_2, MODERN_3, MODERN_4);
370371
public static final BooleanSetting MINIPLAYER_DOUBLE_TAP_ACTION = new BooleanSetting("revanced_miniplayer_double_tap_action", TRUE, true, MINIPLAYER_ANY_MODERN);

patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/Fingerprints.kt renamed to patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/general/Fingerprints.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
@file:Suppress("SpellCheckingInspection")
22

3-
package app.revanced.patches.youtube.player.miniplayer
3+
package app.revanced.patches.youtube.player.miniplayer.general
44

55
import app.revanced.patches.youtube.utils.resourceid.floatyBarTopMargin
66
import app.revanced.patches.youtube.utils.resourceid.miniplayerMaxSize

patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/MiniplayerPatch.kt renamed to patches/src/main/kotlin/app/revanced/patches/youtube/player/miniplayer/general/MiniplayerPatch.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package app.revanced.patches.youtube.player.miniplayer
1+
package app.revanced.patches.youtube.player.miniplayer.general
22

33
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
44
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
@file:Suppress("SpellCheckingInspection")
2+
3+
package app.revanced.patches.youtube.player.miniplayer.startup
4+
5+
import app.revanced.util.fingerprint.legacyFingerprint
6+
import app.revanced.util.or
7+
import com.android.tools.smali.dexlib2.AccessFlags
8+
import com.android.tools.smali.dexlib2.Opcode
9+
10+
/**
11+
* Tested on YouTube 18.25.40 ~ 20.05.44
12+
*
13+
* This fingerprint is not compatible with YouTube 18.19.36 or earlier
14+
*/
15+
internal val showMiniplayerCommandFingerprint = legacyFingerprint(
16+
name = "showMiniplayerCommandFingerprint",
17+
returnType = "V",
18+
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
19+
parameters = listOf("L", "Ljava/util/Map;"),
20+
// Opcode pattern looks very weak, but it's not really.
21+
opcodes = listOf(
22+
Opcode.IF_NEZ,
23+
Opcode.IF_EQZ,
24+
),
25+
literals = listOf(121253L, 164817L),
26+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package app.revanced.patches.youtube.player.miniplayer.startup
2+
3+
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
4+
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
5+
import app.revanced.patcher.patch.bytecodePatch
6+
import app.revanced.patches.youtube.utils.compatibility.Constants.COMPATIBLE_PACKAGE
7+
import app.revanced.patches.youtube.utils.extension.Constants.PLAYER_PATH
8+
import app.revanced.patches.youtube.utils.patch.PatchList.DISABLE_RESUMING_MINIPLAYER_ON_STARTUP
9+
import app.revanced.patches.youtube.utils.settings.ResourceUtils.addPreference
10+
import app.revanced.patches.youtube.utils.settings.settingsPatch
11+
import app.revanced.util.fingerprint.matchOrThrow
12+
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
13+
14+
private const val EXTENSION_CLASS_DESCRIPTOR =
15+
"$PLAYER_PATH/MiniplayerPatch;"
16+
17+
// YT uses "Miniplayer" without a space between 'mini' and 'player: https://support.google.com/youtube/answer/9162927.
18+
@Suppress("unused", "SpellCheckingInspection")
19+
val resumingMiniplayerOnStartupPatch = bytecodePatch(
20+
DISABLE_RESUMING_MINIPLAYER_ON_STARTUP.title,
21+
DISABLE_RESUMING_MINIPLAYER_ON_STARTUP.summary,
22+
) {
23+
compatibleWith(COMPATIBLE_PACKAGE)
24+
25+
dependsOn(settingsPatch)
26+
27+
execute {
28+
29+
showMiniplayerCommandFingerprint.matchOrThrow().let {
30+
it.method.apply {
31+
val insertIndex = it.patternMatch!!.endIndex
32+
val insertRegister =
33+
getInstruction<OneRegisterInstruction>(insertIndex).registerA
34+
35+
addInstructions(
36+
insertIndex, """
37+
invoke-static {v$insertRegister}, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupMiniPlayer(Z)Z
38+
move-result v$insertRegister
39+
"""
40+
)
41+
}
42+
}
43+
44+
45+
addPreference(
46+
arrayOf(
47+
"PREFERENCE_SCREEN: PLAYER",
48+
"SETTINGS: MINIPLAYER_COMPONENTS",
49+
"SETTINGS: DISABLE_RESUMING_MINIPLAYER"
50+
),
51+
DISABLE_RESUMING_MINIPLAYER_ON_STARTUP
52+
)
53+
54+
}
55+
}

patches/src/main/kotlin/app/revanced/patches/youtube/utils/patch/PatchList.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ internal enum class PatchList(
8181
"Disable haptic feedback",
8282
"Adds options to disable haptic feedback when swiping in the video player."
8383
),
84+
DISABLE_RESUMING_MINIPLAYER_ON_STARTUP(
85+
"Disable resuming Miniplayer on startup",
86+
"Adds an option to disable the Miniplayer 'Continue watching' from resuming on app startup."
87+
),
8488
DISABLE_RESUMING_SHORTS_ON_STARTUP(
8589
"Disable resuming Shorts on startup",
8690
"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched."

patches/src/main/resources/youtube/settings/host/values/strings.xml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1085,8 +1085,11 @@ Limitation: Video title disappears when clicked."</string>
10851085

10861086
<!-- PreferenceScreen: Player, PreferenceCategory: Player, PreferenceScreen: Miniplayer -->
10871087
<string name="revanced_preference_screen_miniplayer_title">Miniplayer</string>
1088-
<string name="revanced_preference_screen_miniplayer_summary">Change the style of the in-app minimized player.</string>
1088+
<string name="revanced_preference_screen_miniplayer_summary">Hide or change components related to Miniplayer.</string>
10891089

1090+
<string name="revanced_disable_resuming_miniplayer_title">Disable resuming Miniplayer</string>
1091+
<string name="revanced_disable_resuming_miniplayer_summary_on">&lt;b>Continue watching&lt;/b> will not resume on app startup.</string>
1092+
<string name="revanced_disable_resuming_miniplayer_summary_off">&lt;b>Continue watching&lt;/b> will resume on app startup.&lt;br>&lt;br>Info:&lt;br>• &lt;b>Continue watching&lt;/b> is the YouTube Premium feature.&lt;br>• This setting does not force &lt;b>Continue watching&lt;/b> to be enabled.</string>
10901093
<string name="revanced_miniplayer_type_title">Miniplayer type</string>
10911094
<string name="revanced_miniplayer_type_entry_0">Disabled</string>
10921095
<string name="revanced_miniplayer_type_entry_1">Default</string>
@@ -1102,7 +1105,7 @@ Limitation: Video title disappears when clicked."</string>
11021105
<string name="revanced_miniplayer_double_tap_action_title">Enable double-tap and pinch to resize</string>
11031106
<string name="revanced_miniplayer_double_tap_action_summary_on">"Double-tap action and pinch to resize is enabled.
11041107

1105-
• Double tap to increase miniplayer size.
1108+
• Double tap to increase Miniplayer size.
11061109
• Double tap again to restore original size."</string>
11071110
<string name="revanced_miniplayer_double_tap_action_summary_off">Double-tap action and pinch to resize is disabled.</string>
11081111
<string name="revanced_miniplayer_drag_and_drop_title">Enable drag and drop</string>

patches/src/main/resources/youtube/settings/xml/revanced_prefs.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,9 @@
418418
<!-- SETTINGS: MINIPLAYER_COMPONENTS
419419
<PreferenceScreen android:title="@string/revanced_preference_screen_miniplayer_title" android:key="revanced_preference_screen_miniplayer" android:summary="@string/revanced_preference_screen_miniplayer_summary">SETTINGS: MINIPLAYER_COMPONENTS -->
420420

421+
<!-- SETTINGS: DISABLE_RESUMING_MINIPLAYER
422+
<app.revanced.extension.shared.settings.preference.HtmlSwitchPreference android:title="@string/revanced_disable_resuming_miniplayer_title" android:key="revanced_disable_resuming_miniplayer" android:summaryOn="@string/revanced_disable_resuming_miniplayer_summary_on" android:summaryOff="@string/revanced_disable_resuming_miniplayer_summary_off" />DISABLE_RESUMING_MINIPLAYER -->
423+
421424
<!-- SETTINGS: MINIPLAYER_TYPE_19_14
422425
<ListPreference android:entries="@array/revanced_miniplayer_type_19_14_entries" android:title="@string/revanced_miniplayer_type_title" android:key="revanced_miniplayer_type" android:entryValues="@array/revanced_miniplayer_type_19_14_entry_values" />SETTINGS: MINIPLAYER_TYPE_19_14 -->
423426

@@ -923,6 +926,7 @@
923926
<Preference android:title="Change player flyout menu toggles" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
924927
<Preference android:title="Description components" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
925928
<Preference android:title="Disable haptic feedback" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
929+
<Preference android:title="Disable resuming Miniplayer on startup" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
926930
<Preference android:title="Fullscreen components" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
927931
<Preference android:title="Hide action buttons" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
928932
<Preference android:title="Hide comments components" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>

0 commit comments

Comments
 (0)