Skip to content

Commit 909c4b0

Browse files
committed
fix(YouTube - SponsorBlock): re-enables the "New Segment" button in the SponsorBlock UI
1 parent 8dc3d95 commit 909c4b0

File tree

9 files changed

+262
-39
lines changed

9 files changed

+262
-39
lines changed

app/src/main/java/io/github/chsbuffer/revancedxposed/youtube/interaction/CopyVideoUrl.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import app.revanced.extension.youtube.videoplayer.CopyVideoUrlTimestampButton
55
import io.github.chsbuffer.revancedxposed.R
66
import io.github.chsbuffer.revancedxposed.shared.misc.settings.preference.SwitchPreference
77
import io.github.chsbuffer.revancedxposed.youtube.YoutubeHook
8-
import io.github.chsbuffer.revancedxposed.youtube.misc.BottomControl
8+
import io.github.chsbuffer.revancedxposed.youtube.misc.ControlInitializer
99
import io.github.chsbuffer.revancedxposed.youtube.misc.PlayerControls
1010
import io.github.chsbuffer.revancedxposed.youtube.misc.PreferenceScreen
1111
import io.github.chsbuffer.revancedxposed.youtube.misc.addBottomControl
@@ -25,7 +25,7 @@ fun YoutubeHook.CopyVideoUrl() {
2525

2626
addBottomControl(R.layout.revanced_copy_video_url_button)
2727
initializeBottomControl(
28-
BottomControl(
28+
ControlInitializer(
2929
R.id.revanced_copy_video_url_timestamp_button,
3030
CopyVideoUrlTimestampButton::initializeButton,
3131
CopyVideoUrlTimestampButton::setVisibility,
@@ -34,7 +34,7 @@ fun YoutubeHook.CopyVideoUrl() {
3434
)
3535
)
3636
initializeBottomControl(
37-
BottomControl(
37+
ControlInitializer(
3838
R.id.revanced_copy_video_url_button,
3939
CopyVideoUrlButton::initializeButton,
4040
CopyVideoUrlButton::setVisibility,

app/src/main/java/io/github/chsbuffer/revancedxposed/youtube/interaction/Downloads.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import io.github.chsbuffer.revancedxposed.shared.misc.settings.preference.Prefer
1212
import io.github.chsbuffer.revancedxposed.shared.misc.settings.preference.SwitchPreference
1313
import io.github.chsbuffer.revancedxposed.shared.misc.settings.preference.TextPreference
1414
import io.github.chsbuffer.revancedxposed.youtube.YoutubeHook
15-
import io.github.chsbuffer.revancedxposed.youtube.misc.BottomControl
15+
import io.github.chsbuffer.revancedxposed.youtube.misc.ControlInitializer
1616
import io.github.chsbuffer.revancedxposed.youtube.misc.PlayerControls
1717
import io.github.chsbuffer.revancedxposed.youtube.misc.PreferenceScreen
1818
import io.github.chsbuffer.revancedxposed.youtube.misc.addBottomControl
@@ -44,7 +44,7 @@ fun YoutubeHook.Downloads() {
4444

4545
addBottomControl(R.layout.revanced_external_download_button)
4646
initializeBottomControl(
47-
BottomControl(
47+
ControlInitializer(
4848
R.id.revanced_external_download_button,
4949
ExternalDownloadButton::initializeButton,
5050
ExternalDownloadButton::setVisibility,

app/src/main/java/io/github/chsbuffer/revancedxposed/youtube/layout/SponsorBlock.kt

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,28 @@ import android.content.Context
44
import android.graphics.Canvas
55
import android.graphics.Rect
66
import android.view.ViewGroup
7-
import android.widget.FrameLayout
87
import app.revanced.extension.shared.Utils
98
import app.revanced.extension.youtube.sponsorblock.SegmentPlaybackController
9+
import app.revanced.extension.youtube.sponsorblock.ui.CreateSegmentButton
1010
import app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockAboutPreference
1111
import app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockPreferenceGroup
1212
import app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockStatsPreferenceCategory
1313
import app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockViewController
14+
import app.revanced.extension.youtube.sponsorblock.ui.VotingButton
15+
import io.github.chsbuffer.revancedxposed.R
1416
import io.github.chsbuffer.revancedxposed.addModuleAssets
1517
import io.github.chsbuffer.revancedxposed.scopedHook
1618
import io.github.chsbuffer.revancedxposed.setObjectField
1719
import io.github.chsbuffer.revancedxposed.shared.misc.settings.preference.NonInteractivePreference
1820
import io.github.chsbuffer.revancedxposed.shared.misc.settings.preference.PreferenceCategory
1921
import io.github.chsbuffer.revancedxposed.shared.misc.settings.preference.PreferenceScreenPreference
2022
import io.github.chsbuffer.revancedxposed.youtube.YoutubeHook
23+
import io.github.chsbuffer.revancedxposed.youtube.misc.ControlInitializer
24+
import io.github.chsbuffer.revancedxposed.youtube.misc.PlayerControls
2125
import io.github.chsbuffer.revancedxposed.youtube.misc.PlayerTypeHook
2226
import io.github.chsbuffer.revancedxposed.youtube.misc.PreferenceScreen
27+
import io.github.chsbuffer.revancedxposed.youtube.misc.addTopControl
28+
import io.github.chsbuffer.revancedxposed.youtube.misc.initializeTopControl
2329
import io.github.chsbuffer.revancedxposed.youtube.video.VideoIdPatch
2430
import io.github.chsbuffer.revancedxposed.youtube.video.VideoInformationHook
2531
import io.github.chsbuffer.revancedxposed.youtube.video.playerInitHooks
@@ -32,6 +38,7 @@ fun YoutubeHook.SponsorBlock() {
3238
::VideoInformationHook,
3339
::VideoIdPatch,
3440
::PlayerTypeHook,
41+
::PlayerControls,
3542
)
3643

3744
PreferenceScreen.SPONSORBLOCK.addPreferences(
@@ -42,14 +49,12 @@ fun YoutubeHook.SponsorBlock() {
4249
sorting = PreferenceScreenPreference.Sorting.UNSORTED,
4350
preferences = emptySet(), // Preferences are added by custom class at runtime.
4451
tag = SponsorBlockPreferenceGroup::class.java
45-
),
46-
PreferenceCategory(
52+
), PreferenceCategory(
4753
key = "revanced_sb_stats",
4854
sorting = PreferenceScreenPreference.Sorting.UNSORTED,
4955
preferences = emptySet(), // Preferences are added by custom class at runtime.
5056
tag = SponsorBlockStatsPreferenceCategory::class.java
51-
),
52-
PreferenceCategory(
57+
), PreferenceCategory(
5358
key = "revanced_sb_about",
5459
sorting = PreferenceScreenPreference.Sorting.UNSORTED,
5560
preferences = setOf(
@@ -62,13 +67,12 @@ fun YoutubeHook.SponsorBlock() {
6267
)
6368
)
6469

70+
addTopControl(R.layout.revanced_sb_button)
71+
6572
// Hook the video time methods.
6673
videoTimeHooks.add { SegmentPlaybackController.setVideoTime(it) }
6774
videoIdHooks.add { SegmentPlaybackController.setCurrentVideoId(it) }
6875

69-
// Initialize the player controller.
70-
playerInitHooks.add { SegmentPlaybackController.initialize(it) }
71-
7276
getDexClass("SeekbarClass") {
7377
findMethod {
7478
matcher {
@@ -129,29 +133,53 @@ fun YoutubeHook.SponsorBlock() {
129133
)
130134
)
131135

136+
// Change visibility of the buttons.
137+
initializeTopControl(
138+
ControlInitializer(
139+
R.id.revanced_sb_create_segment_button,
140+
CreateSegmentButton::initialize,
141+
CreateSegmentButton::setVisibility,
142+
CreateSegmentButton::setVisibilityImmediate,
143+
CreateSegmentButton::setVisibilityNegatedImmediate
144+
)
145+
)
146+
initializeTopControl(
147+
ControlInitializer(
148+
R.id.revanced_sb_voting_button,
149+
VotingButton::initialize,
150+
VotingButton::setVisibility,
151+
VotingButton::setVisibilityImmediate,
152+
VotingButton::setVisibilityNegatedImmediate
153+
)
154+
)
155+
156+
// TODO Append the new time to the player layout.
157+
158+
// Initialize the player controller.
159+
playerInitHooks.add { SegmentPlaybackController.initialize(it) }
160+
132161
// Initialize the SponsorBlock view.
133162
val inset_overlay_view_layout = Utils.getResourceIdentifier("inset_overlay_view_layout", "id")
163+
val controls_overlay_layout =
164+
Utils.getResourceIdentifier("size_adjustable_youtube_controls_overlay", "layout")
134165
getDexMethod("controlsOverlayFingerprint") {
135166
findMethod {
136167
matcher {
137168
addUsingNumber(inset_overlay_view_layout)
138169
paramCount = 0
139170
returnType = "void"
140171
}
141-
}.single().also {
142-
getDexField("controlsOverlayParentLayout") { it.usingFields.first().field }
143-
}
144-
}.hookMethod {
145-
val field = getDexField("controlsOverlayParentLayout").toField()
146-
val id = inset_overlay_view_layout
172+
}.single()
173+
}.hookMethod(scopedHook(DexMethod("Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;)Landroid/view/View;").toMember()) {
147174
after { param ->
148-
val layout = field.get(param.thisObject) as FrameLayout
175+
if (param.args[0] != controls_overlay_layout) return@after
176+
val layout = param.result as ViewGroup
149177
layout.context.addModuleAssets()
150178
Utils.getContext().addModuleAssets()
151-
val overlay_view = layout.findViewById<ViewGroup>(id)
179+
val overlay_view = layout.findViewById<ViewGroup>(inset_overlay_view_layout)
152180
SponsorBlockViewController.initialize(overlay_view)
153181
}
154-
}
182+
})
155183

156184
fun injectClassLoader(self: ClassLoader, host: ClassLoader) {
157185
val bootClassLoader = Context::class.java.classLoader!!

app/src/main/java/io/github/chsbuffer/revancedxposed/youtube/misc/PlayerControls.kt

Lines changed: 68 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,60 +4,114 @@ import android.view.View
44
import android.view.ViewGroup
55
import android.view.ViewStub
66
import android.widget.ImageView
7+
import android.widget.RelativeLayout
78
import app.revanced.extension.shared.Utils
89
import app.revanced.extension.youtube.patches.PlayerControlsPatch
910
import io.github.chsbuffer.revancedxposed.AccessFlags
11+
import io.github.chsbuffer.revancedxposed.R
1012
import io.github.chsbuffer.revancedxposed.fingerprint
1113
import io.github.chsbuffer.revancedxposed.scopedHook
1214
import io.github.chsbuffer.revancedxposed.youtube.YoutubeHook
1315
import org.luckypray.dexkit.wrap.DexMethod
1416

15-
class BottomControl(
17+
class ControlInitializer(
1618
val id: Int,
1719
@JvmField val initializeButton: (controlsView: ViewGroup) -> Unit,
20+
// visibilityCheckCalls
1821
@JvmField val setVisibility: (Boolean, Boolean) -> Unit,
1922
@JvmField val setVisibilityImmediate: (Boolean) -> Unit,
2023
// Patch works without this hook, but it is needed to use the correct fade out animation
2124
// duration when tapping the overlay to dismiss.
2225
@JvmField val setVisibilityNegatedImmediate: () -> Unit
2326
)
2427

28+
private val topControlLayouts = mutableListOf<Int>()
29+
private val bottomControlLayouts = mutableListOf<Int>()
30+
private val topControls = mutableListOf<ControlInitializer>()
31+
private val bottomControls = mutableListOf<ControlInitializer>()
32+
2533
@JvmField
2634
var visibilityImmediateCallbacksExistModified = false
2735

28-
@JvmField
29-
val bottomControls = mutableListOf<BottomControl>()
36+
fun onFullscreenButtonVisibilityChanged(isVisible: Boolean) {
37+
topControls.forEach { it.setVisibilityImmediate(isVisible) }
38+
bottomControls.forEach { it.setVisibilityImmediate(isVisible) }
39+
// Logger.printDebug { ("setVisibilityImmediate($isVisible)") }
40+
}
41+
42+
fun addTopControl(layout: Int) {
43+
topControlLayouts.add(layout)
44+
}
3045

31-
private val bottomControlLayouts = mutableListOf<Int>()
3246
fun addBottomControl(layout: Int) {
3347
bottomControlLayouts.add(layout)
3448
}
3549

36-
fun initializeBottomControl(bottomControl: BottomControl) {
37-
bottomControls.add(bottomControl)
50+
fun initializeTopControl(control: ControlInitializer) {
51+
topControls.add(control)
52+
injectVisibilityCheckCall()
53+
}
54+
55+
fun initializeBottomControl(control: ControlInitializer) {
56+
bottomControls.add(control)
57+
injectVisibilityCheckCall()
58+
}
3859

60+
private fun injectVisibilityCheckCall() {
3961
if (!visibilityImmediateCallbacksExistModified) {
4062
visibilityImmediateCallbacksExistModified = true
4163
}
4264
}
4365

66+
private fun onTopContainerInflate(viewStub: ViewStub, root: ViewGroup) {
67+
topControlLayouts.forEach { layout ->
68+
viewStub.layoutInflater.inflate(layout, root, true)
69+
}
70+
71+
val heading = Utils.getChildViewByResourceName<View>(root, "player_video_heading")
72+
(heading.layoutParams as RelativeLayout.LayoutParams).addRule(
73+
RelativeLayout.START_OF, R.id.revanced_sb_voting_button
74+
)
75+
76+
val revancedSbCreateSegmentButton =
77+
Utils.getChildViewByResourceName<View>(root, "revanced_sb_create_segment_button")
78+
(revancedSbCreateSegmentButton.layoutParams as RelativeLayout.LayoutParams).addRule(
79+
RelativeLayout.START_OF, Utils.getResourceIdentifier("music_app_deeplink_button", "id")
80+
)
81+
82+
topControls.forEach { control ->
83+
control.initializeButton(root)
84+
}
85+
}
86+
87+
private fun onBottomContainerInflate(viewStub: ViewStub, root: ViewGroup) {
88+
bottomControlLayouts.forEach { layout ->
89+
viewStub.layoutInflater.inflate(layout, root, true)
90+
}
91+
bottomControls.forEach { control ->
92+
control.initializeButton(root)
93+
}
94+
}
95+
4496
fun YoutubeHook.PlayerControls() {
4597
DexMethod("Landroid/view/ViewStub;->inflate()Landroid/view/View;").hookMethod {
4698
after {
4799
val viewStub = it.thisObject as ViewStub
48100
val viewStubName = Utils.getContext().resources.getResourceName(viewStub.id)
49101
// Logger.printDebug { "ViewStub->inflate()" + viewStubName }
50102

51-
if (!viewStubName.endsWith("bottom_ui_container_stub"))
52-
return@after
53-
// Logger.printDebug { "inject into $viewStubName" }
54-
val viewGroup = it.result as ViewGroup
103+
when {
104+
viewStubName.endsWith("bottom_ui_container_stub") -> {
105+
onBottomContainerInflate(viewStub, it.result as ViewGroup)
106+
}
55107

56-
bottomControlLayouts.forEach { layout ->
57-
viewStub.layoutInflater.inflate(layout, viewGroup, true)
58-
}
108+
viewStubName.endsWith("controls_layout_stub") -> {
109+
onTopContainerInflate(viewStub, it.result as ViewGroup)
110+
}
59111

60-
bottomControls.forEach { bottomControl -> bottomControl.initializeButton(viewGroup) }
112+
else -> return@after
113+
}
114+
// Logger.printDebug { "inject into $viewStubName" }
61115
}
62116
}
63117

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<merge xmlns:tools="http://schemas.android.com/tools"
2+
xmlns:android="http://schemas.android.com/apk/res/android"
3+
tools:ignore="MissingClass" >
4+
5+
<com.google.android.libraries.youtube.common.ui.TouchImageView
6+
android:id="@+id/revanced_sb_voting_button"
7+
android:background="@null"
8+
android:clickable="true"
9+
android:focusable="true"
10+
android:layout_width="@dimen/controls_overlay_action_button_size"
11+
android:layout_height="@dimen/controls_overlay_action_button_size"
12+
android:layout_alignWithParentIfMissing="true"
13+
android:layout_alignParentTop="true"
14+
android:layout_marginTop="2dp"
15+
android:layout_marginEnd="4dp"
16+
android:layout_toStartOf="@+id/revanced_sb_create_segment_button"
17+
android:padding="@dimen/controls_overlay_action_button_padding"
18+
android:src="@drawable/revanced_sb_voting"
19+
/>
20+
21+
<com.google.android.libraries.youtube.common.ui.TouchImageView
22+
android:id="@+id/revanced_sb_create_segment_button"
23+
android:background="@null"
24+
android:clickable="true"
25+
android:focusable="true"
26+
android:layout_width="@dimen/controls_overlay_action_button_size"
27+
android:layout_height="@dimen/controls_overlay_action_button_size"
28+
android:layout_alignWithParentIfMissing="true"
29+
android:layout_alignParentTop="true"
30+
android:layout_marginTop="2dp"
31+
android:layout_marginEnd="4dp"
32+
android:padding="@dimen/controls_overlay_action_button_padding"
33+
android:src="@drawable/revanced_sb_logo" />
34+
</merge>

app/src/main/res/layout/revanced_sb_inline_sponsor_overlay.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@
2525
android:focusable="true"
2626
android:visibility="gone" />
2727

28-
<!-- <app.revanced.extension.youtube.sponsorblock.ui.NewSegmentLayout
28+
<app.revanced.extension.youtube.sponsorblock.ui.NewSegmentLayout
2929
android:id="@+id/revanced_sb_new_segment_view"
3030
android:layout_width="wrap_content"
3131
android:layout_height="wrap_content"
3232
android:layout_alignParentLeft="true"
3333
android:layout_alignParentBottom="true"
3434
android:layout_marginBottom="@dimen/brand_interaction_default_bottom_margin"
3535
android:focusable="true"
36-
android:visibility="gone" />-->
36+
android:visibility="gone" />
3737
</RelativeLayout>

0 commit comments

Comments
 (0)