feat(YouTube - Hide player overlay buttons): Add in app setting for "Hide player control buttons background" (#5147)
This commit is contained in:
@ -1,6 +1,7 @@
|
|||||||
package app.revanced.extension.youtube.patches;
|
package app.revanced.extension.youtube.patches;
|
||||||
|
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
|
|
||||||
import app.revanced.extension.shared.Logger;
|
import app.revanced.extension.shared.Logger;
|
||||||
@ -58,6 +59,22 @@ public final class HidePlayerOverlayButtonsPatch {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Injection point.
|
||||||
|
*/
|
||||||
|
public static void hidePlayerControlButtonsBackground(View rootView) {
|
||||||
|
try {
|
||||||
|
if (!Settings.HIDE_PLAYER_CONTROL_BUTTONS_BACKGROUND.get()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Each button is an ImageView with a background set to another drawable.
|
||||||
|
removeImageViewsBackgroundRecursive(rootView);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Logger.printException(() -> "removePlayerControlButtonsBackground failure", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static void hideView(View parentView, int resourceId) {
|
private static void hideView(View parentView, int resourceId) {
|
||||||
View nextPreviousButton = parentView.findViewById(resourceId);
|
View nextPreviousButton = parentView.findViewById(resourceId);
|
||||||
|
|
||||||
@ -69,4 +86,16 @@ public final class HidePlayerOverlayButtonsPatch {
|
|||||||
Logger.printDebug(() -> "Hiding previous/next button");
|
Logger.printDebug(() -> "Hiding previous/next button");
|
||||||
Utils.hideViewByRemovingFromParentUnderCondition(true, nextPreviousButton);
|
Utils.hideViewByRemovingFromParentUnderCondition(true, nextPreviousButton);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void removeImageViewsBackgroundRecursive(View currentView) {
|
||||||
|
if (currentView instanceof ImageView imageView) {
|
||||||
|
imageView.setBackground(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentView instanceof ViewGroup viewGroup) {
|
||||||
|
for (int i = 0; i < viewGroup.getChildCount(); i++) {
|
||||||
|
removeImageViewsBackgroundRecursive(viewGroup.getChildAt(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -135,6 +135,7 @@ public class Settings extends BaseSettings {
|
|||||||
public static final BooleanSetting HIDE_AUTOPLAY_BUTTON = new BooleanSetting("revanced_hide_autoplay_button", TRUE, true);
|
public static final BooleanSetting HIDE_AUTOPLAY_BUTTON = new BooleanSetting("revanced_hide_autoplay_button", TRUE, true);
|
||||||
public static final BooleanSetting HIDE_CAPTIONS_BUTTON = new BooleanSetting("revanced_hide_captions_button", FALSE);
|
public static final BooleanSetting HIDE_CAPTIONS_BUTTON = new BooleanSetting("revanced_hide_captions_button", FALSE);
|
||||||
public static final BooleanSetting HIDE_CAST_BUTTON = new BooleanSetting("revanced_hide_cast_button", TRUE, true);
|
public static final BooleanSetting HIDE_CAST_BUTTON = new BooleanSetting("revanced_hide_cast_button", TRUE, true);
|
||||||
|
public static final BooleanSetting HIDE_PLAYER_CONTROL_BUTTONS_BACKGROUND = new BooleanSetting("revanced_hide_player_control_buttons_background", FALSE, true);
|
||||||
public static final BooleanSetting HIDE_CHANNEL_BAR = new BooleanSetting("revanced_hide_channel_bar", FALSE);
|
public static final BooleanSetting HIDE_CHANNEL_BAR = new BooleanSetting("revanced_hide_channel_bar", FALSE);
|
||||||
public static final BooleanSetting HIDE_CHANNEL_MEMBER_SHELF = new BooleanSetting("revanced_hide_channel_member_shelf", TRUE);
|
public static final BooleanSetting HIDE_CHANNEL_MEMBER_SHELF = new BooleanSetting("revanced_hide_channel_member_shelf", TRUE);
|
||||||
public static final BooleanSetting HIDE_COMMUNITY_GUIDELINES = new BooleanSetting("revanced_hide_community_guidelines", TRUE);
|
public static final BooleanSetting HIDE_COMMUNITY_GUIDELINES = new BooleanSetting("revanced_hide_community_guidelines", TRUE);
|
||||||
|
@ -2,6 +2,7 @@ package app.revanced.patches.youtube.layout.buttons.overlay
|
|||||||
|
|
||||||
import app.revanced.patcher.fingerprint
|
import app.revanced.patcher.fingerprint
|
||||||
import app.revanced.util.containsLiteralInstruction
|
import app.revanced.util.containsLiteralInstruction
|
||||||
|
import app.revanced.util.literal
|
||||||
import com.android.tools.smali.dexlib2.AccessFlags
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
|
|
||||||
internal val playerControlsPreviousNextOverlayTouchFingerprint = fingerprint {
|
internal val playerControlsPreviousNextOverlayTouchFingerprint = fingerprint {
|
||||||
@ -20,3 +21,10 @@ internal val mediaRouteButtonFingerprint = fingerprint {
|
|||||||
methodDef.definingClass.endsWith("/MediaRouteButton;") && methodDef.name == "setVisibility"
|
methodDef.definingClass.endsWith("/MediaRouteButton;") && methodDef.name == "setVisibility"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal val inflateControlsGroupLayoutStubFingerprint = fingerprint {
|
||||||
|
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
||||||
|
parameters()
|
||||||
|
returns("V")
|
||||||
|
literal { controlsButtonGroupLayoutStub }
|
||||||
|
}
|
||||||
|
@ -28,6 +28,8 @@ internal var playerControlPreviousButtonTouchArea = -1L
|
|||||||
private set
|
private set
|
||||||
internal var playerControlNextButtonTouchArea = -1L
|
internal var playerControlNextButtonTouchArea = -1L
|
||||||
private set
|
private set
|
||||||
|
internal var controlsButtonGroupLayoutStub = -1L
|
||||||
|
private set
|
||||||
|
|
||||||
private val hidePlayerOverlayButtonsResourcePatch = resourcePatch {
|
private val hidePlayerOverlayButtonsResourcePatch = resourcePatch {
|
||||||
dependsOn(resourceMappingPatch)
|
dependsOn(resourceMappingPatch)
|
||||||
@ -35,6 +37,7 @@ private val hidePlayerOverlayButtonsResourcePatch = resourcePatch {
|
|||||||
execute {
|
execute {
|
||||||
playerControlPreviousButtonTouchArea = resourceMappings["id", "player_control_previous_button_touch_area"]
|
playerControlPreviousButtonTouchArea = resourceMappings["id", "player_control_previous_button_touch_area"]
|
||||||
playerControlNextButtonTouchArea = resourceMappings["id", "player_control_next_button_touch_area"]
|
playerControlNextButtonTouchArea = resourceMappings["id", "player_control_next_button_touch_area"]
|
||||||
|
controlsButtonGroupLayoutStub = resourceMappings["id", "youtube_controls_button_group_layout_stub"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,7 +46,8 @@ private const val EXTENSION_CLASS_DESCRIPTOR =
|
|||||||
|
|
||||||
val hidePlayerOverlayButtonsPatch = bytecodePatch(
|
val hidePlayerOverlayButtonsPatch = bytecodePatch(
|
||||||
name = "Hide player overlay buttons",
|
name = "Hide player overlay buttons",
|
||||||
description = "Adds options to hide the player Cast, Autoplay, Captions, and Previous & Next buttons.",
|
description = "Adds options to hide the player Cast, Autoplay, Captions, Previous & Next buttons, and the player " +
|
||||||
|
"control buttons background.",
|
||||||
) {
|
) {
|
||||||
dependsOn(
|
dependsOn(
|
||||||
sharedExtensionPatch,
|
sharedExtensionPatch,
|
||||||
@ -72,6 +76,7 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch(
|
|||||||
SwitchPreference("revanced_hide_cast_button"),
|
SwitchPreference("revanced_hide_cast_button"),
|
||||||
SwitchPreference("revanced_hide_captions_button"),
|
SwitchPreference("revanced_hide_captions_button"),
|
||||||
SwitchPreference("revanced_hide_autoplay_button"),
|
SwitchPreference("revanced_hide_autoplay_button"),
|
||||||
|
SwitchPreference("revanced_hide_player_control_buttons_background"),
|
||||||
)
|
)
|
||||||
|
|
||||||
// region Hide player next/previous button.
|
// region Hide player next/previous button.
|
||||||
@ -147,5 +152,32 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
|
// region Hide player control buttons background.
|
||||||
|
|
||||||
|
inflateControlsGroupLayoutStubFingerprint.method.apply {
|
||||||
|
val controlsButtonGroupLayoutStubResIdConstIndex =
|
||||||
|
indexOfFirstLiteralInstructionOrThrow(controlsButtonGroupLayoutStub)
|
||||||
|
val inflateControlsGroupLayoutStubIndex =
|
||||||
|
indexOfFirstInstruction(controlsButtonGroupLayoutStubResIdConstIndex) {
|
||||||
|
getReference<MethodReference>()?.name == "inflate"
|
||||||
|
}
|
||||||
|
|
||||||
|
val freeRegister = findFreeRegister(inflateControlsGroupLayoutStubIndex)
|
||||||
|
val hidePlayerControlButtonsBackgroundDescriptor =
|
||||||
|
"$EXTENSION_CLASS_DESCRIPTOR->hidePlayerControlButtonsBackground(Landroid/view/View;)V"
|
||||||
|
|
||||||
|
addInstructions(
|
||||||
|
inflateControlsGroupLayoutStubIndex + 1,
|
||||||
|
"""
|
||||||
|
# Move the inflated layout to a temporary register.
|
||||||
|
# The result of the inflate method is by default not moved to a register after the method is called.
|
||||||
|
move-result-object v$freeRegister
|
||||||
|
invoke-static { v$freeRegister }, $hidePlayerControlButtonsBackgroundDescriptor
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,37 +1,12 @@
|
|||||||
package app.revanced.patches.youtube.layout.player.background
|
package app.revanced.patches.youtube.layout.player.background
|
||||||
|
|
||||||
import app.revanced.patcher.patch.resourcePatch
|
import app.revanced.patcher.patch.resourcePatch
|
||||||
import app.revanced.util.doRecursively
|
import app.revanced.patches.youtube.layout.buttons.overlay.hidePlayerOverlayButtonsPatch
|
||||||
import org.w3c.dom.Element
|
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
|
@Deprecated("Functionality added to hidePlayerOverlayButtonsPatch", ReplaceWith("hidePlayerOverlayButtonsPatch"))
|
||||||
val playerControlsBackgroundPatch = resourcePatch(
|
val playerControlsBackgroundPatch = resourcePatch(
|
||||||
name = "Remove player controls background",
|
description = "Removes the dark background surrounding the video player control buttons.",
|
||||||
description = "Removes the dark background surrounding the video player controls.",
|
|
||||||
use = false,
|
|
||||||
) {
|
) {
|
||||||
compatibleWith(
|
dependsOn(hidePlayerOverlayButtonsPatch)
|
||||||
"com.google.android.youtube"(
|
|
||||||
"19.16.39",
|
|
||||||
"19.25.37",
|
|
||||||
"19.34.42",
|
|
||||||
"19.43.41",
|
|
||||||
"19.47.53",
|
|
||||||
"20.07.39",
|
|
||||||
"20.12.46",
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
execute {
|
|
||||||
document("res/drawable/player_button_circle_background.xml").use { document ->
|
|
||||||
|
|
||||||
document.doRecursively node@{ node ->
|
|
||||||
if (node !is Element) return@node
|
|
||||||
|
|
||||||
node.getAttributeNode("android:color")?.let { attribute ->
|
|
||||||
attribute.textContent = "@android:color/transparent"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -743,6 +743,9 @@ To show the Audio track menu, change \'Spoof video streams\' to iOS TV"</string>
|
|||||||
<string name="revanced_hide_autoplay_button_title">Hide Autoplay button</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_on">Autoplay button is hidden</string>
|
||||||
<string name="revanced_hide_autoplay_button_summary_off">Autoplay button is shown</string>
|
<string name="revanced_hide_autoplay_button_summary_off">Autoplay button is shown</string>
|
||||||
|
<string name="revanced_hide_player_control_buttons_background_title">Hide player control buttons background</string>
|
||||||
|
<string name="revanced_hide_player_control_buttons_background_summary_on">Player control buttons background is hidden</string>
|
||||||
|
<string name="revanced_hide_player_control_buttons_background_summary_off">Player control buttons background is shown</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||||
<string name="revanced_hide_endscreen_cards_title">Hide end screen cards</string>
|
<string name="revanced_hide_endscreen_cards_title">Hide end screen cards</string>
|
||||||
|
Reference in New Issue
Block a user