revanced-integrations/app/src/main/java/app/revanced/integrations/youtube/shared/PlayerOverlays.kt

98 lines
2.9 KiB
Kotlin

package app.revanced.integrations.youtube.shared
import android.view.View
import android.view.ViewGroup
import app.revanced.integrations.youtube.Event
import app.revanced.integrations.youtube.swipecontrols.misc.Rectangle
/**
* hooking class for player overlays
*/
@Suppress("MemberVisibilityCanBePrivate")
object PlayerOverlays {
/**
* called when the overlays finished inflating
*/
val onInflate = Event<ViewGroup>()
/**
* called when new children are added or removed from the overlay
*/
val onChildrenChange = Event<ChildrenChangeEventArgs>()
/**
* called when the overlay layout changes
*/
val onLayoutChange = Event<LayoutChangeEventArgs>()
/**
* start listening for events on the provided view group
*
* @param overlaysLayout the overlays view group
*/
@JvmStatic
fun attach(overlaysLayout: ViewGroup) {
onInflate.invoke(overlaysLayout)
overlaysLayout.setOnHierarchyChangeListener(object :
ViewGroup.OnHierarchyChangeListener {
override fun onChildViewAdded(parent: View?, child: View?) {
if (parent is ViewGroup && child is View) {
onChildrenChange(
ChildrenChangeEventArgs(
parent,
child,
false
)
)
}
}
override fun onChildViewRemoved(parent: View?, child: View?) {
if (parent is ViewGroup && child is View) {
onChildrenChange(
ChildrenChangeEventArgs(
parent,
child,
true
)
)
}
}
})
overlaysLayout.addOnLayoutChangeListener { view, newLeft, newTop, newRight, newBottom, oldLeft, oldTop, oldRight, oldBottom ->
if (view is ViewGroup) {
onLayoutChange(
LayoutChangeEventArgs(
view,
Rectangle(
oldLeft,
oldTop,
oldRight - oldLeft,
oldBottom - oldTop
),
Rectangle(
newLeft,
newTop,
newRight - newLeft,
newBottom - newTop
)
)
)
}
}
}
}
data class ChildrenChangeEventArgs(
val overlaysLayout: ViewGroup,
val childView: View,
val wasChildRemoved: Boolean
)
data class LayoutChangeEventArgs(
val overlaysLayout: ViewGroup,
val oldRect: Rectangle,
val newRect: Rectangle
)