refactor(YouTube/Overlay buttons): rename class, method, and resource files to be more appropriaten

This commit is contained in:
inotia00 2024-07-11 16:30:03 +09:00
parent 35eed2e2eb
commit d88df4b750
96 changed files with 58 additions and 63 deletions

View File

@ -91,7 +91,7 @@ object OverlayButtonsPatch : BaseResourcePatch(
"TimeOrderedPlaylist;", "TimeOrderedPlaylist;",
"Whitelists;" "Whitelists;"
).forEach { className -> ).forEach { className ->
PlayerControlsPatch.hookOverlayButtons("$OVERLAY_BUTTONS_PATH/$className") PlayerControlsPatch.hookBottomControlButton("$OVERLAY_BUTTONS_PATH/$className")
} }
// Copy necessary resources for the overlay buttons. // Copy necessary resources for the overlay buttons.
@ -101,7 +101,7 @@ object OverlayButtonsPatch : BaseResourcePatch(
"drawable", "drawable",
"playlist_repeat_button.xml", "playlist_repeat_button.xml",
"playlist_shuffle_button.xml", "playlist_shuffle_button.xml",
"revanced_repeat_icon.xml" "revanced_repeat_button.xml"
) )
) )
@ -122,12 +122,12 @@ object OverlayButtonsPatch : BaseResourcePatch(
"quantum_ic_fullscreen_exit_white_24.png", "quantum_ic_fullscreen_exit_white_24.png",
"quantum_ic_fullscreen_grey600_24.png", "quantum_ic_fullscreen_grey600_24.png",
"quantum_ic_fullscreen_white_24.png", "quantum_ic_fullscreen_white_24.png",
"revanced_time_ordered_playlist_icon.png", "revanced_time_ordered_playlist_button.png",
"revanced_copy_icon.png", "revanced_copy_button.png",
"revanced_copy_icon_with_time.png", "revanced_copy_timestamp_button.png",
"revanced_download_icon.png", "revanced_download_button.png",
"revanced_speed_icon.png", "revanced_speed_button.png",
"revanced_whitelist_icon.png", "revanced_whitelist_button.png",
"yt_fill_arrow_repeat_white_24.png", "yt_fill_arrow_repeat_white_24.png",
"yt_outline_arrow_repeat_1_white_24.png", "yt_outline_arrow_repeat_1_white_24.png",
"yt_outline_arrow_shuffle_1_white_24.png", "yt_outline_arrow_shuffle_1_white_24.png",

View File

@ -43,8 +43,8 @@ object PlayerControlsPatch : BytecodePatch(
private lateinit var changeVisibilityMethod: MutableMethod private lateinit var changeVisibilityMethod: MutableMethod
private lateinit var changeVisibilityNegatedImmediatelyMethod: MutableMethod private lateinit var changeVisibilityNegatedImmediatelyMethod: MutableMethod
private lateinit var initializeOverlayButtonsMethod: MutableMethod private lateinit var initializeBottomControlButtonMethod: MutableMethod
private lateinit var initializeSponsorBlockButtonsMethod: MutableMethod private lateinit var initializeTopControlButtonMethod: MutableMethod
override fun execute(context: BytecodeContext) { override fun execute(context: BytecodeContext) {
@ -101,8 +101,8 @@ object PlayerControlsPatch : BytecodePatch(
// region patch initialize of overlay button or SponsorBlock button // region patch initialize of overlay button or SponsorBlock button
mapOf( mapOf(
BottomControlsInflateFingerprint to "initializeOverlayButtons", BottomControlsInflateFingerprint to "initializeBottomControlButton",
ControlsLayoutInflateFingerprint to "initializeSponsorBlockButtons" ControlsLayoutInflateFingerprint to "initializeTopControlButton"
).forEach { (fingerprint, methodName) -> ).forEach { (fingerprint, methodName) ->
fingerprint.resultOrThrow().let { fingerprint.resultOrThrow().let {
it.mutableMethod.apply { it.mutableMethod.apply {
@ -135,14 +135,14 @@ object PlayerControlsPatch : BytecodePatch(
method.name == "changeVisibilityNegatedImmediately" method.name == "changeVisibilityNegatedImmediately"
} }
initializeOverlayButtonsMethod = initializeBottomControlButtonMethod =
playerControlsMutableClass.methods.single { method -> playerControlsMutableClass.methods.single { method ->
method.name == "initializeOverlayButtons" method.name == "initializeBottomControlButton"
} }
initializeSponsorBlockButtonsMethod = initializeTopControlButtonMethod =
playerControlsMutableClass.methods.single { method -> playerControlsMutableClass.methods.single { method ->
method.name == "initializeSponsorBlockButtons" method.name == "initializeTopControlButton"
} }
// endregion // endregion
@ -167,14 +167,14 @@ object PlayerControlsPatch : BytecodePatch(
"invoke-static {}, $classDescriptor->changeVisibilityNegatedImmediate()V" "invoke-static {}, $classDescriptor->changeVisibilityNegatedImmediate()V"
) )
internal fun hookOverlayButtons(classDescriptor: String) { internal fun hookBottomControlButton(classDescriptor: String) {
initializeOverlayButtonsMethod.initializeHook(classDescriptor) initializeBottomControlButtonMethod.initializeHook(classDescriptor)
changeVisibilityHook(classDescriptor) changeVisibilityHook(classDescriptor)
changeVisibilityNegatedImmediateHook(classDescriptor) changeVisibilityNegatedImmediateHook(classDescriptor)
} }
internal fun hookSponsorBlockButtons(classDescriptor: String) { internal fun hookTopControlButton(classDescriptor: String) {
initializeSponsorBlockButtonsMethod.initializeHook(classDescriptor) initializeTopControlButtonMethod.initializeHook(classDescriptor)
changeVisibilityHook(classDescriptor) changeVisibilityHook(classDescriptor)
changeVisibilityNegatedImmediateHook(classDescriptor) changeVisibilityNegatedImmediateHook(classDescriptor)
} }

View File

@ -110,7 +110,7 @@ object SponsorBlockBytecodePatch : BytecodePatch(
// Voting & Shield button // Voting & Shield button
arrayOf("CreateSegmentButtonController;", "VotingButtonController;").forEach { className -> arrayOf("CreateSegmentButtonController;", "VotingButtonController;").forEach { className ->
PlayerControlsPatch.hookSponsorBlockButtons("$INTEGRATIONS_SPONSOR_BLOCK_UI_PATH/$className") PlayerControlsPatch.hookTopControlButton("$INTEGRATIONS_SPONSOR_BLOCK_UI_PATH/$className")
} }
// Append timestamp // Append timestamp

View File

@ -92,47 +92,42 @@ object SponsorBlockPatch : BaseResourcePatch(
* merge xml nodes from the host to their real xml files * merge xml nodes from the host to their real xml files
*/ */
// copy nodes from host resources to their real xml files // copy nodes from host resources to their real xml files
val hostingResourceStream =
inputStreamFromBundledResource(
"youtube/sponsorblock",
"shared/host/layout/youtube_controls_layout.xml",
)!!
var modifiedControlsLayout = false var modifiedControlsLayout = false
val editor = context.xmlEditor["res/layout/youtube_controls_layout.xml"]
// voting button id from the voting button view from the youtube_controls_layout.xml host file inputStreamFromBundledResource(
val votingButtonId = "@+id/revanced_sb_voting_button" "youtube/sponsorblock",
"shared/host/layout/youtube_controls_layout.xml",
)?.let { hostingResourceStream ->
val editor = context.xmlEditor["res/layout/youtube_controls_layout.xml"]
"RelativeLayout".copyXmlNode( // voting button id from the voting button view from the youtube_controls_layout.xml host file
context.xmlEditor[hostingResourceStream], val votingButtonId = "@+id/revanced_sb_voting_button"
editor
).also {
val document = editor.file
val children = document.getElementsByTagName("RelativeLayout").item(0).childNodes
// Replace the startOf with the voting button view so that the button does not overlap "RelativeLayout".copyXmlNode(
for (i in 1 until children.length) { context.xmlEditor[hostingResourceStream],
val view = children.item(i) editor
).also {
val document = editor.file
val children = document.getElementsByTagName("RelativeLayout").item(0).childNodes
// Replace the attribute for a specific node only // Replace the startOf with the voting button view so that the button does not overlap
if (!( for (i in 1 until children.length) {
view.hasAttributes() && val view = children.item(i)
view.attributes.getNamedItem(
"android:id", val playerVideoHeading = view.hasAttributes() &&
).nodeValue.endsWith("player_video_heading") view.attributes.getNamedItem("android:id").nodeValue.endsWith("player_video_heading")
)
) { // Replace the attribute for a specific node only
continue if (!playerVideoHeading) continue
view.attributes.getNamedItem("android:layout_toStartOf").nodeValue =
votingButtonId
modifiedControlsLayout = true
break
} }
}.close()
view.attributes.getNamedItem("android:layout_toStartOf").nodeValue = }
votingButtonId
modifiedControlsLayout = true
break
}
}.close()
if (!modifiedControlsLayout) throw PatchException("Could not modify controls layout") if (!modifiedControlsLayout) throw PatchException("Could not modify controls layout")

View File

@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:yt="http://schemas.android.com/apk/res-auto" android:id="@+id/youtube_controls_bottom_ui_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:layoutDirection="ltr"> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:yt="http://schemas.android.com/apk/res-auto" android:id="@+id/youtube_controls_bottom_ui_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:layoutDirection="ltr">
<com.google.android.libraries.youtube.common.ui.TouchImageView android:id="@+id/speed_dialog_button" android:paddingLeft="0.0dip" android:paddingTop="22.0dip" android:paddingRight="0.0dip" android:paddingBottom="22.0dip" android:longClickable="false" android:layout_width="48.0dip" android:layout_height="48.0dip" android:src="@drawable/revanced_speed_icon" android:scaleType="center" yt:layout_constraintBottom_toTopOf="@+id/quick_actions_container" yt:layout_constraintRight_toLeftOf="@+id/copy_video_url_button" style="@style/YouTubePlayerButton"/> <com.google.android.libraries.youtube.common.ui.TouchImageView android:id="@+id/speed_dialog_button" android:paddingLeft="0.0dip" android:paddingTop="22.0dip" android:paddingRight="0.0dip" android:paddingBottom="22.0dip" android:longClickable="false" android:layout_width="48.0dip" android:layout_height="48.0dip" android:src="@drawable/revanced_speed_button" android:scaleType="center" yt:layout_constraintBottom_toTopOf="@+id/quick_actions_container" yt:layout_constraintRight_toLeftOf="@+id/copy_video_url_button" style="@style/YouTubePlayerButton"/>
<com.google.android.libraries.youtube.common.ui.TouchImageView android:id="@+id/copy_video_url_button" android:paddingLeft="0.0dip" android:paddingTop="22.0dip" android:paddingRight="0.0dip" android:paddingBottom="22.0dip" android:longClickable="false" android:layout_width="48.0dip" android:layout_height="48.0dip" android:src="@drawable/revanced_copy_icon" android:scaleType="center" yt:layout_constraintBottom_toTopOf="@+id/quick_actions_container" yt:layout_constraintRight_toLeftOf="@+id/copy_video_url_timestamp_button" style="@style/YouTubePlayerButton"/> <com.google.android.libraries.youtube.common.ui.TouchImageView android:id="@+id/copy_video_url_button" android:paddingLeft="0.0dip" android:paddingTop="22.0dip" android:paddingRight="0.0dip" android:paddingBottom="22.0dip" android:longClickable="false" android:layout_width="48.0dip" android:layout_height="48.0dip" android:src="@drawable/revanced_copy_button" android:scaleType="center" yt:layout_constraintBottom_toTopOf="@+id/quick_actions_container" yt:layout_constraintRight_toLeftOf="@+id/copy_video_url_timestamp_button" style="@style/YouTubePlayerButton"/>
<com.google.android.libraries.youtube.common.ui.TouchImageView android:id="@+id/copy_video_url_timestamp_button" android:paddingLeft="0.0dip" android:paddingTop="22.0dip" android:paddingRight="0.0dip" android:paddingBottom="22.0dip" android:longClickable="false" android:layout_width="48.0dip" android:layout_height="48.0dip" android:src="@drawable/revanced_copy_icon_with_time" android:scaleType="center" yt:layout_constraintBottom_toTopOf="@+id/quick_actions_container" yt:layout_constraintRight_toLeftOf="@+id/whitelist_button" style="@style/YouTubePlayerButton"/> <com.google.android.libraries.youtube.common.ui.TouchImageView android:id="@+id/copy_video_url_timestamp_button" android:paddingLeft="0.0dip" android:paddingTop="22.0dip" android:paddingRight="0.0dip" android:paddingBottom="22.0dip" android:longClickable="false" android:layout_width="48.0dip" android:layout_height="48.0dip" android:src="@drawable/revanced_copy_timestamp_button" android:scaleType="center" yt:layout_constraintBottom_toTopOf="@+id/quick_actions_container" yt:layout_constraintRight_toLeftOf="@+id/whitelist_button" style="@style/YouTubePlayerButton"/>
<com.google.android.libraries.youtube.common.ui.TouchImageView android:id="@+id/whitelist_button" android:paddingLeft="0.0dip" android:paddingTop="22.0dip" android:paddingRight="0.0dip" android:paddingBottom="22.0dip" android:longClickable="false" android:layout_width="48.0dip" android:layout_height="48.0dip" android:src="@drawable/revanced_whitelist_icon" android:scaleType="center" yt:layout_constraintBottom_toTopOf="@+id/quick_actions_container" yt:layout_constraintRight_toLeftOf="@+id/time_ordered_playlist_button" style="@style/YouTubePlayerButton"/> <com.google.android.libraries.youtube.common.ui.TouchImageView android:id="@+id/whitelist_button" android:paddingLeft="0.0dip" android:paddingTop="22.0dip" android:paddingRight="0.0dip" android:paddingBottom="22.0dip" android:longClickable="false" android:layout_width="48.0dip" android:layout_height="48.0dip" android:src="@drawable/revanced_whitelist_button" android:scaleType="center" yt:layout_constraintBottom_toTopOf="@+id/quick_actions_container" yt:layout_constraintRight_toLeftOf="@+id/time_ordered_playlist_button" style="@style/YouTubePlayerButton"/>
<com.google.android.libraries.youtube.common.ui.TouchImageView android:id="@+id/time_ordered_playlist_button" android:paddingLeft="0.0dip" android:paddingTop="22.0dip" android:paddingRight="0.0dip" android:paddingBottom="22.0dip" android:longClickable="false" android:layout_width="48.0dip" android:layout_height="48.0dip" android:src="@drawable/revanced_time_ordered_playlist_icon" android:scaleType="center" yt:layout_constraintBottom_toTopOf="@+id/quick_actions_container" yt:layout_constraintRight_toLeftOf="@+id/always_repeat_button" style="@style/YouTubePlayerButton"/> <com.google.android.libraries.youtube.common.ui.TouchImageView android:id="@+id/time_ordered_playlist_button" android:paddingLeft="0.0dip" android:paddingTop="22.0dip" android:paddingRight="0.0dip" android:paddingBottom="22.0dip" android:longClickable="false" android:layout_width="48.0dip" android:layout_height="48.0dip" android:src="@drawable/revanced_time_ordered_playlist_button" android:scaleType="center" yt:layout_constraintBottom_toTopOf="@+id/quick_actions_container" yt:layout_constraintRight_toLeftOf="@+id/always_repeat_button" style="@style/YouTubePlayerButton"/>
<com.google.android.libraries.youtube.common.ui.TouchImageView android:id="@+id/always_repeat_button" android:paddingLeft="0.0dip" android:paddingTop="22.0dip" android:paddingRight="0.0dip" android:paddingBottom="22.0dip" android:longClickable="false" android:layout_width="48.0dip" android:layout_height="48.0dip" android:src="@drawable/revanced_repeat_icon" android:scaleType="center" yt:layout_constraintBottom_toTopOf="@+id/quick_actions_container" yt:layout_constraintRight_toLeftOf="@+id/external_download_button" style="@style/YouTubePlayerButton"/> <com.google.android.libraries.youtube.common.ui.TouchImageView android:id="@+id/always_repeat_button" android:paddingLeft="0.0dip" android:paddingTop="22.0dip" android:paddingRight="0.0dip" android:paddingBottom="22.0dip" android:longClickable="false" android:layout_width="48.0dip" android:layout_height="48.0dip" android:src="@drawable/revanced_repeat_button" android:scaleType="center" yt:layout_constraintBottom_toTopOf="@+id/quick_actions_container" yt:layout_constraintRight_toLeftOf="@+id/external_download_button" style="@style/YouTubePlayerButton"/>
<com.google.android.libraries.youtube.common.ui.TouchImageView android:id="@+id/external_download_button" android:paddingLeft="0.0dip" android:paddingTop="22.0dip" android:paddingRight="0.0dip" android:paddingBottom="22.0dip" android:longClickable="false" android:layout_width="48.0dip" android:layout_height="48.0dip" android:src="@drawable/revanced_download_icon" android:scaleType="center" yt:layout_constraintBottom_toTopOf="@+id/quick_actions_container" yt:layout_constraintRight_toLeftOf="@+id/fullscreen_button" style="@style/YouTubePlayerButton"/> <com.google.android.libraries.youtube.common.ui.TouchImageView android:id="@+id/external_download_button" android:paddingLeft="0.0dip" android:paddingTop="22.0dip" android:paddingRight="0.0dip" android:paddingBottom="22.0dip" android:longClickable="false" android:layout_width="48.0dip" android:layout_height="48.0dip" android:src="@drawable/revanced_download_button" android:scaleType="center" yt:layout_constraintBottom_toTopOf="@+id/quick_actions_container" yt:layout_constraintRight_toLeftOf="@+id/fullscreen_button" style="@style/YouTubePlayerButton"/>
</android.support.constraint.ConstraintLayout> </android.support.constraint.ConstraintLayout>