feat(YouTube): Hide search term thumbnail, Hide toolbar button, Hide trending searches, Hide voice search button patches has been integrated into Toolbar components patch

This commit is contained in:
inotia00 2024-04-27 04:48:04 +09:00
parent e6411d946a
commit 9d78f19b74
25 changed files with 534 additions and 366 deletions

View File

@ -15,7 +15,7 @@ object DrawableColorPatch : BytecodePatch(
) {
override fun execute(context: BytecodeContext) {
DrawableFingerprint.resultOrThrow().mutableMethod?.apply {
DrawableFingerprint.resultOrThrow().mutableMethod.apply {
insertMethod = this
insertIndex = getTargetIndexWithMethodReferenceNameReversed("setColor")
insertRegister = getInstruction<FiveRegisterInstruction>(insertIndex).registerD

View File

@ -5,45 +5,30 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.patch.PatchException
import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.booleanPatchOption
import app.revanced.patcher.util.smali.ExternalLabel
import app.revanced.patches.shared.litho.LithoFilterPatch
import app.revanced.patches.shared.voicesearch.VoiceSearchUtils.patchXml
import app.revanced.patches.youtube.general.components.fingerprints.AccountListFingerprint
import app.revanced.patches.youtube.general.components.fingerprints.AccountListParentFingerprint
import app.revanced.patches.youtube.general.components.fingerprints.AccountMenuFingerprint
import app.revanced.patches.youtube.general.components.fingerprints.AccountSwitcherAccessibilityLabelFingerprint
import app.revanced.patches.youtube.general.components.fingerprints.BottomUiContainerFingerprint
import app.revanced.patches.youtube.general.components.fingerprints.CreateSearchSuggestionsFingerprint
import app.revanced.patches.youtube.general.components.fingerprints.FloatingMicrophoneFingerprint
import app.revanced.patches.youtube.general.components.fingerprints.TrendingSearchConfigFingerprint
import app.revanced.patches.youtube.general.components.fingerprints.SearchBarFingerprint
import app.revanced.patches.youtube.general.components.fingerprints.SearchBarParentFingerprint
import app.revanced.patches.youtube.general.components.fingerprints.SearchResultFingerprint
import app.revanced.patches.youtube.utils.fingerprints.AccountMenuParentFingerprint
import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE
import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH
import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.AccountSwitcherAccessibility
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.VoiceSearch
import app.revanced.patches.youtube.utils.settings.SettingsPatch
import app.revanced.patches.youtube.utils.toolbar.ToolBarHookPatch
import app.revanced.patches.youtube.utils.viewgroup.ViewGroupMarginLayoutParamsHookPatch
import app.revanced.util.getTargetIndex
import app.revanced.util.getTargetIndexWithMethodReferenceName
import app.revanced.util.getTargetIndexWithReference
import app.revanced.util.getTargetIndexWithReferenceReversed
import app.revanced.util.getWideLiteralInstructionIndex
import app.revanced.util.literalInstructionBooleanHook
import app.revanced.util.patch.BaseBytecodePatch
import app.revanced.util.resultOrThrow
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
@Suppress("unused")
@ -54,7 +39,6 @@ object LayoutComponentsPatch : BaseBytecodePatch(
LithoFilterPatch::class,
SettingsPatch::class,
SharedResourceIdPatch::class,
ToolBarHookPatch::class,
ViewGroupMarginLayoutParamsHookPatch::class
),
compatiblePackages = COMPATIBLE_PACKAGE,
@ -63,11 +47,7 @@ object LayoutComponentsPatch : BaseBytecodePatch(
AccountMenuParentFingerprint,
AccountSwitcherAccessibilityLabelFingerprint,
BottomUiContainerFingerprint,
CreateSearchSuggestionsFingerprint,
FloatingMicrophoneFingerprint,
SearchBarParentFingerprint,
SearchResultFingerprint,
TrendingSearchConfigFingerprint
FloatingMicrophoneFingerprint
)
) {
private const val CUSTOM_FILTER_CLASS_DESCRIPTOR =
@ -75,13 +55,6 @@ object LayoutComponentsPatch : BaseBytecodePatch(
private const val LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR =
"$COMPONENTS_PATH/LayoutComponentsFilter;"
private val ForceHideVoiceSearchButton by booleanPatchOption(
key = "ForceHideVoiceSearchButton",
default = false,
title = "Force hide voice search button",
description = "Hide voice search button with legacy method, button will always be hidden"
)
override fun execute(context: BytecodeContext) {
// region patch for hide account menu
@ -124,22 +97,6 @@ object LayoutComponentsPatch : BaseBytecodePatch(
// endregion
// region patch for hide cast button
val buttonClass = context.findClass("MediaRouteButton")
?: throw PatchException("MediaRouteButton class not found.")
buttonClass.mutableClass.methods.find { it.name == "setVisibility" }?.apply {
addInstructions(
0, """
invoke-static {p1}, $GENERAL_CLASS_DESCRIPTOR->hideCastButton(I)I
move-result p1
"""
)
} ?: throw PatchException("setVisibility method not found.")
// endregion
// region patch for hide floating microphone
FloatingMicrophoneFingerprint.resultOrThrow().let {
@ -178,39 +135,6 @@ object LayoutComponentsPatch : BaseBytecodePatch(
// endregion
// region patch for hide search term thumbnail
CreateSearchSuggestionsFingerprint.resultOrThrow().let { result ->
result.mutableMethod.apply {
val relativeIndex = getWideLiteralInstructionIndex(40)
val replaceIndex = getTargetIndexWithReferenceReversed(
relativeIndex,
"Landroid/widget/ImageView;->setVisibility(I)V"
) - 1
val jumpIndex = getTargetIndexWithReference(
relativeIndex,
"Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;"
) + 4
val replaceIndexInstruction = getInstruction<TwoRegisterInstruction>(replaceIndex)
val replaceIndexReference =
getInstruction<ReferenceInstruction>(replaceIndex).reference
addInstructionsWithLabels(
replaceIndex + 1, """
invoke-static { }, $GENERAL_CLASS_DESCRIPTOR->hideSearchTermThumbnail()Z
move-result v${replaceIndexInstruction.registerA}
if-nez v${replaceIndexInstruction.registerA}, :hidden
iget-object v${replaceIndexInstruction.registerA}, v${replaceIndexInstruction.registerB}, $replaceIndexReference
""", ExternalLabel("hidden", getInstruction(jumpIndex))
)
removeInstruction(replaceIndex)
}
}
// endregion
// region patch for hide snack bar
BottomUiContainerFingerprint.resultOrThrow().let {
@ -228,80 +152,6 @@ object LayoutComponentsPatch : BaseBytecodePatch(
// endregion
// region patch for hide toolbar button
ToolBarHookPatch.injectCall("$GENERAL_CLASS_DESCRIPTOR->hideToolBarButton")
// endregion
// region patch for hide trending searches
TrendingSearchConfigFingerprint.literalInstructionBooleanHook(
45399984,
"$GENERAL_CLASS_DESCRIPTOR->hideTrendingSearches(Z)Z"
)
// endregion
// region patch for hide voice search button
if (ForceHideVoiceSearchButton == true) {
SettingsPatch.contexts.patchXml(
arrayOf(
"action_bar_search_results_view_mic.xml",
"action_bar_search_view.xml",
"action_bar_search_view_grey.xml",
"action_bar_search_view_mic_out.xml"
),
arrayOf(
"height",
"marginEnd",
"marginStart",
"width"
)
)
} else {
SearchBarFingerprint.resolve(context, SearchBarParentFingerprint.resultOrThrow().classDef)
SearchBarFingerprint.resultOrThrow().let {
it.mutableMethod.apply {
val startIndex = it.scanResult.patternScanResult!!.startIndex
val setVisibilityIndex = getTargetIndexWithMethodReferenceName(startIndex, "setVisibility")
val setVisibilityInstruction = getInstruction<FiveRegisterInstruction>(setVisibilityIndex)
replaceInstruction(
setVisibilityIndex,
"invoke-static {v${setVisibilityInstruction.registerC}, v${setVisibilityInstruction.registerD}}, " +
"$GENERAL_CLASS_DESCRIPTOR->hideVoiceSearchButton(Landroid/view/View;I)V"
)
}
}
SearchResultFingerprint.resultOrThrow().let {
it.mutableMethod.apply {
val startIndex = getWideLiteralInstructionIndex(VoiceSearch)
val setOnClickListenerIndex = getTargetIndexWithMethodReferenceName(startIndex, "setOnClickListener")
val viewRegister = getInstruction<FiveRegisterInstruction>(setOnClickListenerIndex).registerC
addInstruction(
setOnClickListenerIndex + 1,
"invoke-static {v$viewRegister}, $GENERAL_CLASS_DESCRIPTOR->hideVoiceSearchButton(Landroid/view/View;)V"
)
}
}
/**
* Add settings
*/
SettingsPatch.addPreference(
arrayOf(
"SETTINGS: HIDE_VOICE_SEARCH_BUTTON"
)
)
}
// endregion
LithoFilterPatch.addFilter(CUSTOM_FILTER_CLASS_DESCRIPTOR)
LithoFilterPatch.addFilter(LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR)

View File

@ -0,0 +1,259 @@
package app.revanced.patches.youtube.general.toolbar
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.booleanPatchOption
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patcher.util.smali.ExternalLabel
import app.revanced.patches.shared.voicesearch.VoiceSearchUtils.patchXml
import app.revanced.patches.youtube.general.toolbar.fingerprints.CreateSearchSuggestionsFingerprint
import app.revanced.patches.youtube.general.toolbar.fingerprints.SearchBarFingerprint
import app.revanced.patches.youtube.general.toolbar.fingerprints.SearchBarParentFingerprint
import app.revanced.patches.youtube.general.toolbar.fingerprints.SearchResultFingerprint
import app.revanced.patches.youtube.general.toolbar.fingerprints.SetActionBarRingoFingerprint
import app.revanced.patches.youtube.general.toolbar.fingerprints.SetWordMarkHeaderFingerprint
import app.revanced.patches.youtube.general.toolbar.fingerprints.TrendingSearchConfigFingerprint
import app.revanced.patches.youtube.general.toolbar.fingerprints.YouActionBarFingerprint
import app.revanced.patches.youtube.utils.castbutton.CastButtonPatch
import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE
import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.VoiceSearch
import app.revanced.patches.youtube.utils.settings.SettingsPatch
import app.revanced.patches.youtube.utils.settings.SettingsPatch.contexts
import app.revanced.patches.youtube.utils.toolbar.ToolBarHookPatch
import app.revanced.util.getTargetIndexWithMethodReferenceName
import app.revanced.util.getTargetIndexWithReference
import app.revanced.util.getTargetIndexWithReferenceReversed
import app.revanced.util.getWalkerMethod
import app.revanced.util.getWideLiteralInstructionIndex
import app.revanced.util.literalInstructionBooleanHook
import app.revanced.util.patch.BaseBytecodePatch
import app.revanced.util.resultOrThrow
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
@Suppress("DEPRECATION", "unused")
object ToolBarComponentsPatch : BaseBytecodePatch(
name = "Toolbar components",
description = "Adds options to hide or change components located on the toolbar such as toolbar buttons, search bar, and header.",
dependencies = setOf(
CastButtonPatch::class,
SettingsPatch::class,
SharedResourceIdPatch::class,
ToolBarHookPatch::class
),
compatiblePackages = COMPATIBLE_PACKAGE,
fingerprints = setOf(
CreateSearchSuggestionsFingerprint,
SearchBarParentFingerprint,
SearchResultFingerprint,
SetActionBarRingoFingerprint,
SetWordMarkHeaderFingerprint,
TrendingSearchConfigFingerprint
)
) {
private const val FLAG = "android:paddingStart"
private const val TARGET_RESOURCE_PATH = "res/layout/action_bar_ringo_background.xml"
private val ForceHideVoiceSearchButton by booleanPatchOption(
key = "ForceHideVoiceSearchButton",
default = false,
title = "Force hide voice search button",
description = "Hide voice search button with legacy method, button will always be hidden"
)
override fun execute(context: BytecodeContext) {
// region patch for enable wide search bar
val parentClassDef = SetActionBarRingoFingerprint.resultOrThrow().classDef
YouActionBarFingerprint.resolve(context, parentClassDef)
SetWordMarkHeaderFingerprint.resultOrThrow().let {
val walkerMethod = it.getWalkerMethod(context, it.scanResult.patternScanResult!!.startIndex + 1)
walkerMethod.apply {
injectSearchBarHook(
implementation!!.instructions.size - 1,
"enableWideSearchBar"
)
}
}
YouActionBarFingerprint.resultOrThrow().let {
it.mutableMethod.apply {
injectSearchBarHook(
it.scanResult.patternScanResult!!.endIndex,
"enableWideSearchBarInYouTab"
)
}
}
contexts.xmlEditor[TARGET_RESOURCE_PATH].use { editor ->
val document = editor.file
with(document.getElementsByTagName("RelativeLayout").item(0)) {
if (attributes.getNamedItem(FLAG) != null) return@with
document.createAttribute(FLAG)
.apply { value = "8.0dip" }
.let(attributes::setNamedItem)
}
}
// endregion
// region patch for hide cast button
CastButtonPatch.hookToolBarButton(context)
// endregion
// region patch for hide create button
ToolBarHookPatch.hook("$GENERAL_CLASS_DESCRIPTOR->hideCreateButton")
// endregion
// region patch for hide notification button
ToolBarHookPatch.hook("$GENERAL_CLASS_DESCRIPTOR->hideNotificationButton")
// endregion
// region patch for hide search term thumbnail
CreateSearchSuggestionsFingerprint.resultOrThrow().let { result ->
result.mutableMethod.apply {
val relativeIndex = getWideLiteralInstructionIndex(40)
val replaceIndex = getTargetIndexWithReferenceReversed(
relativeIndex,
"Landroid/widget/ImageView;->setVisibility(I)V"
) - 1
val jumpIndex = getTargetIndexWithReference(
relativeIndex,
"Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;"
) + 4
val replaceIndexInstruction = getInstruction<TwoRegisterInstruction>(replaceIndex)
val replaceIndexReference =
getInstruction<ReferenceInstruction>(replaceIndex).reference
addInstructionsWithLabels(
replaceIndex + 1, """
invoke-static { }, $GENERAL_CLASS_DESCRIPTOR->hideSearchTermThumbnail()Z
move-result v${replaceIndexInstruction.registerA}
if-nez v${replaceIndexInstruction.registerA}, :hidden
iget-object v${replaceIndexInstruction.registerA}, v${replaceIndexInstruction.registerB}, $replaceIndexReference
""", ExternalLabel("hidden", getInstruction(jumpIndex))
)
removeInstruction(replaceIndex)
}
}
// endregion
// region patch for hide trending searches
TrendingSearchConfigFingerprint.literalInstructionBooleanHook(
45399984,
"$GENERAL_CLASS_DESCRIPTOR->hideTrendingSearches(Z)Z"
)
// endregion
// region patch for hide voice search button
if (ForceHideVoiceSearchButton == true) {
contexts.patchXml(
arrayOf(
"action_bar_search_results_view_mic.xml",
"action_bar_search_view.xml",
"action_bar_search_view_grey.xml",
"action_bar_search_view_mic_out.xml"
),
arrayOf(
"height",
"marginEnd",
"marginStart",
"width"
)
)
} else {
SearchBarFingerprint.resolve(context, SearchBarParentFingerprint.resultOrThrow().classDef)
SearchBarFingerprint.resultOrThrow().let {
it.mutableMethod.apply {
val startIndex = it.scanResult.patternScanResult!!.startIndex
val setVisibilityIndex = getTargetIndexWithMethodReferenceName(startIndex, "setVisibility")
val setVisibilityInstruction = getInstruction<FiveRegisterInstruction>(setVisibilityIndex)
replaceInstruction(
setVisibilityIndex,
"invoke-static {v${setVisibilityInstruction.registerC}, v${setVisibilityInstruction.registerD}}, " +
"$GENERAL_CLASS_DESCRIPTOR->hideVoiceSearchButton(Landroid/view/View;I)V"
)
}
}
SearchResultFingerprint.resultOrThrow().let {
it.mutableMethod.apply {
val startIndex = getWideLiteralInstructionIndex(VoiceSearch)
val setOnClickListenerIndex = getTargetIndexWithMethodReferenceName(startIndex, "setOnClickListener")
val viewRegister = getInstruction<FiveRegisterInstruction>(setOnClickListenerIndex).registerC
addInstruction(
setOnClickListenerIndex + 1,
"invoke-static {v$viewRegister}, $GENERAL_CLASS_DESCRIPTOR->hideVoiceSearchButton(Landroid/view/View;)V"
)
}
}
/**
* Add settings
*/
SettingsPatch.addPreference(
arrayOf(
"SETTINGS: HIDE_VOICE_SEARCH_BUTTON"
)
)
}
// endregion
/**
* Add settings
*/
SettingsPatch.addPreference(
arrayOf(
"PREFERENCE_SCREEN: GENERAL",
"SETTINGS: TOOLBAR_COMPONENTS"
)
)
SettingsPatch.updatePatchStatus(this)
}
private fun MutableMethod.injectSearchBarHook(
insertIndex: Int,
descriptor: String
) {
val insertRegister = getInstruction<OneRegisterInstruction>(insertIndex).registerA
addInstructions(
insertIndex, """
invoke-static {v$insertRegister}, $GENERAL_CLASS_DESCRIPTOR->$descriptor(Z)Z
move-result v$insertRegister
"""
)
}
}

View File

@ -1,4 +1,4 @@
package app.revanced.patches.youtube.general.components.fingerprints
package app.revanced.patches.youtube.general.toolbar.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint

View File

@ -1,4 +1,4 @@
package app.revanced.patches.youtube.general.components.fingerprints
package app.revanced.patches.youtube.general.toolbar.fingerprints
import app.revanced.util.fingerprint.MethodReferenceNameFingerprint
import com.android.tools.smali.dexlib2.Opcode

View File

@ -1,4 +1,4 @@
package app.revanced.patches.youtube.general.components.fingerprints
package app.revanced.patches.youtube.general.toolbar.fingerprints
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.VoiceSearch
import app.revanced.util.fingerprint.LiteralValueFingerprint

View File

@ -1,4 +1,4 @@
package app.revanced.patches.youtube.general.components.fingerprints
package app.revanced.patches.youtube.general.toolbar.fingerprints
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.VoiceSearch
import app.revanced.util.fingerprint.LiteralValueFingerprint

View File

@ -1,4 +1,4 @@
package app.revanced.patches.youtube.general.widesearchbar.fingerprints
package app.revanced.patches.youtube.general.toolbar.fingerprints
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ActionBarRingo
import app.revanced.util.fingerprint.LiteralValueFingerprint

View File

@ -1,4 +1,4 @@
package app.revanced.patches.youtube.general.widesearchbar.fingerprints
package app.revanced.patches.youtube.general.toolbar.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint

View File

@ -1,4 +1,4 @@
package app.revanced.patches.youtube.general.components.fingerprints
package app.revanced.patches.youtube.general.toolbar.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.util.fingerprint.LiteralValueFingerprint

View File

@ -1,4 +1,4 @@
package app.revanced.patches.youtube.general.widesearchbar.fingerprints
package app.revanced.patches.youtube.general.toolbar.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint

View File

@ -1,108 +0,0 @@
package app.revanced.patches.youtube.general.widesearchbar
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.youtube.general.widesearchbar.fingerprints.SetActionBarRingoFingerprint
import app.revanced.patches.youtube.general.widesearchbar.fingerprints.SetWordMarkHeaderFingerprint
import app.revanced.patches.youtube.general.widesearchbar.fingerprints.YouActionBarFingerprint
import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE
import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch
import app.revanced.patches.youtube.utils.settings.SettingsPatch
import app.revanced.patches.youtube.utils.settings.SettingsPatch.contexts
import app.revanced.util.getWalkerMethod
import app.revanced.util.patch.BaseBytecodePatch
import app.revanced.util.resultOrThrow
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
@Suppress("DEPRECATION", "unused")
object WideSearchBarPatch : BaseBytecodePatch(
name = "Enable wide search bar",
description = "Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.",
dependencies = setOf(
SettingsPatch::class,
SharedResourceIdPatch::class
),
compatiblePackages = COMPATIBLE_PACKAGE,
fingerprints = setOf(
SetActionBarRingoFingerprint,
SetWordMarkHeaderFingerprint
)
) {
private const val FLAG = "android:paddingStart"
private const val TARGET_RESOURCE_PATH = "res/layout/action_bar_ringo_background.xml"
override fun execute(context: BytecodeContext) {
// resolves fingerprints
val parentClassDef = SetActionBarRingoFingerprint.resultOrThrow().classDef
YouActionBarFingerprint.resolve(context, parentClassDef)
// patch methods
SetWordMarkHeaderFingerprint.resultOrThrow().let {
val walkerMethod = it.getWalkerMethod(context, it.scanResult.patternScanResult!!.startIndex + 1)
walkerMethod.apply {
injectSearchBarHook(
implementation!!.instructions.size - 1,
"enableWideSearchBar"
)
}
}
YouActionBarFingerprint.resultOrThrow().let {
it.mutableMethod.apply {
injectSearchBarHook(
it.scanResult.patternScanResult!!.endIndex,
"enableWideSearchBarInYouTab"
)
}
}
/**
* Set Wide SearchBar Start Margin
*/
contexts.xmlEditor[TARGET_RESOURCE_PATH].use { editor ->
val document = editor.file
with(document.getElementsByTagName("RelativeLayout").item(0)) {
if (attributes.getNamedItem(FLAG) != null) return@with
document.createAttribute(FLAG)
.apply { value = "8.0dip" }
.let(attributes::setNamedItem)
}
}
/**
* Add settings
*/
SettingsPatch.addPreference(
arrayOf(
"PREFERENCE_SCREEN: GENERAL",
"SETTINGS: ENABLE_WIDE_SEARCH_BAR"
)
)
SettingsPatch.updatePatchStatus(this)
}
/**
* Injects instructions required for certain methods.
*/
private fun MutableMethod.injectSearchBarHook(
insertIndex: Int,
descriptor: String
) {
val insertRegister = getInstruction<OneRegisterInstruction>(insertIndex).registerA
addInstructions(
insertIndex, """
invoke-static {v$insertRegister}, $GENERAL_CLASS_DESCRIPTOR->$descriptor(Z)Z
move-result v$insertRegister
"""
)
}
}

View File

@ -13,6 +13,7 @@ import app.revanced.patches.youtube.player.buttons.fingerprints.MusicAppDeeplink
import app.revanced.patches.youtube.player.buttons.fingerprints.PlayerControlsVisibilityModelFingerprint
import app.revanced.patches.youtube.player.buttons.fingerprints.TitleAnchorFingerprint
import app.revanced.patches.youtube.player.buttons.fingerprints.YouTubeControlsOverlaySubtitleButtonFingerprint
import app.revanced.patches.youtube.utils.castbutton.CastButtonPatch
import app.revanced.patches.youtube.utils.fingerprints.LayoutConstructorFingerprint
import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE
import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR
@ -36,6 +37,7 @@ object PlayerButtonsPatch : BaseBytecodePatch(
name = "Hide player buttons",
description = "Adds an option to hide buttons in the video player.",
dependencies = setOf(
CastButtonPatch::class,
SettingsPatch::class,
SharedResourceIdPatch::class
),
@ -111,6 +113,12 @@ object PlayerButtonsPatch : BaseBytecodePatch(
// endregion
// region patch for hide cast button
CastButtonPatch.hookPlayerButton(context)
// endregion
// region patch for hide collapse button
TitleAnchorFingerprint.resultOrThrow().mutableMethod.apply {

View File

@ -23,8 +23,8 @@ import app.revanced.patches.youtube.utils.fingerprints.LayoutConstructorFingerpr
import app.revanced.patches.youtube.utils.fingerprints.YouTubeControlsOverlayFingerprint
import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE
import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH
import app.revanced.patches.youtube.utils.integrations.Constants.PATCH_STATUS_CLASS_DESCRIPTOR
import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR
import app.revanced.patches.youtube.utils.integrations.Constants.UTILS_PATH
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.AutoNavPreviewStub
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.FullScreenEngagementPanel
@ -168,7 +168,7 @@ object FullscreenComponentsPatch : BaseBytecodePatch(
}
}
context.updatePatchStatus("$UTILS_PATH/PatchStatus;", "QuickActions")
context.updatePatchStatus(PATCH_STATUS_CLASS_DESCRIPTOR, "QuickActions")
// endregion

View File

@ -10,7 +10,7 @@ import app.revanced.patcher.util.smali.ExternalLabel
import app.revanced.patches.youtube.player.overlaybuttons.fingerprints.OfflineVideoEndpointFingerprint
import app.revanced.patches.youtube.player.overlaybuttons.fingerprints.PiPPlaybackFingerprint
import app.revanced.patches.youtube.utils.integrations.Constants.INTEGRATIONS_PATH
import app.revanced.patches.youtube.utils.integrations.Constants.UTILS_PATH
import app.revanced.patches.youtube.utils.integrations.Constants.PATCH_STATUS_CLASS_DESCRIPTOR
import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch
import app.revanced.util.resultOrThrow
import app.revanced.util.updatePatchStatus
@ -52,7 +52,7 @@ object OverlayButtonsBytecodePatch : BytecodePatch(
}
}
context.updatePatchStatus("$UTILS_PATH/PatchStatus;", "OverlayButtons")
context.updatePatchStatus(PATCH_STATUS_CLASS_DESCRIPTOR, "OverlayButtons")
}
}

View File

@ -0,0 +1,101 @@
package app.revanced.patches.youtube.utils.castbutton
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchException
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.youtube.utils.castbutton.fingerprints.MenuItemInitializeFingerprint
import app.revanced.patches.youtube.utils.castbutton.fingerprints.MenuItemVisibilityFingerprint
import app.revanced.patches.youtube.utils.castbutton.fingerprints.PlayerButtonFingerprint
import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR
import app.revanced.patches.youtube.utils.integrations.Constants.PATCH_STATUS_CLASS_DESCRIPTOR
import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR
import app.revanced.patches.youtube.utils.integrations.Constants.UTILS_PATH
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch
import app.revanced.util.getTargetIndexWithMethodReferenceName
import app.revanced.util.resultOrThrow
import app.revanced.util.updatePatchStatus
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
@Patch(dependencies = [SharedResourceIdPatch::class])
object CastButtonPatch : BytecodePatch(
setOf(
MenuItemInitializeFingerprint,
PlayerButtonFingerprint
)
) {
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
"$UTILS_PATH/CastButtonPatch;"
private lateinit var playerButtonMethod: MutableMethod
private lateinit var toolbarMenuItemInitializeMethod: MutableMethod
private lateinit var toolbarMenuItemVisibilityMethod: MutableMethod
override fun execute(context: BytecodeContext) {
val toolbarMenuItemInitializeResult = MenuItemInitializeFingerprint.resultOrThrow()
MenuItemVisibilityFingerprint.resolve(context, toolbarMenuItemInitializeResult.classDef)
toolbarMenuItemInitializeMethod = toolbarMenuItemInitializeResult.mutableMethod
toolbarMenuItemVisibilityMethod = MenuItemVisibilityFingerprint.resultOrThrow().mutableMethod
playerButtonMethod = PlayerButtonFingerprint.resultOrThrow().mutableMethod
val buttonClass = context.findClass("MediaRouteButton")
?: throw PatchException("MediaRouteButton class not found.")
buttonClass.mutableClass.methods.find { it.name == "setVisibility" }?.apply {
addInstructions(
0, """
invoke-static {p1}, $INTEGRATIONS_CLASS_DESCRIPTOR->hideCastButton(I)I
move-result p1
"""
)
} ?: throw PatchException("setVisibility method not found.")
}
internal fun hookPlayerButton(context: BytecodeContext) {
playerButtonMethod.apply {
val index = getTargetIndexWithMethodReferenceName("setVisibility")
val instruction = getInstruction<FiveRegisterInstruction>(index)
val viewRegister = instruction.registerC
val visibilityRegister = instruction.registerD
val reference = getInstruction<ReferenceInstruction>(index).reference
addInstructions(
index + 1, """
invoke-static {v$visibilityRegister}, $PLAYER_CLASS_DESCRIPTOR->hideCastButton(I)I
move-result v$visibilityRegister
invoke-virtual {v$viewRegister, v$visibilityRegister}, $reference
"""
)
removeInstruction(index)
}
context.updatePatchStatus(PATCH_STATUS_CLASS_DESCRIPTOR, "PlayerButtons")
}
internal fun hookToolBarButton(context: BytecodeContext) {
toolbarMenuItemInitializeMethod.apply {
val index = getTargetIndexWithMethodReferenceName("setShowAsAction") + 1
addInstruction(
index,
"invoke-static {p1}, $GENERAL_CLASS_DESCRIPTOR->hideCastButton(Landroid/view/MenuItem;)V"
)
}
toolbarMenuItemVisibilityMethod.addInstructions(
0, """
invoke-static {p1}, $GENERAL_CLASS_DESCRIPTOR->hideCastButton(Z)Z
move-result p1
"""
)
context.updatePatchStatus(PATCH_STATUS_CLASS_DESCRIPTOR, "ToolBarComponents")
}
}

View File

@ -0,0 +1,13 @@
package app.revanced.patches.youtube.utils.castbutton.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.CastMediaRouteButton
import app.revanced.util.fingerprint.LiteralValueFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
internal object MenuItemInitializeFingerprint : LiteralValueFingerprint(
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = listOf("Landroid/view/MenuItem;"),
returnType = "V",
literalSupplier = { CastMediaRouteButton }
)

View File

@ -0,0 +1,12 @@
package app.revanced.patches.youtube.utils.castbutton.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.util.fingerprint.MethodReferenceNameFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
internal object MenuItemVisibilityFingerprint : MethodReferenceNameFingerprint(
returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = listOf("Z"),
reference = { "setVisible" }
)

View File

@ -0,0 +1,12 @@
package app.revanced.patches.youtube.utils.castbutton.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.util.fingerprint.LiteralValueFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
internal object PlayerButtonFingerprint : LiteralValueFingerprint(
accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL,
parameters = emptyList(),
returnType = "V",
literalSupplier = { 11208 }
)

View File

@ -28,6 +28,8 @@ object Constants {
const val PLAYER_CLASS_DESCRIPTOR = "$PLAYER_PATH/PlayerPatch;"
const val SHORTS_CLASS_DESCRIPTOR = "$SHORTS_PATH/ShortsPatch;"
const val PATCH_STATUS_CLASS_DESCRIPTOR = "$UTILS_PATH/PatchStatus;"
val COMPATIBLE_PACKAGE = setOf(
Patch.CompatiblePackage(
"com.google.android.youtube",

View File

@ -30,6 +30,7 @@ object SharedResourceIdPatch : ResourcePatch() {
var BarContainerHeight = -1L
var BottomSheetFooterText = -1L
var BottomUiContainerStub = -1L
var CastMediaRouteButton = -1L
var ChannelListSubMenu = -1L
var CompactLink = -1L
var CompactListItem = -1L
@ -103,6 +104,7 @@ object SharedResourceIdPatch : ResourcePatch() {
BarContainerHeight = getId(DIMEN, "bar_container_height")
BottomSheetFooterText = getId(ID, "bottom_sheet_footer_text")
BottomUiContainerStub = getId(ID, "bottom_ui_container_stub")
CastMediaRouteButton = getId(LAYOUT, "castmediaroutebutton")
ChannelListSubMenu = getId(LAYOUT, "channel_list_sub_menu")
CompactLink = getId(LAYOUT, "compact_link")
CompactListItem = getId(LAYOUT, "compact_list_item")

View File

@ -23,6 +23,11 @@ object ToolBarHookPatch : BytecodePatch(
ToolBarPatchFingerprint
)
) {
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
"$UTILS_PATH/ToolBarPatch;"
private lateinit var toolbarMethod: MutableMethod
override fun execute(context: BytecodeContext) {
ToolBarButtonFingerprint.resultOrThrow().let {
@ -51,18 +56,13 @@ object ToolBarHookPatch : BytecodePatch(
}
}
insertMethod = ToolBarPatchFingerprint.resultOrThrow().mutableMethod
toolbarMethod = ToolBarPatchFingerprint.resultOrThrow().mutableMethod
}
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
"$UTILS_PATH/ToolBarPatch;"
private lateinit var insertMethod: MutableMethod
internal fun injectCall(
internal fun hook(
descriptor: String
) {
insertMethod.addInstructions(
toolbarMethod.addInstructions(
0,
"invoke-static {p0, p1}, $descriptor(Ljava/lang/String;Landroid/view/View;)V"
)

View File

@ -14,7 +14,7 @@ import app.revanced.patches.youtube.utils.fix.shortsplayback.ShortsPlaybackPatch
import app.revanced.patches.youtube.utils.flyoutpanel.PlaybackSpeedFlyoutPanelHookPatch
import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE
import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH
import app.revanced.patches.youtube.utils.integrations.Constants.UTILS_PATH
import app.revanced.patches.youtube.utils.integrations.Constants.PATCH_STATUS_CLASS_DESCRIPTOR
import app.revanced.patches.youtube.utils.integrations.Constants.VIDEO_PATH
import app.revanced.patches.youtube.utils.playertype.PlayerTypeHookPatch
import app.revanced.patches.youtube.utils.recyclerview.BottomSheetRecyclerViewPatch
@ -165,7 +165,7 @@ object VideoPlaybackPatch : BaseBytecodePatch(
VideoInformationPatch.cpnHook("$INTEGRATIONS_PLAYBACK_SPEED_CLASS_DESCRIPTOR->newVideoStarted(Ljava/lang/String;Z)V")
context.updatePatchStatus("$UTILS_PATH/PatchStatus;", "RememberPlaybackSpeed")
context.updatePatchStatus(PATCH_STATUS_CLASS_DESCRIPTOR, "RememberPlaybackSpeed")
// endregion

View File

@ -274,38 +274,15 @@ Limitations:
<string name="revanced_enable_tablet_mini_player_title">Enable tablet mini player</string>
<string name="revanced_enable_tablet_mini_player_summary_on">Tablet mini player is enabled.</string>
<string name="revanced_enable_tablet_mini_player_summary_off">Tablet mini player is disabled.</string>
<string name="revanced_enable_wide_search_bar_title">Enable wide search bar</string>
<string name="revanced_enable_wide_search_bar_summary_on">Wide search bar is enabled.</string>
<string name="revanced_enable_wide_search_bar_summary_off">Wide search bar is disabled.</string>
<string name="revanced_enable_wide_search_bar_in_you_tab_title">Enable wide search bar in You tab</string>
<string name="revanced_enable_wide_search_bar_in_you_tab_summary">"Enabling this setting will disable the settings button in the You tab.
In this case, please use the following path:
You tab > View channel > Menu > Settings."</string>
<string name="revanced_hide_cast_button_title">Hide cast button</string>
<string name="revanced_hide_cast_button_summary_on">Cast button is hidden.</string>
<string name="revanced_hide_cast_button_summary_off">Cast button is shown.</string>
<string name="revanced_hide_floating_microphone_title">Hide floating microphone button</string>
<string name="revanced_hide_floating_microphone_summary_on">Floating microphone button is hidden.</string>
<string name="revanced_hide_floating_microphone_summary_off">Floating microphone button is shown.</string>
<string name="revanced_hide_gray_separator_title">Hide gray separator</string>
<string name="revanced_hide_gray_separator_summary_on">Gray separators are hidden.</string>
<string name="revanced_hide_gray_separator_summary_off">Gray separators are shown.</string>
<string name="revanced_hide_search_term_thumbnail_title">Hide search term thumbnail</string>
<string name="revanced_hide_search_term_thumbnail_summary_on">Thumbnails in the search term history are hidden.</string>
<string name="revanced_hide_search_term_thumbnail_summary_off">Thumbnails in the search term history are shown.</string>
<string name="revanced_hide_snack_bar_title">Hide snack bar</string>
<string name="revanced_hide_snack_bar_summary_on">Snack bar is hidden.</string>
<string name="revanced_hide_snack_bar_summary_off">Snack bar is shown.</string>
<string name="revanced_hide_toolbar_create_notification_button_title">Hide buttons in toolbar</string>
<string name="revanced_hide_toolbar_create_notification_button_summary_on">Create and Notification buttons are hidden.</string>
<string name="revanced_hide_toolbar_create_notification_button_summary_off">Create and Notification buttons are shown.</string>
<string name="revanced_hide_trending_searches_title">Hide trending searches</string>
<string name="revanced_hide_trending_searches_summary_on">Trending searches are hidden.</string>
<string name="revanced_hide_trending_searches_summary_off">Trending searches are shown.</string>
<string name="revanced_hide_voice_search_button_title">Hide voice search button</string>
<string name="revanced_hide_voice_search_button_summary_on">Voice search button is hidden in search bar.</string>
<string name="revanced_hide_voice_search_button_summary_off">Voice search button is shown in search bar.</string>
<string name="revanced_remove_viewer_discretion_dialog_title">Remove viewer discretion dialog</string>
<string name="revanced_remove_viewer_discretion_dialog_summary">"Remove viewer discretion dialog.
This does not bypass the age restriction. It just accepts it automatically."</string>
@ -361,27 +338,27 @@ Some components may not be hidden."</string>
<string name="revanced_enable_narrow_navigation_buttons_title">Enable narrow navigation buttons</string>
<string name="revanced_enable_narrow_navigation_buttons_summary_on">Spacing between navigation buttons becomes narrower.</string>
<string name="revanced_enable_narrow_navigation_buttons_summary_off">Spacing between navigation buttons does not become narrower.</string>
<string name="revanced_hide_create_button_title">Hide create button</string>
<string name="revanced_hide_create_button_summary_on">Create button is hidden.</string>
<string name="revanced_hide_create_button_summary_off">Create button is shown.</string>
<string name="revanced_hide_home_button_title">Hide home button</string>
<string name="revanced_hide_home_button_summary_off">Home button is shown.</string>
<string name="revanced_hide_home_button_summary_on">Home button is hidden.</string>
<string name="revanced_hide_library_button_title">Hide library button</string>
<string name="revanced_hide_library_button_summary_on">Library button is hidden.</string>
<string name="revanced_hide_library_button_summary_off">Library button is shown.</string>
<string name="revanced_hide_navigation_create_button_title">Hide create button</string>
<string name="revanced_hide_navigation_create_button_summary_on">Create button is hidden.</string>
<string name="revanced_hide_navigation_create_button_summary_off">Create button is shown.</string>
<string name="revanced_hide_navigation_home_button_title">Hide home button</string>
<string name="revanced_hide_navigation_home_button_summary_off">Home button is shown.</string>
<string name="revanced_hide_navigation_home_button_summary_on">Home button is hidden.</string>
<string name="revanced_hide_navigation_library_button_title">Hide library button</string>
<string name="revanced_hide_navigation_library_button_summary_on">Library button is hidden.</string>
<string name="revanced_hide_navigation_library_button_summary_off">Library button is shown.</string>
<string name="revanced_hide_navigation_notifications_button_title">Hide notifications button</string>
<string name="revanced_hide_navigation_notifications_button_summary_on">Notifications button is hidden.</string>
<string name="revanced_hide_navigation_notifications_button_summary_off">Notifications button is shown.</string>
<string name="revanced_hide_navigation_shorts_button_title">Hide shorts button</string>
<string name="revanced_hide_navigation_shorts_button_summary_on">Shorts button is hidden.</string>
<string name="revanced_hide_navigation_shorts_button_summary_off">Shorts button is shown.</string>
<string name="revanced_hide_navigation_subscriptions_button_title">Hide subscriptions button</string>
<string name="revanced_hide_navigation_subscriptions_button_summary_on">Subscriptions button is hidden.</string>
<string name="revanced_hide_navigation_subscriptions_button_summary_off">Subscriptions button is shown.</string>
<string name="revanced_hide_navigation_label_title">Hide navigation label</string>
<string name="revanced_hide_navigation_label_summary_on">Navigation label is hidden.</string>
<string name="revanced_hide_navigation_label_summary_off">Navigation label is shown.</string>
<string name="revanced_hide_notifications_button_title">Hide notifications button</string>
<string name="revanced_hide_notifications_button_summary_on">Notifications button is hidden.</string>
<string name="revanced_hide_notifications_button_summary_off">Notifications button is shown.</string>
<string name="revanced_hide_shorts_button_title">Hide shorts button</string>
<string name="revanced_hide_shorts_button_summary_on">Shorts button is hidden.</string>
<string name="revanced_hide_shorts_button_summary_off">Shorts button is shown.</string>
<string name="revanced_hide_subscriptions_button_title">Hide subscriptions button</string>
<string name="revanced_hide_subscriptions_button_summary_on">Subscriptions button is hidden.</string>
<string name="revanced_hide_subscriptions_button_summary_off">Subscriptions button is shown.</string>
<string name="revanced_switch_create_with_notifications_button_title">Switch create with notifications</string>
<string name="revanced_switch_create_with_notifications_button_summary">"Switch the positions of the create button and notification button by spoofing device information.
@ -389,6 +366,38 @@ Some components may not be hidden."</string>
• Disabling this setting loads more ads from the server side.
• You should disable this setting to make video ads visible."</string>
<!-- PreferenceScreen: General, PreferenceCategory: General, PreferenceScreen: Toolbar -->
<string name="revanced_preference_screen_toolbar_title">Toolbar</string>
<string name="revanced_preference_screen_toolbar_summary">Hide or change components located on the toolbar such as toolbar buttons, search bar, header.</string>
<string name="revanced_enable_wide_search_bar_title">Enable wide search bar</string>
<string name="revanced_enable_wide_search_bar_summary_on">Wide search bar is enabled.</string>
<string name="revanced_enable_wide_search_bar_summary_off">Wide search bar is disabled.</string>
<string name="revanced_enable_wide_search_bar_in_you_tab_title">Enable wide search bar in You tab</string>
<string name="revanced_enable_wide_search_bar_in_you_tab_summary">"Enabling this setting will disable the settings button in the You tab.
In this case, please use the following path:
You tab > View channel > Menu > Settings."</string>
<string name="revanced_hide_toolbar_cast_button_title">Hide cast button</string>
<string name="revanced_hide_toolbar_cast_button_summary_on">Cast button is hidden.</string>
<string name="revanced_hide_toolbar_cast_button_summary_off">Cast button is shown.</string>
<string name="revanced_hide_toolbar_create_button_title">Hide create button</string>
<string name="revanced_hide_toolbar_create_button_summary_on">Create button is hidden.</string>
<string name="revanced_hide_toolbar_create_button_summary_off">Create button is shown.</string>
<string name="revanced_hide_toolbar_notification_button_title">Hide notification button</string>
<string name="revanced_hide_toolbar_notification_button_summary_on">Notification button is hidden.</string>
<string name="revanced_hide_toolbar_notification_button_summary_off">Notification button is shown.</string>
<string name="revanced_hide_search_term_thumbnail_title">Hide search term thumbnail</string>
<string name="revanced_hide_search_term_thumbnail_summary_on">Thumbnails in the search term history are hidden.</string>
<string name="revanced_hide_search_term_thumbnail_summary_off">Thumbnails in the search term history are shown.</string>
<string name="revanced_hide_trending_searches_title">Hide trending searches</string>
<string name="revanced_hide_trending_searches_summary_on">Trending searches are hidden.</string>
<string name="revanced_hide_trending_searches_summary_off">Trending searches are shown.</string>
<string name="revanced_hide_voice_search_button_title">Hide voice search button</string>
<string name="revanced_hide_voice_search_button_summary_on">Voice search button is hidden in search bar.</string>
<string name="revanced_hide_voice_search_button_summary_off">Voice search button is shown in search bar.</string>
<!-- PreferenceScreen: Player -->
<string name="revanced_preference_screen_player_title">Player</string>
@ -690,24 +699,27 @@ Limitation: Video title disappears when clicked."</string>
<string name="revanced_preference_screen_player_buttons_title">Player buttons</string>
<string name="revanced_preference_screen_player_buttons_summary">Hide or show buttons in videos.</string>
<string name="revanced_hide_autoplay_button_title">Hide autoplay button</string>
<string name="revanced_hide_autoplay_button_summary_on">Autoplay button is hidden.</string>
<string name="revanced_hide_autoplay_button_summary_off">Autoplay button is shown.</string>
<string name="revanced_hide_captions_button_title">Hide captions button</string>
<string name="revanced_hide_captions_button_summary_on">Captions button is hidden.</string>
<string name="revanced_hide_captions_button_summary_off">Captions button is shown.</string>
<string name="revanced_hide_collapse_button_title">Hide collapse button</string>
<string name="revanced_hide_collapse_button_summary_on">Collapse button is hidden.</string>
<string name="revanced_hide_collapse_button_summary_off">Collapse button is shown.</string>
<string name="revanced_hide_fullscreen_button_title">Hide fullscreen button</string>
<string name="revanced_hide_fullscreen_button_summary_on">Fullscreen button is hidden.</string>
<string name="revanced_hide_fullscreen_button_summary_off">Fullscreen button is shown.</string>
<string name="revanced_hide_previous_next_button_title">Hide previous &amp; next button</string>
<string name="revanced_hide_previous_next_button_summary_on">Buttons are hidden.</string>
<string name="revanced_hide_previous_next_button_summary_off">Buttons are shown.</string>
<string name="revanced_hide_youtube_music_button_title">Hide YouTube Music button</string>
<string name="revanced_hide_youtube_music_button_summary_on">YouTube Music button is hidden.</string>
<string name="revanced_hide_youtube_music_button_summary_off">YouTube Music button is shown.</string>
<string name="revanced_hide_player_autoplay_button_title">Hide autoplay button</string>
<string name="revanced_hide_player_autoplay_button_summary_on">Autoplay button is hidden.</string>
<string name="revanced_hide_player_autoplay_button_summary_off">Autoplay button is shown.</string>
<string name="revanced_hide_player_captions_button_title">Hide captions button</string>
<string name="revanced_hide_player_captions_button_summary_on">Captions button is hidden.</string>
<string name="revanced_hide_player_captions_button_summary_off">Captions button is shown.</string>
<string name="revanced_hide_player_cast_button_title">Hide cast button</string>
<string name="revanced_hide_player_cast_button_summary_on">Cast button is hidden.</string>
<string name="revanced_hide_player_cast_button_summary_off">Cast button is shown.</string>
<string name="revanced_hide_player_collapse_button_title">Hide collapse button</string>
<string name="revanced_hide_player_collapse_button_summary_on">Collapse button is hidden.</string>
<string name="revanced_hide_player_collapse_button_summary_off">Collapse button is shown.</string>
<string name="revanced_hide_player_fullscreen_button_title">Hide fullscreen button</string>
<string name="revanced_hide_player_fullscreen_button_summary_on">Fullscreen button is hidden.</string>
<string name="revanced_hide_player_fullscreen_button_summary_off">Fullscreen button is shown.</string>
<string name="revanced_hide_player_previous_next_button_title">Hide previous &amp; next button</string>
<string name="revanced_hide_player_previous_next_button_summary_on">Buttons are hidden.</string>
<string name="revanced_hide_player_previous_next_button_summary_off">Buttons are shown.</string>
<string name="revanced_hide_player_youtube_music_button_title">Hide YouTube Music button</string>
<string name="revanced_hide_player_youtube_music_button_summary_on">YouTube Music button is hidden.</string>
<string name="revanced_hide_player_youtube_music_button_summary_off">YouTube Music button is shown.</string>
<!-- PreferenceScreen: Player, PreferenceCategory: Player, PreferenceScreen: Player buttons, PreferenceCategory: Overlay buttons -->
<string name="revanced_preference_category_overlay_buttons">Overlay buttons</string>

View File

@ -116,16 +116,31 @@
<!-- SETTINGS: HIDE_NAVIGATION_COMPONENTS
<PreferenceScreen android:title="@string/revanced_preference_screen_navigation_buttons_title" android:key="revanced_preference_screen_navigation_buttons" android:summary="@string/revanced_preference_screen_navigation_buttons_summary">
<SwitchPreference android:title="@string/revanced_enable_narrow_navigation_buttons_title" android:key="revanced_enable_narrow_navigation_buttons" android:defaultValue="false" android:summaryOn="@string/revanced_enable_narrow_navigation_buttons_summary_on" android:summaryOff="@string/revanced_enable_narrow_navigation_buttons_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_create_button_title" android:key="revanced_hide_create_button" android:defaultValue="true" android:summaryOn="@string/revanced_hide_create_button_summary_on" android:summaryOff="@string/revanced_hide_create_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_home_button_title" android:key="revanced_hide_home_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_home_button_summary_on" android:summaryOff="@string/revanced_hide_home_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_library_button_title" android:key="revanced_hide_library_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_library_button_summary_on" android:summaryOff="@string/revanced_hide_library_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_navigation_create_button_title" android:key="revanced_hide_navigation_create_button" android:defaultValue="true" android:summaryOn="@string/revanced_hide_navigation_create_button_summary_on" android:summaryOff="@string/revanced_hide_navigation_create_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_navigation_home_button_title" android:key="revanced_hide_navigation_home_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_navigation_home_button_summary_on" android:summaryOff="@string/revanced_hide_navigation_home_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_navigation_library_button_title" android:key="revanced_hide_navigation_library_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_navigation_library_button_summary_on" android:summaryOff="@string/revanced_hide_navigation_library_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_navigation_notifications_button_title" android:key="revanced_hide_navigation_notifications_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_navigation_notifications_button_summary_on" android:summaryOff="@string/revanced_hide_navigation_notifications_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_navigation_shorts_button_title" android:key="revanced_hide_navigation_shorts_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_navigation_shorts_button_summary_on" android:summaryOff="@string/revanced_hide_navigation_shorts_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_navigation_subscriptions_button_title" android:key="revanced_hide_navigation_subscriptions_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_navigation_subscriptions_button_summary_on" android:summaryOff="@string/revanced_hide_navigation_subscriptions_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_navigation_label_title" android:key="revanced_hide_navigation_label" android:defaultValue="false" android:summaryOn="@string/revanced_hide_navigation_label_summary_on" android:summaryOff="@string/revanced_hide_navigation_label_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_notifications_button_title" android:key="revanced_hide_notifications_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_notifications_button_summary_on" android:summaryOff="@string/revanced_hide_notifications_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_shorts_button_title" android:key="revanced_hide_shorts_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_shorts_button_summary_on" android:summaryOff="@string/revanced_hide_shorts_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_subscriptions_button_title" android:key="revanced_hide_subscriptions_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_subscriptions_button_summary_on" android:summaryOff="@string/revanced_hide_subscriptions_button_summary_off" />
<SwitchPreference android:title="@string/revanced_switch_create_with_notifications_button_title" android:key="revanced_switch_create_with_notifications_button" android:defaultValue="true" android:summary="@string/revanced_switch_create_with_notifications_button_summary" />
</PreferenceScreen>SETTINGS: HIDE_NAVIGATION_COMPONENTS -->
<!-- SETTINGS: TOOLBAR_COMPONENTS
<PreferenceScreen android:title="@string/revanced_preference_screen_toolbar_title" android:key="revanced_preference_screen_toolbar" android:summary="@string/revanced_preference_screen_toolbar_summary">
<SwitchPreference android:title="@string/revanced_enable_wide_search_bar_title" android:key="revanced_enable_wide_search_bar" android:defaultValue="false" android:summaryOn="@string/revanced_enable_wide_search_bar_summary_on" android:summaryOff="@string/revanced_enable_wide_search_bar_summary_off" />
<SwitchPreference android:title="@string/revanced_enable_wide_search_bar_in_you_tab_title" android:key="revanced_enable_wide_search_bar_in_you_tab" android:defaultValue="false" android:summary="@string/revanced_enable_wide_search_bar_in_you_tab_summary" android:dependency="revanced_enable_wide_search_bar" />
<SwitchPreference android:title="@string/revanced_hide_toolbar_cast_button_title" android:key="revanced_hide_toolbar_cast_button" android:defaultValue="true" android:summaryOn="@string/revanced_hide_toolbar_cast_button_summary_on" android:summaryOff="@string/revanced_hide_toolbar_cast_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_toolbar_create_button_title" android:key="revanced_hide_toolbar_create_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_toolbar_create_button_summary_on" android:summaryOff="@string/revanced_hide_toolbar_create_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_toolbar_notification_button_title" android:key="revanced_hide_toolbar_notification_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_toolbar_notification_button_summary_on" android:summaryOff="@string/revanced_hide_toolbar_notification_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_search_term_thumbnail_title" android:key="revanced_hide_search_term_thumbnail" android:defaultValue="false" android:summaryOn="@string/revanced_hide_search_term_thumbnail_summary_on" android:summaryOff="@string/revanced_hide_search_term_thumbnail_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_trending_searches_title" android:key="revanced_hide_trending_searches" android:defaultValue="true" android:summaryOn="@string/revanced_hide_trending_searches_summary_on" android:summaryOff="@string/revanced_hide_trending_searches_summary_off" />SETTINGS: TOOLBAR_COMPONENTS -->
<!-- SETTINGS: HIDE_VOICE_SEARCH_BUTTON
<SwitchPreference android:title="@string/revanced_hide_voice_search_button_title" android:key="revanced_hide_voice_search_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_voice_search_button_summary_on" android:summaryOff="@string/revanced_hide_voice_search_button_summary_off" />SETTINGS: HIDE_VOICE_SEARCH_BUTTON -->
<!-- SETTINGS: TOOLBAR_COMPONENTS
</PreferenceScreen>SETTINGS: TOOLBAR_COMPONENTS -->
<!-- SETTINGS: CHANGE_START_PAGE
<ListPreference android:entries="@array/revanced_change_start_page_entries" android:title="@string/revanced_change_start_page_title" android:key="revanced_change_start_page" android:defaultValue="" android:entryValues="@array/revanced_change_start_page_entry_values" />SETTINGS: CHANGE_START_PAGE -->
@ -144,21 +159,10 @@
<!-- SETTINGS: ENABLE_TABLET_MINI_PLAYER
<SwitchPreference android:title="@string/revanced_enable_tablet_mini_player_title" android:key="revanced_enable_tablet_mini_player" android:defaultValue="false" android:summaryOn="@string/revanced_enable_tablet_mini_player_summary_on" android:summaryOff="@string/revanced_enable_tablet_mini_player_summary_off" />SETTINGS: ENABLE_TABLET_MINI_PLAYER -->
<!-- SETTINGS: ENABLE_WIDE_SEARCH_BAR
<SwitchPreference android:title="@string/revanced_enable_wide_search_bar_title" android:key="revanced_enable_wide_search_bar" android:defaultValue="false" android:summaryOn="@string/revanced_enable_wide_search_bar_summary_on" android:summaryOff="@string/revanced_enable_wide_search_bar_summary_off" />
<SwitchPreference android:title="@string/revanced_enable_wide_search_bar_in_you_tab_title" android:key="revanced_enable_wide_search_bar_in_you_tab" android:defaultValue="false" android:summary="@string/revanced_enable_wide_search_bar_in_you_tab_summary" android:dependency="revanced_enable_wide_search_bar" />SETTINGS: ENABLE_WIDE_SEARCH_BAR -->
<!-- SETTINGS: HIDE_LAYOUT_COMPONENTS
<SwitchPreference android:title="@string/revanced_hide_cast_button_title" android:key="revanced_hide_cast_button" android:defaultValue="true" android:summaryOn="@string/revanced_hide_cast_button_summary_on" android:summaryOff="@string/revanced_hide_cast_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_floating_microphone_title" android:key="revanced_hide_floating_microphone" android:defaultValue="true" android:summaryOn="@string/revanced_hide_floating_microphone_summary_on" android:summaryOff="@string/revanced_hide_floating_microphone_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_gray_separator_title" android:key="revanced_hide_gray_separator" android:defaultValue="true" android:summaryOn="@string/revanced_hide_gray_separator_summary_on" android:summaryOff="@string/revanced_hide_gray_separator_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_search_term_thumbnail_title" android:key="revanced_hide_search_term_thumbnail" android:defaultValue="false" android:summaryOn="@string/revanced_hide_search_term_thumbnail_summary_on" android:summaryOff="@string/revanced_hide_search_term_thumbnail_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_snack_bar_title" android:key="revanced_hide_snack_bar" android:defaultValue="false" android:summaryOn="@string/revanced_hide_snack_bar_summary_on" android:summaryOff="@string/revanced_hide_snack_bar_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_toolbar_create_notification_button_title" android:key="revanced_hide_toolbar_create_notification_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_toolbar_create_notification_button_summary_on" android:summaryOff="@string/revanced_hide_toolbar_create_notification_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_trending_searches_title" android:key="revanced_hide_trending_searches" android:defaultValue="true" android:summaryOn="@string/revanced_hide_trending_searches_summary_on" android:summaryOff="@string/revanced_hide_trending_searches_summary_off" />SETTINGS: HIDE_LAYOUT_COMPONENTS -->
<!-- SETTINGS: HIDE_VOICE_SEARCH_BUTTON
<SwitchPreference android:title="@string/revanced_hide_voice_search_button_title" android:key="revanced_hide_voice_search_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_voice_search_button_summary_on" android:summaryOff="@string/revanced_hide_voice_search_button_summary_off" />SETTINGS: HIDE_VOICE_SEARCH_BUTTON -->
<SwitchPreference android:title="@string/revanced_hide_snack_bar_title" android:key="revanced_hide_snack_bar" android:defaultValue="false" android:summaryOn="@string/revanced_hide_snack_bar_summary_on" android:summaryOff="@string/revanced_hide_snack_bar_summary_off" />SETTINGS: HIDE_LAYOUT_COMPONENTS -->
<!-- SETTINGS: REMOVE_VIEWER_DISCRETION_DIALOG
<SwitchPreference android:title="@string/revanced_remove_viewer_discretion_dialog_title" android:key="revanced_remove_viewer_discretion_dialog" android:defaultValue="false" android:summary="@string/revanced_remove_viewer_discretion_dialog_summary" />SETTINGS: REMOVE_VIEWER_DISCRETION_DIALOG -->
@ -301,12 +305,13 @@
<PreferenceScreen android:title="@string/revanced_preference_screen_player_buttons_title" android:key="revanced_preference_screen_player_buttons" android:summary="@string/revanced_preference_screen_player_buttons_summary">PREFERENCE_SCREENS: PLAYER_BUTTONS -->
<!-- SETTINGS: HIDE_PLAYER_BUTTONS
<SwitchPreference android:title="@string/revanced_hide_autoplay_button_title" android:key="revanced_hide_autoplay_button" android:defaultValue="true" android:summaryOn="@string/revanced_hide_autoplay_button_summary_on" android:summaryOff="@string/revanced_hide_autoplay_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_captions_button_title" android:key="revanced_hide_captions_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_captions_button_summary_on" android:summaryOff="@string/revanced_hide_captions_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_collapse_button_title" android:key="revanced_hide_collapse_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_collapse_button_summary_on" android:summaryOff="@string/revanced_hide_collapse_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_fullscreen_button_title" android:key="revanced_hide_fullscreen_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_fullscreen_button_summary_on" android:summaryOff="@string/revanced_hide_fullscreen_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_previous_next_button_title" android:key="revanced_hide_previous_next_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_previous_next_button_summary_on" android:summaryOff="@string/revanced_hide_previous_next_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_youtube_music_button_title" android:key="revanced_hide_youtube_music_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_youtube_music_button_summary_on" android:summaryOff="@string/revanced_hide_youtube_music_button_summary_off" />SETTINGS: HIDE_PLAYER_BUTTONS -->
<SwitchPreference android:title="@string/revanced_hide_player_autoplay_button_title" android:key="revanced_hide_player_autoplay_button" android:defaultValue="true" android:summaryOn="@string/revanced_hide_player_autoplay_button_summary_on" android:summaryOff="@string/revanced_hide_player_autoplay_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_player_captions_button_title" android:key="revanced_hide_player_captions_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_player_captions_button_summary_on" android:summaryOff="@string/revanced_hide_player_captions_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_player_cast_button_title" android:key="revanced_hide_player_cast_button" android:defaultValue="true" android:summaryOn="@string/revanced_hide_player_cast_button_summary_on" android:summaryOff="@string/revanced_hide_player_cast_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_player_collapse_button_title" android:key="revanced_hide_player_collapse_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_player_collapse_button_summary_on" android:summaryOff="@string/revanced_hide_player_collapse_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_player_fullscreen_button_title" android:key="revanced_hide_player_fullscreen_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_player_fullscreen_button_summary_on" android:summaryOff="@string/revanced_hide_player_fullscreen_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_player_previous_next_button_title" android:key="revanced_hide_player_previous_next_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_player_previous_next_button_summary_on" android:summaryOff="@string/revanced_hide_player_previous_next_button_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_player_youtube_music_button_title" android:key="revanced_hide_player_youtube_music_button" android:defaultValue="false" android:summaryOn="@string/revanced_hide_player_youtube_music_button_summary_on" android:summaryOff="@string/revanced_hide_player_youtube_music_button_summary_off" />SETTINGS: HIDE_PLAYER_BUTTONS -->
<!-- SETTINGS: OVERLAY_BUTTONS
<PreferenceCategory android:title="@string/revanced_preference_category_overlay_buttons" android:layout="@layout/revanced_settings_preferences_category">
@ -549,12 +554,12 @@
<Preference android:title="Disable splash animation" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
<Preference android:title="Enable gradient loading screen" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
<Preference android:title="Enable tablet mini player" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
<Preference android:title="Enable wide search bar" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
<Preference android:title="Hide layout components" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
<Preference android:title="Hide navigation bar components" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
<Preference android:title="Layout switch" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
<Preference android:title="Remove viewer discretion dialog" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
<Preference android:title="Spoof app version" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
<Preference android:title="Toolbar components" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
</PreferenceCategory>
<PreferenceCategory android:title="@string/revanced_preference_screen_player_title" android:layout="@layout/revanced_settings_preferences_category">