davidliu
Committed by GitHub

Listen to scroll changes for video sink visibility (#231)

@@ -84,10 +84,11 @@ class ViewVisibility(private val view: View) : VideoSinkVisibility() { @@ -84,10 +84,11 @@ class ViewVisibility(private val view: View) : VideoSinkVisibility() {
84 84
85 private val handler = Handler(Looper.getMainLooper()) 85 private val handler = Handler(Looper.getMainLooper())
86 private val globalLayoutListener = ViewTreeObserver.OnGlobalLayoutListener { 86 private val globalLayoutListener = ViewTreeObserver.OnGlobalLayoutListener {
87 - handler.removeCallbacksAndMessages(null)  
88 - handler.postDelayed({  
89 - recalculate()  
90 - }, 2000) 87 + scheduleRecalculate()
  88 + }
  89 +
  90 + private val scrollListener = ViewTreeObserver.OnScrollChangedListener {
  91 + scheduleRecalculate()
91 } 92 }
92 93
93 interface Notifier { 94 interface Notifier {
@@ -96,6 +97,7 @@ class ViewVisibility(private val view: View) : VideoSinkVisibility() { @@ -96,6 +97,7 @@ class ViewVisibility(private val view: View) : VideoSinkVisibility() {
96 97
97 init { 98 init {
98 view.viewTreeObserver.addOnGlobalLayoutListener(globalLayoutListener) 99 view.viewTreeObserver.addOnGlobalLayoutListener(globalLayoutListener)
  100 + view.viewTreeObserver.addOnScrollChangedListener(scrollListener)
99 if (view is Notifier) { 101 if (view is Notifier) {
100 view.viewVisibility = this 102 view.viewVisibility = this
101 } 103 }
@@ -105,6 +107,13 @@ class ViewVisibility(private val view: View) : VideoSinkVisibility() { @@ -105,6 +107,13 @@ class ViewVisibility(private val view: View) : VideoSinkVisibility() {
105 private val viewRect = Rect() 107 private val viewRect = Rect()
106 private val windowRect = Rect() 108 private val windowRect = Rect()
107 109
  110 + private fun scheduleRecalculate() {
  111 + handler.removeCallbacksAndMessages(null)
  112 + handler.postDelayed({
  113 + recalculate()
  114 + }, 2000)
  115 + }
  116 +
108 fun recalculate() { 117 fun recalculate() {
109 var shouldNotify = false 118 var shouldNotify = false
110 val newVisibility = isVisible() 119 val newVisibility = isVisible()
@@ -154,6 +163,7 @@ class ViewVisibility(private val view: View) : VideoSinkVisibility() { @@ -154,6 +163,7 @@ class ViewVisibility(private val view: View) : VideoSinkVisibility() {
154 override fun close() { 163 override fun close() {
155 super.close() 164 super.close()
156 handler.removeCallbacksAndMessages(null) 165 handler.removeCallbacksAndMessages(null)
  166 + view.viewTreeObserver.removeOnScrollChangedListener(scrollListener)
157 view.viewTreeObserver.removeOnGlobalLayoutListener(globalLayoutListener) 167 view.viewTreeObserver.removeOnGlobalLayoutListener(globalLayoutListener)
158 if (view is Notifier && view.viewVisibility == this) { 168 if (view is Notifier && view.viewVisibility == this) {
159 view.viewVisibility = null 169 view.viewVisibility = null