feat(YouTube): Add patch Disable resuming Miniplayer on startup https://github.com/inotia00/ReVanced_Extended/issues/469

This commit is contained in:
inotia00
2025-02-11 17:03:15 +09:00
parent 8e5ea0a8d8
commit ddbfc747b8
9 changed files with 107 additions and 4 deletions

View File

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

View File

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

View File

@ -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),
)

View File

@ -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<OneRegisterInstruction>(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
)
}
}

View File

@ -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."