@@ -4,22 +4,28 @@ import android.content.Context
44import android.graphics.Canvas
55import android.graphics.Rect
66import android.view.ViewGroup
7- import android.widget.FrameLayout
87import app.revanced.extension.shared.Utils
98import app.revanced.extension.youtube.sponsorblock.SegmentPlaybackController
9+ import app.revanced.extension.youtube.sponsorblock.ui.CreateSegmentButton
1010import app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockAboutPreference
1111import app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockPreferenceGroup
1212import app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockStatsPreferenceCategory
1313import app.revanced.extension.youtube.sponsorblock.ui.SponsorBlockViewController
14+ import app.revanced.extension.youtube.sponsorblock.ui.VotingButton
15+ import io.github.chsbuffer.revancedxposed.R
1416import io.github.chsbuffer.revancedxposed.addModuleAssets
1517import io.github.chsbuffer.revancedxposed.scopedHook
1618import io.github.chsbuffer.revancedxposed.setObjectField
1719import io.github.chsbuffer.revancedxposed.shared.misc.settings.preference.NonInteractivePreference
1820import io.github.chsbuffer.revancedxposed.shared.misc.settings.preference.PreferenceCategory
1921import io.github.chsbuffer.revancedxposed.shared.misc.settings.preference.PreferenceScreenPreference
2022import io.github.chsbuffer.revancedxposed.youtube.YoutubeHook
23+ import io.github.chsbuffer.revancedxposed.youtube.misc.ControlInitializer
24+ import io.github.chsbuffer.revancedxposed.youtube.misc.PlayerControls
2125import io.github.chsbuffer.revancedxposed.youtube.misc.PlayerTypeHook
2226import 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
2329import io.github.chsbuffer.revancedxposed.youtube.video.VideoIdPatch
2430import io.github.chsbuffer.revancedxposed.youtube.video.VideoInformationHook
2531import 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!!
0 commit comments