2024-01-01 16:33:20 +01:00
|
|
|
package app.revanced.integrations.youtube.shared
|
2022-07-14 17:18:53 +02:00
|
|
|
|
|
|
|
import android.view.View
|
|
|
|
import android.view.ViewGroup
|
2024-01-01 16:33:20 +01:00
|
|
|
import app.revanced.integrations.youtube.Event
|
2024-03-03 00:15:00 +01:00
|
|
|
import app.revanced.integrations.youtube.swipecontrols.misc.Rectangle
|
2022-07-14 17:18:53 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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,
|
2024-04-01 00:34:46 +02:00
|
|
|
false
|
|
|
|
)
|
2022-07-14 17:18:53 +02:00
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onChildViewRemoved(parent: View?, child: View?) {
|
|
|
|
if (parent is ViewGroup && child is View) {
|
|
|
|
onChildrenChange(
|
|
|
|
ChildrenChangeEventArgs(
|
|
|
|
parent,
|
|
|
|
child,
|
2024-04-01 00:34:46 +02:00
|
|
|
true
|
|
|
|
)
|
2022-07-14 17:18:53 +02:00
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
overlaysLayout.addOnLayoutChangeListener { view, newLeft, newTop, newRight, newBottom, oldLeft, oldTop, oldRight, oldBottom ->
|
|
|
|
if (view is ViewGroup) {
|
|
|
|
onLayoutChange(
|
|
|
|
LayoutChangeEventArgs(
|
|
|
|
view,
|
|
|
|
Rectangle(
|
|
|
|
oldLeft,
|
|
|
|
oldTop,
|
|
|
|
oldRight - oldLeft,
|
2024-04-01 00:34:46 +02:00
|
|
|
oldBottom - oldTop
|
2022-07-14 17:18:53 +02:00
|
|
|
),
|
|
|
|
Rectangle(
|
|
|
|
newLeft,
|
|
|
|
newTop,
|
|
|
|
newRight - newLeft,
|
2024-04-01 00:34:46 +02:00
|
|
|
newBottom - newTop
|
|
|
|
)
|
|
|
|
)
|
2022-07-14 17:18:53 +02:00
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
data class ChildrenChangeEventArgs(
|
|
|
|
val overlaysLayout: ViewGroup,
|
|
|
|
val childView: View,
|
2024-04-01 00:34:46 +02:00
|
|
|
val wasChildRemoved: Boolean
|
2022-07-14 17:18:53 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
data class LayoutChangeEventArgs(
|
|
|
|
val overlaysLayout: ViewGroup,
|
|
|
|
val oldRect: Rectangle,
|
2024-04-01 00:34:46 +02:00
|
|
|
val newRect: Rectangle
|
2022-07-14 17:18:53 +02:00
|
|
|
)
|