From 4bece31f56eb340933ad26da3d1bfc902ea8569f Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Tue, 2 May 2023 07:36:33 +0200 Subject: [PATCH] feat(youtube): `navigation-buttons` patch --- .../NavigationButtonsCompatibility.kt} | 4 +- .../AddCreateButtonViewFingerprint.kt | 2 +- .../InitializeButtonsFingerprint.kt | 4 +- .../PivotBarButtonsViewFingerprint.kt} | 4 +- .../PivotBarConstructorFingerprint.kt | 2 +- .../PivotBarCreateButtonViewFingerprint.kt | 2 +- .../fingerprints/PivotBarEnumFingerprint.kt | 2 +- .../patch/NavigationButtonsPatch.kt | 196 ++++++++++++++++++ .../patch/ResolvePivotBarFingerprintsPatch.kt | 16 +- .../utils/InjectionUtils.kt | 2 +- .../create/patch/CreateButtonPatch.kt | 118 ----------- .../shorts/patch/ShortsButtonRemoverPatch.kt | 93 --------- 12 files changed, 214 insertions(+), 231 deletions(-) rename src/main/kotlin/app/revanced/patches/youtube/layout/buttons/{pivotbar/shared/annotations/PivotBarCompatibility.kt => navigation/annotations/NavigationButtonsCompatibility.kt} (79%) rename src/main/kotlin/app/revanced/patches/youtube/layout/buttons/{pivotbar/create => navigation}/fingerprints/AddCreateButtonViewFingerprint.kt (78%) rename src/main/kotlin/app/revanced/patches/youtube/layout/buttons/{pivotbar/shared => navigation}/fingerprints/InitializeButtonsFingerprint.kt (72%) rename src/main/kotlin/app/revanced/patches/youtube/layout/buttons/{pivotbar/shorts/fingerprints/PivotBarShortsButtonViewFingerprint.kt => navigation/fingerprints/PivotBarButtonsViewFingerprint.kt} (62%) rename src/main/kotlin/app/revanced/patches/youtube/layout/buttons/{pivotbar/shared => navigation}/fingerprints/PivotBarConstructorFingerprint.kt (80%) rename src/main/kotlin/app/revanced/patches/youtube/layout/buttons/{pivotbar/create => navigation}/fingerprints/PivotBarCreateButtonViewFingerprint.kt (77%) rename src/main/kotlin/app/revanced/patches/youtube/layout/buttons/{pivotbar/shorts => navigation}/fingerprints/PivotBarEnumFingerprint.kt (82%) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/patch/NavigationButtonsPatch.kt rename src/main/kotlin/app/revanced/patches/youtube/layout/buttons/{pivotbar/shared => navigation}/patch/ResolvePivotBarFingerprintsPatch.kt (80%) rename src/main/kotlin/app/revanced/patches/youtube/layout/buttons/{pivotbar => navigation}/utils/InjectionUtils.kt (94%) delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/create/patch/CreateButtonPatch.kt delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/shorts/patch/ShortsButtonRemoverPatch.kt diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/shared/annotations/PivotBarCompatibility.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/annotations/NavigationButtonsCompatibility.kt similarity index 79% rename from src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/shared/annotations/PivotBarCompatibility.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/annotations/NavigationButtonsCompatibility.kt index b94b07a3..23485105 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/shared/annotations/PivotBarCompatibility.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/annotations/NavigationButtonsCompatibility.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.buttons.pivotbar.shared.annotations +package app.revanced.patches.youtube.layout.buttons.navigation.annotations import app.revanced.patcher.annotation.Compatibility import app.revanced.patcher.annotation.Package @@ -21,4 +21,4 @@ import app.revanced.patcher.annotation.Package )] ) @Target(AnnotationTarget.CLASS) -internal annotation class PivotBarCompatibility \ No newline at end of file +internal annotation class NavigationButtonsCompatibility \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/create/fingerprints/AddCreateButtonViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/fingerprints/AddCreateButtonViewFingerprint.kt similarity index 78% rename from src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/create/fingerprints/AddCreateButtonViewFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/fingerprints/AddCreateButtonViewFingerprint.kt index 3ba16947..5e205ea4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/create/fingerprints/AddCreateButtonViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/fingerprints/AddCreateButtonViewFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.buttons.pivotbar.create.fingerprints +package app.revanced.patches.youtube.layout.buttons.navigation.fingerprints import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/shared/fingerprints/InitializeButtonsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/fingerprints/InitializeButtonsFingerprint.kt similarity index 72% rename from src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/shared/fingerprints/InitializeButtonsFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/fingerprints/InitializeButtonsFingerprint.kt index 5c2d1016..e7c62c85 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/shared/fingerprints/InitializeButtonsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/fingerprints/InitializeButtonsFingerprint.kt @@ -1,7 +1,7 @@ -package app.revanced.patches.youtube.layout.buttons.pivotbar.shared.fingerprints +package app.revanced.patches.youtube.layout.buttons.navigation.fingerprints import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint -import app.revanced.patches.youtube.layout.buttons.pivotbar.shared.patch.ResolvePivotBarFingerprintsPatch +import app.revanced.patches.youtube.layout.buttons.navigation.patch.ResolvePivotBarFingerprintsPatch import org.jf.dexlib2.Opcode import org.jf.dexlib2.iface.instruction.WideLiteralInstruction diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/shorts/fingerprints/PivotBarShortsButtonViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/fingerprints/PivotBarButtonsViewFingerprint.kt similarity index 62% rename from src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/shorts/fingerprints/PivotBarShortsButtonViewFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/fingerprints/PivotBarButtonsViewFingerprint.kt index e4309ad9..82fd7e1c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/shorts/fingerprints/PivotBarShortsButtonViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/fingerprints/PivotBarButtonsViewFingerprint.kt @@ -1,9 +1,9 @@ -package app.revanced.patches.youtube.layout.buttons.pivotbar.shorts.fingerprints +package app.revanced.patches.youtube.layout.buttons.navigation.fingerprints import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint import org.jf.dexlib2.Opcode -object PivotBarShortsButtonViewFingerprint : MethodFingerprint( +object PivotBarButtonsViewFingerprint : MethodFingerprint( opcodes = listOf( Opcode.INVOKE_VIRTUAL_RANGE, Opcode.MOVE_RESULT_OBJECT, // target reference diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/shared/fingerprints/PivotBarConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/fingerprints/PivotBarConstructorFingerprint.kt similarity index 80% rename from src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/shared/fingerprints/PivotBarConstructorFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/fingerprints/PivotBarConstructorFingerprint.kt index ad700d09..98991910 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/shared/fingerprints/PivotBarConstructorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/fingerprints/PivotBarConstructorFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.buttons.pivotbar.shared.fingerprints +package app.revanced.patches.youtube.layout.buttons.navigation.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/create/fingerprints/PivotBarCreateButtonViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/fingerprints/PivotBarCreateButtonViewFingerprint.kt similarity index 77% rename from src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/create/fingerprints/PivotBarCreateButtonViewFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/fingerprints/PivotBarCreateButtonViewFingerprint.kt index 5e7e6d0e..21635ef0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/create/fingerprints/PivotBarCreateButtonViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/fingerprints/PivotBarCreateButtonViewFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.buttons.pivotbar.create.fingerprints +package app.revanced.patches.youtube.layout.buttons.navigation.fingerprints import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint import org.jf.dexlib2.Opcode diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/shorts/fingerprints/PivotBarEnumFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/fingerprints/PivotBarEnumFingerprint.kt similarity index 82% rename from src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/shorts/fingerprints/PivotBarEnumFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/fingerprints/PivotBarEnumFingerprint.kt index cee53db0..af6bb087 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/shorts/fingerprints/PivotBarEnumFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/fingerprints/PivotBarEnumFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.buttons.pivotbar.shorts.fingerprints +package app.revanced.patches.youtube.layout.buttons.navigation.fingerprints import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint import org.jf.dexlib2.Opcode diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/patch/NavigationButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/patch/NavigationButtonsPatch.kt new file mode 100644 index 00000000..4a2f584a --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/patch/NavigationButtonsPatch.kt @@ -0,0 +1,196 @@ +package app.revanced.patches.youtube.layout.buttons.navigation.patch + +import app.revanced.extensions.toErrorResult +import app.revanced.patcher.annotation.Description +import app.revanced.patcher.annotation.Name +import app.revanced.patcher.annotation.Version +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.instruction +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve +import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.PatchResult +import app.revanced.patcher.patch.PatchResultSuccess +import app.revanced.patcher.patch.annotations.DependsOn +import app.revanced.patcher.patch.annotations.Patch +import app.revanced.patches.shared.settings.preference.impl.PreferenceScreen +import app.revanced.patches.shared.settings.preference.impl.StringResource +import app.revanced.patches.shared.settings.preference.impl.SwitchPreference +import app.revanced.patches.youtube.layout.buttons.navigation.annotations.NavigationButtonsCompatibility +import app.revanced.patches.youtube.layout.buttons.navigation.fingerprints.* +import app.revanced.patches.youtube.layout.buttons.navigation.utils.InjectionUtils.REGISTER_TEMPLATE_REPLACEMENT +import app.revanced.patches.youtube.layout.buttons.navigation.utils.InjectionUtils.injectHook +import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch +import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch +import org.jf.dexlib2.Opcode +import org.jf.dexlib2.iface.instruction.OneRegisterInstruction + +@Patch +@DependsOn( + [ + IntegrationsPatch::class, + SettingsPatch::class, + ResolvePivotBarFingerprintsPatch::class, + ] +) +@Name("navigation-buttons") +@Description("Adds options to hide or change navigation buttons.") +@NavigationButtonsCompatibility +@Version("0.0.1") +class NavigationButtonsPatch : BytecodePatch(listOf(AddCreateButtonViewFingerprint)) { + override fun execute(context: BytecodeContext): PatchResult { + SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( + PreferenceScreen( + "revanced_navigation_buttons", + StringResource("revanced_navigation_buttons", "Navigation button settings"), + listOf( + SwitchPreference( + "revanced_hide_home_button", + StringResource("revanced_hide_home_button_title", "Hide home button"), + false, + StringResource("revanced_hide_home_button_summary_on", "Home button is hidden"), + StringResource("revanced_hide_home_button_summary_off", "Home button is shown") + ), + SwitchPreference( + "revanced_hide_shorts_button", + StringResource("revanced_hide_shorts_button_title", "Hide shorts button"), + true, + StringResource("revanced_hide_shorts_button_summary_on", "Shorts button is hidden"), + StringResource("revanced_hide_shorts_button_summary_off", "Shorts button is shown") + ), + SwitchPreference( + "revanced_hide_subscriptions_button", + StringResource("revanced_hide_subscriptions_button_title", "Hide subscriptions button"), + false, + StringResource( + "revanced_hide_subscriptions_button_summary_on", + "Home subscriptions is hidden" + ), + StringResource("revanced_hide_subscriptions_button_summary_off", "Home subscriptions is shown") + ), + SwitchPreference( + "revanced_hide_create_button", + StringResource("revanced_hide_create_button_title", "Hide create button"), + true, + StringResource("revanced_hide_create_button_summary_on", "Create button is hidden"), + StringResource("revanced_hide_create_button_summary_off", "Create button is shown") + ), + SwitchPreference( + "revanced_switch_create_with_notifications_button", + StringResource( + "revanced_switch_create_with_notifications_button_title", + "Switch create with notifications button" + ), + true, + StringResource( + "revanced_switch_create_with_notifications_button_summary_on", + "Create button is switched with notifications" + ), + StringResource( + "revanced_switch_create_with_notifications_button_summary_off", + "Create button is not switched with notifications" + ), + ), + ), + ) + ) + + /* + * Resolve fingerprints + */ + + val initializeButtonsResult = InitializeButtonsFingerprint.result!! + + val fingerprintResults = + arrayOf(PivotBarEnumFingerprint, PivotBarButtonsViewFingerprint) + .onEach { + if (!it.resolve( + context, + initializeButtonsResult.mutableMethod, + initializeButtonsResult.mutableClass + ) + ) + return it.toErrorResult() + } + .map { it.result!!.scanResult.patternScanResult!! } + + + val enumScanResult = fingerprintResults[0] + val buttonViewResult = fingerprintResults[1] + + val enumHookInsertIndex = enumScanResult.startIndex + 2 + val buttonHookInsertIndex = buttonViewResult.endIndex + + /* + * Inject hooks + */ + + val enumHook = "sput-object v$REGISTER_TEMPLATE_REPLACEMENT, " + + "$INTEGRATIONS_CLASS_DESCRIPTOR->lastNavigationButton:Ljava/lang/Enum;" + val buttonHook = "invoke-static { v$REGISTER_TEMPLATE_REPLACEMENT }, " + + "$INTEGRATIONS_CLASS_DESCRIPTOR->hideButton(Landroid/view/View;)V" + + // Inject bottom to top to not mess up the indices + mapOf( + buttonHook to buttonHookInsertIndex, + enumHook to enumHookInsertIndex + ).forEach { (hook, insertIndex) -> + initializeButtonsResult.mutableMethod.injectHook(hook, insertIndex) + } + + /* + * Hide create or switch it with notifications buttons. + */ + + AddCreateButtonViewFingerprint.result?.let { + it.mutableMethod.apply { + val stringIndex = it.scanResult.stringsScanResult!!.matches.find { + match -> match.string == ANDROID_AUTOMOTIVE_STRING + }!!.index + + val conditionalCheckIndex = stringIndex - 1 + val conditionRegister = (instruction(conditionalCheckIndex) as OneRegisterInstruction).registerA + + addInstructions( + conditionalCheckIndex, + """ + invoke-static { }, $INTEGRATIONS_CLASS_DESCRIPTOR->switchCreateWithNotificationButton()Z + move-result v$conditionRegister + """ + ) + } + } ?: return AddCreateButtonViewFingerprint.toErrorResult() + + /* + * Resolve fingerprints + */ + + InitializeButtonsFingerprint.result!!.let { + if (!PivotBarCreateButtonViewFingerprint.resolve(context, it.mutableMethod, it.mutableClass)) + return PivotBarCreateButtonViewFingerprint.toErrorResult() + } + + PivotBarCreateButtonViewFingerprint.result!!.apply { + val insertIndex = mutableMethod.implementation!!.instructions.let { + val scanStart = scanResult.patternScanResult!!.endIndex + + scanStart + it.subList(scanStart, it.size - 1).indexOfFirst { instruction -> + instruction.opcode == Opcode.INVOKE_STATIC + } + } + + /* + * Inject hooks + */ + val hook = "invoke-static { v$REGISTER_TEMPLATE_REPLACEMENT }, " + + "$INTEGRATIONS_CLASS_DESCRIPTOR->hideCreateButton(Landroid/view/View;)V" + + mutableMethod.injectHook(hook, insertIndex) + } + return PatchResultSuccess() + } + + private companion object { + const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/patches/NavigationButtonsPatch;" + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/shared/patch/ResolvePivotBarFingerprintsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/patch/ResolvePivotBarFingerprintsPatch.kt similarity index 80% rename from src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/shared/patch/ResolvePivotBarFingerprintsPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/patch/ResolvePivotBarFingerprintsPatch.kt index 1451f7a3..1f974057 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/shared/patch/ResolvePivotBarFingerprintsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/patch/ResolvePivotBarFingerprintsPatch.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.buttons.pivotbar.shared.patch +package app.revanced.patches.youtube.layout.buttons.navigation.patch import app.revanced.extensions.toErrorResult import app.revanced.patcher.annotation.Description @@ -11,21 +11,15 @@ import app.revanced.patcher.patch.PatchResultError import app.revanced.patcher.patch.PatchResultSuccess import app.revanced.patcher.patch.annotations.DependsOn import app.revanced.patches.shared.mapping.misc.patch.ResourceMappingPatch -import app.revanced.patches.youtube.layout.buttons.pivotbar.shared.annotations.PivotBarCompatibility -import app.revanced.patches.youtube.layout.buttons.pivotbar.shared.fingerprints.InitializeButtonsFingerprint -import app.revanced.patches.youtube.layout.buttons.pivotbar.shared.fingerprints.PivotBarConstructorFingerprint +import app.revanced.patches.youtube.layout.buttons.navigation.fingerprints.InitializeButtonsFingerprint +import app.revanced.patches.youtube.layout.buttons.navigation.fingerprints.PivotBarConstructorFingerprint @DependsOn([ResourceMappingPatch::class]) -@PivotBarCompatibility @Description("Resolves necessary fingerprints.") @Version("0.0.1") class ResolvePivotBarFingerprintsPatch : BytecodePatch( listOf(PivotBarConstructorFingerprint) ) { - internal companion object { - var imageOnlyTabResourceId: Long = -1 - } - override fun execute(context: BytecodeContext): PatchResult { // imageOnlyTabResourceId is used in InitializeButtonsFingerprint fingerprint ResourceMappingPatch.resourceMappings.find { it.type == "layout" && it.name == "image_only_tab" } @@ -42,4 +36,8 @@ class ResolvePivotBarFingerprintsPatch : BytecodePatch( } ?: return PivotBarConstructorFingerprint.toErrorResult() return PatchResultSuccess() } + + internal companion object { + var imageOnlyTabResourceId: Long = -1 + } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/utils/InjectionUtils.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/utils/InjectionUtils.kt similarity index 94% rename from src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/utils/InjectionUtils.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/utils/InjectionUtils.kt index b39f92aa..ae60c1aa 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/utils/InjectionUtils.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/utils/InjectionUtils.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.buttons.pivotbar.utils +package app.revanced.patches.youtube.layout.buttons.navigation.utils import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.extensions.instruction diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/create/patch/CreateButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/create/patch/CreateButtonPatch.kt deleted file mode 100644 index eb034764..00000000 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/create/patch/CreateButtonPatch.kt +++ /dev/null @@ -1,118 +0,0 @@ -package app.revanced.patches.youtube.layout.buttons.pivotbar.create.patch - -import app.revanced.extensions.toErrorResult -import app.revanced.patcher.annotation.Description -import app.revanced.patcher.annotation.Name -import app.revanced.patcher.annotation.Version -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.extensions.addInstructions -import app.revanced.patcher.extensions.instruction -import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.PatchResult -import app.revanced.patcher.patch.PatchResultSuccess -import app.revanced.patcher.patch.annotations.DependsOn -import app.revanced.patcher.patch.annotations.Patch -import app.revanced.patches.shared.mapping.misc.patch.ResourceMappingPatch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference -import app.revanced.patches.youtube.layout.buttons.pivotbar.create.fingerprints.ANDROID_AUTOMOTIVE_STRING -import app.revanced.patches.youtube.layout.buttons.pivotbar.create.fingerprints.AddCreateButtonViewFingerprint -import app.revanced.patches.youtube.layout.buttons.pivotbar.create.fingerprints.PivotBarCreateButtonViewFingerprint -import app.revanced.patches.youtube.layout.buttons.pivotbar.shared.annotations.PivotBarCompatibility -import app.revanced.patches.youtube.layout.buttons.pivotbar.shared.fingerprints.InitializeButtonsFingerprint -import app.revanced.patches.youtube.layout.buttons.pivotbar.shared.patch.ResolvePivotBarFingerprintsPatch -import app.revanced.patches.youtube.layout.buttons.pivotbar.utils.InjectionUtils.REGISTER_TEMPLATE_REPLACEMENT -import app.revanced.patches.youtube.layout.buttons.pivotbar.utils.InjectionUtils.injectHook -import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch -import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch -import org.jf.dexlib2.Opcode -import org.jf.dexlib2.iface.instruction.OneRegisterInstruction - -@Patch -@DependsOn([IntegrationsPatch::class, ResourceMappingPatch::class, SettingsPatch::class, ResolvePivotBarFingerprintsPatch::class]) -@Name("create-button") -@Description("Hide the create button in the navigation bar or switch it with notifications.") -@PivotBarCompatibility -@Version("0.0.1") -class CreateButtonPatch : BytecodePatch(listOf(AddCreateButtonViewFingerprint)) { - private companion object { - const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/patches/CreateButtonPatch;" - } - - override fun execute(context: BytecodeContext): PatchResult { - SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_hide_create_button", - StringResource("revanced_hide_create_button_title", "Hide create button"), - true, - StringResource("revanced_hide_create_button_summary_on", "Create button is hidden"), - StringResource("revanced_hide_create_button_summary_off", "Create button is shown") - ), - SwitchPreference( - "revanced_switch_create_with_notifications_button", - StringResource( - "revanced_switch_create_with_notifications_button_title", - "Switch create with notifications button" - ), - true, - StringResource( - "revanced_switch_create_with_notifications_button_summary_on", - "Create button is switched with notifications" - ), - StringResource( - "revanced_switch_create_with_notifications_button_summary_off", - "Create button is not switched with notifications" - ), - ), - ) - - AddCreateButtonViewFingerprint.result?.let { - it.mutableMethod.apply { - val stringIndex = it.scanResult.stringsScanResult!!.matches.find { - match -> match.string == ANDROID_AUTOMOTIVE_STRING - }!!.index - - val conditionalCheckIndex = stringIndex - 1 - val conditionRegister = (instruction(conditionalCheckIndex) as OneRegisterInstruction).registerA - - addInstructions( - conditionalCheckIndex, - """ - invoke-static { }, $INTEGRATIONS_CLASS_DESCRIPTOR->switchCreateWithNotificationButton()Z - move-result v$conditionRegister - """ - ) - } - } ?: return AddCreateButtonViewFingerprint.toErrorResult() - /* - * Resolve fingerprints - */ - - InitializeButtonsFingerprint.result!!.let { - if (!PivotBarCreateButtonViewFingerprint.resolve(context, it.mutableMethod, it.mutableClass)) - return PivotBarCreateButtonViewFingerprint.toErrorResult() - } - - PivotBarCreateButtonViewFingerprint.result!!.apply { - val insertIndex = mutableMethod.implementation!!.instructions.let { - val scanStart = scanResult.patternScanResult!!.endIndex - - scanStart + it.subList(scanStart, it.size - 1).indexOfFirst { instruction -> - instruction.opcode == Opcode.INVOKE_STATIC - } - } - - /* - * Inject hooks - */ - val hook = "invoke-static { v$REGISTER_TEMPLATE_REPLACEMENT }, " + - "$INTEGRATIONS_CLASS_DESCRIPTOR->hideCreateButton(Landroid/view/View;)V" - - mutableMethod.injectHook(hook, insertIndex) - } - - - return PatchResultSuccess() - } -} diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/shorts/patch/ShortsButtonRemoverPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/shorts/patch/ShortsButtonRemoverPatch.kt deleted file mode 100644 index 47a34dcd..00000000 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/pivotbar/shorts/patch/ShortsButtonRemoverPatch.kt +++ /dev/null @@ -1,93 +0,0 @@ -package app.revanced.patches.youtube.layout.buttons.pivotbar.shorts.patch - -import app.revanced.extensions.toErrorResult -import app.revanced.patcher.annotation.Description -import app.revanced.patcher.annotation.Name -import app.revanced.patcher.annotation.Version -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.PatchResult -import app.revanced.patcher.patch.PatchResultSuccess -import app.revanced.patcher.patch.annotations.DependsOn -import app.revanced.patcher.patch.annotations.Patch -import app.revanced.patches.shared.settings.preference.impl.StringResource -import app.revanced.patches.shared.settings.preference.impl.SwitchPreference -import app.revanced.patches.youtube.layout.buttons.pivotbar.shared.annotations.PivotBarCompatibility -import app.revanced.patches.youtube.layout.buttons.pivotbar.shared.fingerprints.InitializeButtonsFingerprint -import app.revanced.patches.youtube.layout.buttons.pivotbar.shared.patch.ResolvePivotBarFingerprintsPatch -import app.revanced.patches.youtube.layout.buttons.pivotbar.shorts.fingerprints.PivotBarEnumFingerprint -import app.revanced.patches.youtube.layout.buttons.pivotbar.shorts.fingerprints.PivotBarShortsButtonViewFingerprint -import app.revanced.patches.youtube.layout.buttons.pivotbar.utils.InjectionUtils.REGISTER_TEMPLATE_REPLACEMENT -import app.revanced.patches.youtube.layout.buttons.pivotbar.utils.InjectionUtils.injectHook -import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch -import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch - -@Patch -@DependsOn([IntegrationsPatch::class, SettingsPatch::class, ResolvePivotBarFingerprintsPatch::class]) -@Name("hide-shorts-button") -@Description("Hides the shorts button on the navigation bar.") -@PivotBarCompatibility -@Version("0.0.1") -class ShortsButtonRemoverPatch : BytecodePatch() { - private companion object { - const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/patches/HideShortsButtonPatch;" - } - - override fun execute(context: BytecodeContext): PatchResult { - SettingsPatch.PreferenceScreen.LAYOUT.addPreferences( - SwitchPreference( - "revanced_hide_shorts_button", - StringResource("revanced_hide_shorts_button_title", "Hide shorts button"), - true, - StringResource("revanced_hide_shorts_button_summary_on", "Shorts button is hidden"), - StringResource("revanced_hide_shorts_button_summary_off", "Shorts button is shown") - ) - ) - - /* - * Resolve fingerprints - */ - - val initializeButtonsResult = InitializeButtonsFingerprint.result!! - - val fingerprintResults = - arrayOf(PivotBarEnumFingerprint, PivotBarShortsButtonViewFingerprint) - .onEach { - if (!it.resolve( - context, - initializeButtonsResult.mutableMethod, - initializeButtonsResult.mutableClass - ) - ) - return it.toErrorResult() - } - .map { it.result!!.scanResult.patternScanResult!! } - - - val enumScanResult = fingerprintResults[0] - val buttonViewResult = fingerprintResults[1] - - val enumHookInsertIndex = enumScanResult.startIndex + 2 - val buttonHookInsertIndex = buttonViewResult.endIndex - - /* - * Inject hooks - */ - - val enumHook = "sput-object v$REGISTER_TEMPLATE_REPLACEMENT, " + - "$INTEGRATIONS_CLASS_DESCRIPTOR->lastPivotTab:Ljava/lang/Enum;" - val buttonHook = "invoke-static { v$REGISTER_TEMPLATE_REPLACEMENT }, " + - "$INTEGRATIONS_CLASS_DESCRIPTOR->hideShortsButton(Landroid/view/View;)V" - - // Inject bottom to top to not mess up the indices - mapOf( - buttonHook to buttonHookInsertIndex, - enumHook to enumHookInsertIndex - ).forEach { (hook, insertIndex) -> - initializeButtonsResult.mutableMethod.injectHook(hook, insertIndex) - } - - return PatchResultSuccess() - } -} \ No newline at end of file