blob: 77640f1992e10f48207744ce32a83b0ebc3cdbf2 [file] [log] [blame]
package com.android.systemui.animation
import android.view.View
import android.window.SurfaceSyncer
/** A util class to synchronize 2 view roots. */
// TODO(b/200284684): Remove this class.
object ViewRootSync {
private var surfaceSyncer: SurfaceSyncer? = null
/**
* Synchronize the next draw between the view roots of [view] and [otherView], then run [then].
*
* Note that in some cases, the synchronization might not be possible (e.g. WM consumed the next
* transactions) or disabled (temporarily, on low ram devices). In this case, [then] will be
* called without synchronizing.
*/
fun synchronizeNextDraw(view: View, otherView: View, then: () -> Unit) {
if (
!view.isAttachedToWindow ||
view.viewRootImpl == null ||
!otherView.isAttachedToWindow ||
otherView.viewRootImpl == null ||
view.viewRootImpl == otherView.viewRootImpl
) {
// No need to synchronize if either the touch surface or dialog view is not attached
// to a window.
then()
return
}
surfaceSyncer =
SurfaceSyncer().apply {
val syncId = setupSync(Runnable { then() })
addToSync(syncId, view)
addToSync(syncId, otherView)
markSyncReady(syncId)
}
}
/** A Java-friendly API for [synchronizeNextDraw]. */
@JvmStatic
fun synchronizeNextDraw(view: View, otherView: View, then: Runnable) {
synchronizeNextDraw(view, otherView, then::run)
}
}