mirror of
https://github.com/ReVanced/revanced-patches.git
synced 2026-01-27 04:31:03 +00:00
Compare commits
9 Commits
v5.41.0
...
v5.42.0-de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1cbff799ad | ||
|
|
080a226614 | ||
|
|
2b71bd80c2 | ||
|
|
5cb46c4e91 | ||
|
|
52c369576d | ||
|
|
28799a548a | ||
|
|
1c80774d79 | ||
|
|
7817885cff | ||
|
|
9afe9afc67 |
28
CHANGELOG.md
28
CHANGELOG.md
@@ -1,3 +1,31 @@
|
|||||||
|
# [5.42.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.1...v5.42.0-dev.2) (2025-09-27)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **Instagram - Hide navigation buttons:** Resolve app startup crash ([080a226](https://github.com/ReVanced/revanced-patches/commit/080a2266146798be71789c939deef2f289697523))
|
||||||
|
|
||||||
|
# [5.42.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.41.1-dev.2...v5.42.0-dev.1) (2025-09-27)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **Viber:** Add `Hide navigation buttons` patch ([#5991](https://github.com/ReVanced/revanced-patches/issues/5991)) ([5cb46c4](https://github.com/ReVanced/revanced-patches/commit/5cb46c4e9180ebc16eddb983dad73d137d8ec047))
|
||||||
|
|
||||||
|
## [5.41.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.41.1-dev.1...v5.41.1-dev.2) (2025-09-27)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **YouTube Music - Hide cast button:** Fix patching error ([28799a5](https://github.com/ReVanced/revanced-patches/commit/28799a548a73651134ef304cb6cb542cf8e55abe))
|
||||||
|
|
||||||
|
## [5.41.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.41.0...v5.41.1-dev.1) (2025-09-27)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **YouTube Music - Hide cast button:** Resolve button not hiding ([7817885](https://github.com/ReVanced/revanced-patches/commit/7817885cffed66608039ab45881537cbd3069c9d))
|
||||||
|
|
||||||
# [5.41.0](https://github.com/ReVanced/revanced-patches/compare/v5.40.0...v5.41.0) (2025-09-27)
|
# [5.41.0](https://github.com/ReVanced/revanced-patches/compare/v5.40.0...v5.41.0) (2025-09-27)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
|
|||||||
org.gradle.parallel = true
|
org.gradle.parallel = true
|
||||||
android.useAndroidX = true
|
android.useAndroidX = true
|
||||||
kotlin.code.style = official
|
kotlin.code.style = official
|
||||||
version = 5.41.0
|
version = 5.42.0-dev.2
|
||||||
|
|||||||
@@ -1306,6 +1306,10 @@ public final class app/revanced/patches/viber/ads/HideAdsPatchKt {
|
|||||||
public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final class app/revanced/patches/viber/misc/navbar/HideNavigationButtonsKt {
|
||||||
|
public static final fun getHideNavigationButtonsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||||
|
}
|
||||||
|
|
||||||
public final class app/revanced/patches/vsco/misc/pro/UnlockProPatchKt {
|
public final class app/revanced/patches/vsco/misc/pro/UnlockProPatchKt {
|
||||||
public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package app.revanced.patches.instagram.hide.navigation
|
|||||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||||
import app.revanced.patcher.patch.booleanOption
|
import app.revanced.patcher.patch.booleanOption
|
||||||
import app.revanced.patcher.patch.bytecodePatch
|
import app.revanced.patcher.patch.bytecodePatch
|
||||||
|
import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch
|
||||||
import app.revanced.util.addInstructionsAtControlFlowLabel
|
import app.revanced.util.addInstructionsAtControlFlowLabel
|
||||||
import app.revanced.util.findFreeRegister
|
import app.revanced.util.findFreeRegister
|
||||||
import app.revanced.util.getReference
|
import app.revanced.util.getReference
|
||||||
@@ -24,6 +25,8 @@ val hideNavigationButtonsPatch = bytecodePatch(
|
|||||||
) {
|
) {
|
||||||
compatibleWith("com.instagram.android")
|
compatibleWith("com.instagram.android")
|
||||||
|
|
||||||
|
dependsOn(sharedExtensionPatch)
|
||||||
|
|
||||||
val hideReels by booleanOption(
|
val hideReels by booleanOption(
|
||||||
key = "hideReels",
|
key = "hideReels",
|
||||||
default = true,
|
default = true,
|
||||||
@@ -69,20 +72,22 @@ val hideNavigationButtonsPatch = bytecodePatch(
|
|||||||
const-string v$freeRegister2, "$enumNameField"
|
const-string v$freeRegister2, "$enumNameField"
|
||||||
invoke-static { v$buttonsListRegister, v$freeRegister, v$freeRegister2 }, $EXTENSION_CLASS_DESCRIPTOR->removeNavigationButtonByName(Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
|
invoke-static { v$buttonsListRegister, v$freeRegister, v$freeRegister2 }, $EXTENSION_CLASS_DESCRIPTOR->removeNavigationButtonByName(Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
|
||||||
move-result-object v$buttonsListRegister
|
move-result-object v$buttonsListRegister
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hideReels!!)
|
if (hideReels!!) {
|
||||||
addInstructionsAtControlFlowLabel(
|
addInstructionsAtControlFlowLabel(
|
||||||
returnIndex,
|
returnIndex,
|
||||||
instructionsRemoveButtonByName("fragment_clips")
|
instructionsRemoveButtonByName("fragment_clips")
|
||||||
)
|
)
|
||||||
|
}
|
||||||
|
|
||||||
if (hideCreate!!)
|
if (hideCreate!!) {
|
||||||
addInstructionsAtControlFlowLabel(
|
addInstructionsAtControlFlowLabel(
|
||||||
returnIndex,
|
returnIndex,
|
||||||
instructionsRemoveButtonByName("fragment_share")
|
instructionsRemoveButtonByName("fragment_share")
|
||||||
)
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,9 @@ import app.revanced.patches.all.misc.resources.addResourcesPatch
|
|||||||
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
|
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
|
||||||
import app.revanced.patches.music.misc.settings.PreferenceScreen
|
import app.revanced.patches.music.misc.settings.PreferenceScreen
|
||||||
import app.revanced.patches.music.misc.settings.settingsPatch
|
import app.revanced.patches.music.misc.settings.settingsPatch
|
||||||
|
import app.revanced.patches.shared.misc.mapping.get
|
||||||
|
import app.revanced.patches.shared.misc.mapping.resourceMappingPatch
|
||||||
|
import app.revanced.patches.shared.misc.mapping.resourceMappings
|
||||||
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
||||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||||
import app.revanced.util.indexOfFirstLiteralInstructionOrThrow
|
import app.revanced.util.indexOfFirstLiteralInstructionOrThrow
|
||||||
@@ -29,6 +32,7 @@ val hideCastButton = bytecodePatch(
|
|||||||
sharedExtensionPatch,
|
sharedExtensionPatch,
|
||||||
settingsPatch,
|
settingsPatch,
|
||||||
addResourcesPatch,
|
addResourcesPatch,
|
||||||
|
resourceMappingPatch
|
||||||
)
|
)
|
||||||
|
|
||||||
compatibleWith(
|
compatibleWith(
|
||||||
@@ -39,6 +43,8 @@ val hideCastButton = bytecodePatch(
|
|||||||
)
|
)
|
||||||
|
|
||||||
execute {
|
execute {
|
||||||
|
playerOverlayChip = resourceMappings["id", "player_overlay_chip"]
|
||||||
|
|
||||||
addResources("music", "layout.castbutton.hideCastButton")
|
addResources("music", "layout.castbutton.hideCastButton")
|
||||||
|
|
||||||
PreferenceScreen.GENERAL.addPreferences(
|
PreferenceScreen.GENERAL.addPreferences(
|
||||||
@@ -59,7 +65,7 @@ val hideCastButton = bytecodePatch(
|
|||||||
|
|
||||||
playerOverlayChipFingerprint.method.apply {
|
playerOverlayChipFingerprint.method.apply {
|
||||||
val resourceIndex = indexOfFirstLiteralInstructionOrThrow(playerOverlayChip)
|
val resourceIndex = indexOfFirstLiteralInstructionOrThrow(playerOverlayChip)
|
||||||
val targetIndex = indexOfFirstInstructionOrThrow(resourceIndex, Opcode.MOVE_RESULT)
|
val targetIndex = indexOfFirstInstructionOrThrow(resourceIndex, Opcode.MOVE_RESULT_OBJECT)
|
||||||
val targetRegister = getInstruction<OneRegisterInstruction>(targetIndex).registerA
|
val targetRegister = getInstruction<OneRegisterInstruction>(targetIndex).registerA
|
||||||
|
|
||||||
addInstruction(
|
addInstruction(
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package app.revanced.patches.viber.misc.navbar
|
||||||
|
import app.revanced.patcher.fingerprint
|
||||||
|
import app.revanced.patcher.patch.BytecodePatchContext
|
||||||
|
|
||||||
|
internal val tabIdClassFingerprint = fingerprint {
|
||||||
|
strings("shouldShowTabId")
|
||||||
|
}
|
||||||
|
|
||||||
|
context(BytecodePatchContext)
|
||||||
|
internal val shouldShowTabIdMethodFingerprint get() = fingerprint {
|
||||||
|
parameters("I", "I")
|
||||||
|
returns("Z")
|
||||||
|
custom { methodDef, classDef ->
|
||||||
|
classDef == tabIdClassFingerprint.classDef
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
package app.revanced.patches.viber.misc.navbar
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
|
||||||
|
import app.revanced.patcher.patch.booleanOption
|
||||||
|
import app.revanced.patcher.patch.bytecodePatch
|
||||||
|
import java.util.logging.Logger
|
||||||
|
import kotlin.collections.joinToString
|
||||||
|
|
||||||
|
|
||||||
|
private const val instructionsFooter = """
|
||||||
|
# If we reach this, it means that this tab has been disabled by user
|
||||||
|
const/4 v0, 0
|
||||||
|
return v0 # return false as "This tab is not enabled"
|
||||||
|
|
||||||
|
# Proceed with default execution
|
||||||
|
:continue
|
||||||
|
nop
|
||||||
|
"""
|
||||||
|
|
||||||
|
@Suppress("unused")
|
||||||
|
val hideNavigationButtonsPatch = bytecodePatch(
|
||||||
|
name = "Hide navigation buttons",
|
||||||
|
description = "Permanently hides navigation bar buttons, such as Explore and Marketplace.",
|
||||||
|
use = false
|
||||||
|
) {
|
||||||
|
compatibleWith("com.viber.voip")
|
||||||
|
|
||||||
|
val hideOptions = AllowedNavigationItems.entries.associateWith {
|
||||||
|
booleanOption(
|
||||||
|
key = it.key,
|
||||||
|
default = it.defaultHideOption,
|
||||||
|
title = it.title,
|
||||||
|
description = it.description,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
execute {
|
||||||
|
// Items that won't be forcefully hidden.
|
||||||
|
val allowedItems = hideOptions.filter { (option, enabled) -> enabled.value != true }
|
||||||
|
|
||||||
|
if (allowedItems.size == AllowedNavigationItems.entries.size) {
|
||||||
|
return@execute Logger.getLogger(this::class.java.name).warning(
|
||||||
|
"No hide navigation buttons options are enabled. No changes made."
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
val injectionInstructions = allowedItems
|
||||||
|
.map { it.key.buildAllowInstruction() }
|
||||||
|
.joinToString("\n") + instructionsFooter
|
||||||
|
|
||||||
|
shouldShowTabIdMethodFingerprint
|
||||||
|
.method
|
||||||
|
.addInstructionsWithLabels(0, injectionInstructions)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Navigation items taken from source code.
|
||||||
|
* They appear in code like new NavigationItem(0, R.string.bottom_tab_chats, R.drawable.ic_tab_chats).
|
||||||
|
*/
|
||||||
|
private enum class AllowedNavigationItems(
|
||||||
|
val defaultHideOption: Boolean,
|
||||||
|
private val itemName: String,
|
||||||
|
private vararg val ids: Int
|
||||||
|
) {
|
||||||
|
CHATS(false, "Chats", 0),
|
||||||
|
CALLS(false, "Calls", 1, 7),
|
||||||
|
EXPLORE(true, "Explore", 2),
|
||||||
|
MORE(false, "More", 3),
|
||||||
|
PAY(true, "Pay", 5),
|
||||||
|
CAMERA(true, "Camera", 6),
|
||||||
|
MARKETPLACE(true, "Marketplace", 8);
|
||||||
|
|
||||||
|
val key = "hide$itemName"
|
||||||
|
val title = "Hide $itemName"
|
||||||
|
val description = "Permanently hides the $itemName button."
|
||||||
|
|
||||||
|
fun buildAllowInstruction(): String =
|
||||||
|
ids.joinToString("\n") { id ->
|
||||||
|
"""
|
||||||
|
const/4 v0, $id # If tabId == $id ($itemName), don't hide it
|
||||||
|
if-eq p1, v0, :continue
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -14,8 +14,7 @@ internal val settingsMenuVideoQualityGroup = mutableSetOf<BasePreference>()
|
|||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
val videoQualityPatch = bytecodePatch(
|
val videoQualityPatch = bytecodePatch(
|
||||||
name = "Video quality",
|
name = "Video quality",
|
||||||
description = "Adds options to use the advanced video quality menu, set default video qualities, " +
|
description = "Adds options to set default video qualities and always use the advanced video quality menu."
|
||||||
"and disable video codecs such as VP9/HDR."
|
|
||||||
) {
|
) {
|
||||||
dependsOn(
|
dependsOn(
|
||||||
rememberVideoQualityPatch,
|
rememberVideoQualityPatch,
|
||||||
|
|||||||
Reference in New Issue
Block a user