fix(YouTube/Hide feed components): Hide Latest videos button setting does not support tablets (#89)

* fix(YouTube - Hide Latest Video button): Patch should handle `Tap to update` button

* Update fingerprint

* Add layout resources

* Update patches

* feat: instead of checking the opcode pattern, use the `injectLiteralInstructionViewCall` function

---------

Co-authored-by: inotia00 <108592928+inotia00@users.noreply.github.com>
This commit is contained in:
Hoàng Gia Bảo 2024-10-03 19:42:44 +07:00 committed by GitHub
parent ffcc9e5db8
commit c932956808
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 56 additions and 42 deletions

View File

@ -9,7 +9,7 @@ import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.PatchException
import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patcher.util.smali.ExternalLabel
import app.revanced.patches.music.general.components.fingerprints.ChipCloudFingerprint import app.revanced.patches.music.general.components.fingerprints.ChipCloudFingerprint
import app.revanced.patches.music.general.components.fingerprints.ContentPillInFingerprint import app.revanced.patches.music.general.components.fingerprints.ContentPillFingerprint
import app.revanced.patches.music.general.components.fingerprints.FloatingButtonFingerprint import app.revanced.patches.music.general.components.fingerprints.FloatingButtonFingerprint
import app.revanced.patches.music.general.components.fingerprints.FloatingButtonParentFingerprint import app.revanced.patches.music.general.components.fingerprints.FloatingButtonParentFingerprint
import app.revanced.patches.music.general.components.fingerprints.HistoryMenuItemFingerprint import app.revanced.patches.music.general.components.fingerprints.HistoryMenuItemFingerprint
@ -57,7 +57,7 @@ object LayoutComponentsPatch : BaseBytecodePatch(
compatiblePackages = COMPATIBLE_PACKAGE, compatiblePackages = COMPATIBLE_PACKAGE,
fingerprints = setOf( fingerprints = setOf(
ChipCloudFingerprint, ChipCloudFingerprint,
ContentPillInFingerprint, ContentPillFingerprint,
FloatingButtonParentFingerprint, FloatingButtonParentFingerprint,
HistoryMenuItemFingerprint, HistoryMenuItemFingerprint,
HistoryMenuItemOfflineTabFingerprint, HistoryMenuItemOfflineTabFingerprint,
@ -208,7 +208,7 @@ object LayoutComponentsPatch : BaseBytecodePatch(
// region patch for hide tap to update button // region patch for hide tap to update button
ContentPillInFingerprint.resultOrThrow().let { ContentPillFingerprint.resultOrThrow().let {
it.mutableMethod.apply { it.mutableMethod.apply {
addInstructionsWithLabels( addInstructionsWithLabels(
0, 0,

View File

@ -2,7 +2,7 @@ package app.revanced.patches.music.general.components.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.patcher.fingerprint.MethodFingerprint
internal object ContentPillInFingerprint : MethodFingerprint( internal object ContentPillFingerprint : MethodFingerprint(
returnType = "V", returnType = "V",
strings = listOf("Content pill VE is null") strings = listOf("Content pill VE is null")
) )

View File

@ -18,6 +18,7 @@ import app.revanced.patches.youtube.feed.components.fingerprints.ChannelListSubM
import app.revanced.patches.youtube.feed.components.fingerprints.ChannelListSubMenuTabletSyntheticFingerprint import app.revanced.patches.youtube.feed.components.fingerprints.ChannelListSubMenuTabletSyntheticFingerprint
import app.revanced.patches.youtube.feed.components.fingerprints.ChannelTabBuilderFingerprint import app.revanced.patches.youtube.feed.components.fingerprints.ChannelTabBuilderFingerprint
import app.revanced.patches.youtube.feed.components.fingerprints.ChannelTabRendererFingerprint import app.revanced.patches.youtube.feed.components.fingerprints.ChannelTabRendererFingerprint
import app.revanced.patches.youtube.feed.components.fingerprints.ContentPillFingerprint
import app.revanced.patches.youtube.feed.components.fingerprints.ElementParserFingerprint import app.revanced.patches.youtube.feed.components.fingerprints.ElementParserFingerprint
import app.revanced.patches.youtube.feed.components.fingerprints.ElementParserParentFingerprint import app.revanced.patches.youtube.feed.components.fingerprints.ElementParserParentFingerprint
import app.revanced.patches.youtube.feed.components.fingerprints.EngagementPanelUpdateFingerprint import app.revanced.patches.youtube.feed.components.fingerprints.EngagementPanelUpdateFingerprint
@ -37,8 +38,13 @@ import app.revanced.patches.youtube.utils.integrations.Constants.FEED_PATH
import app.revanced.patches.youtube.utils.navigation.NavigationBarHookPatch import app.revanced.patches.youtube.utils.navigation.NavigationBarHookPatch
import app.revanced.patches.youtube.utils.playertype.PlayerTypeHookPatch import app.revanced.patches.youtube.utils.playertype.PlayerTypeHookPatch
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Bar
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.CaptionToggleContainer import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.CaptionToggleContainer
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ChannelListSubMenu
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ContentPill
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.HorizontalCardList
import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch
import app.revanced.util.REGISTER_TEMPLATE_REPLACEMENT
import app.revanced.util.alsoResolve import app.revanced.util.alsoResolve
import app.revanced.util.getReference import app.revanced.util.getReference
import app.revanced.util.getWalkerMethod import app.revanced.util.getWalkerMethod
@ -46,6 +52,7 @@ import app.revanced.util.indexOfFirstInstruction
import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionOrThrow
import app.revanced.util.indexOfFirstInstructionReversedOrThrow import app.revanced.util.indexOfFirstInstructionReversedOrThrow
import app.revanced.util.indexOfFirstWideLiteralInstructionValueOrThrow import app.revanced.util.indexOfFirstWideLiteralInstructionValueOrThrow
import app.revanced.util.injectLiteralInstructionViewCall
import app.revanced.util.patch.BaseBytecodePatch import app.revanced.util.patch.BaseBytecodePatch
import app.revanced.util.resultOrThrow import app.revanced.util.resultOrThrow
import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode
@ -78,6 +85,7 @@ object FeedComponentsPatch : BaseBytecodePatch(
ChannelListSubMenuTabletFingerprint, ChannelListSubMenuTabletFingerprint,
ChannelListSubMenuTabletSyntheticFingerprint, ChannelListSubMenuTabletSyntheticFingerprint,
ChannelTabRendererFingerprint, ChannelTabRendererFingerprint,
ContentPillFingerprint,
ElementParserParentFingerprint, ElementParserParentFingerprint,
EngagementPanelBuilderFingerprint, EngagementPanelBuilderFingerprint,
FilterBarHeightFingerprint, FilterBarHeightFingerprint,
@ -106,23 +114,35 @@ object FeedComponentsPatch : BaseBytecodePatch(
// region patch for hide carousel shelf, subscriptions channel section, latest videos button // region patch for hide carousel shelf, subscriptions channel section, latest videos button
mapOf( listOf(
BreakingNewsFingerprint to "hideBreakingNewsShelf", // carousel shelf, only used to tablet layout. // carousel shelf, only used to tablet layout.
ChannelListSubMenuFingerprint to "hideSubscriptionsChannelSection", // subscriptions channel section Triple(
LatestVideosButtonFingerprint to "hideLatestVideosButton", // latest videos button BreakingNewsFingerprint,
).forEach { (fingerprint, methodName) -> "hideBreakingNewsShelf",
fingerprint.resultOrThrow().let { HorizontalCardList
it.mutableMethod.apply { ),
val targetIndex = it.scanResult.patternScanResult!!.endIndex // subscriptions channel section.
val targetRegister = Triple(
getInstruction<OneRegisterInstruction>(targetIndex).registerA ChannelListSubMenuFingerprint,
"hideSubscriptionsChannelSection",
addInstruction( ChannelListSubMenu
targetIndex + 1, ),
"invoke-static {v$targetRegister}, $FEED_CLASS_DESCRIPTOR->$methodName(Landroid/view/View;)V" // latest videos button
) Triple(
} ContentPillFingerprint,
} "hideLatestVideosButton",
ContentPill
),
Triple(
LatestVideosButtonFingerprint,
"hideLatestVideosButton",
Bar
),
).forEach { (fingerprint, methodName, literal) ->
val smaliInstruction = """
invoke-static {v$REGISTER_TEMPLATE_REPLACEMENT}, $FEED_CLASS_DESCRIPTOR->$methodName(Landroid/view/View;)V
"""
fingerprint.injectLiteralInstructionViewCall(literal, smaliInstruction)
} }
// endregion // endregion

View File

@ -4,15 +4,8 @@ import app.revanced.patcher.extensions.or
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.HorizontalCardList import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.HorizontalCardList
import app.revanced.util.fingerprint.LiteralValueFingerprint import app.revanced.util.fingerprint.LiteralValueFingerprint
import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
internal object BreakingNewsFingerprint : LiteralValueFingerprint( internal object BreakingNewsFingerprint : LiteralValueFingerprint(
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
opcodes = listOf(
Opcode.CONST,
Opcode.CONST_4,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_OBJECT
),
literalSupplier = { HorizontalCardList }, literalSupplier = { HorizontalCardList },
) )

View File

@ -2,14 +2,7 @@ package app.revanced.patches.youtube.feed.components.fingerprints
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ChannelListSubMenu import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ChannelListSubMenu
import app.revanced.util.fingerprint.LiteralValueFingerprint import app.revanced.util.fingerprint.LiteralValueFingerprint
import com.android.tools.smali.dexlib2.Opcode
internal object ChannelListSubMenuFingerprint : LiteralValueFingerprint( internal object ChannelListSubMenuFingerprint : LiteralValueFingerprint(
opcodes = listOf(
Opcode.CONST,
Opcode.CONST_4,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_OBJECT
),
literalSupplier = { ChannelListSubMenu }, literalSupplier = { ChannelListSubMenu },
) )

View File

@ -0,0 +1,13 @@
package app.revanced.patches.youtube.feed.components.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ContentPill
import app.revanced.util.fingerprint.LiteralValueFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
internal object ContentPillFingerprint : LiteralValueFingerprint(
returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = listOf("L", "Z"),
literalSupplier = { ContentPill },
)

View File

@ -4,17 +4,10 @@ import app.revanced.patcher.extensions.or
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Bar import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Bar
import app.revanced.util.fingerprint.LiteralValueFingerprint import app.revanced.util.fingerprint.LiteralValueFingerprint
import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
internal object LatestVideosButtonFingerprint : LiteralValueFingerprint( internal object LatestVideosButtonFingerprint : LiteralValueFingerprint(
returnType = "V", returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = listOf("L", "Z"), parameters = listOf("L", "Z"),
opcodes = listOf(
Opcode.CONST,
Opcode.IGET_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_OBJECT
),
literalSupplier = { Bar }, literalSupplier = { Bar },
) )

View File

@ -42,6 +42,7 @@ object SharedResourceIdPatch : ResourcePatch() {
var CompactLink = -1L var CompactLink = -1L
var CompactListItem = -1L var CompactListItem = -1L
var ComponentLongClickListener = -1L var ComponentLongClickListener = -1L
var ContentPill = -1L
var ControlsLayoutStub = -1L var ControlsLayoutStub = -1L
var DarkBackground = -1L var DarkBackground = -1L
var DarkSplashAnimation = -1L var DarkSplashAnimation = -1L
@ -150,6 +151,7 @@ object SharedResourceIdPatch : ResourcePatch() {
CompactLink = getId(LAYOUT, "compact_link") CompactLink = getId(LAYOUT, "compact_link")
CompactListItem = getId(LAYOUT, "compact_list_item") CompactListItem = getId(LAYOUT, "compact_list_item")
ComponentLongClickListener = getId(ID, "component_long_click_listener") ComponentLongClickListener = getId(ID, "component_long_click_listener")
ContentPill = getId(LAYOUT, "content_pill")
ControlsLayoutStub = getId(ID, "controls_layout_stub") ControlsLayoutStub = getId(ID, "controls_layout_stub")
DarkBackground = getId(ID, "dark_background") DarkBackground = getId(ID, "dark_background")
DarkSplashAnimation = getId(ID, "dark_splash_animation") DarkSplashAnimation = getId(ID, "dark_splash_animation")