From 6e73e0b395e71f9c30afb1e0d4390ac80b389170 Mon Sep 17 00:00:00 2001 From: Alexander-- Date: Wed, 22 Jul 2020 06:07:30 +0659 Subject: [PATCH] Use View.isShown() to avoid focus overlay glitches A View can become focused while being invisible, if it's parent is invisible. Use global draw listener and View.isShown() to catch such cases. --- .../newpipe/views/FocusOverlayView.java | 31 ++++++------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/views/FocusOverlayView.java b/app/src/main/java/org/schabi/newpipe/views/FocusOverlayView.java index 1c868f66a..3d9dbc16a 100644 --- a/app/src/main/java/org/schabi/newpipe/views/FocusOverlayView.java +++ b/app/src/main/java/org/schabi/newpipe/views/FocusOverlayView.java @@ -74,44 +74,26 @@ public final class FocusOverlayView extends Drawable implements @Override public void onGlobalFocusChanged(final View oldFocus, final View newFocus) { - int l = focusRect.left; - int r = focusRect.right; - int t = focusRect.top; - int b = focusRect.bottom; - - if (newFocus != null && newFocus.getWidth() > 0 && newFocus.getHeight() > 0) { - newFocus.getGlobalVisibleRect(focusRect); - + if (newFocus != null) { focused = new WeakReference<>(newFocus); } else { - focusRect.setEmpty(); - focused = null; } - if (l != focusRect.left || r != focusRect.right - || t != focusRect.top || b != focusRect.bottom) { - invalidateSelf(); - } - - focused = new WeakReference<>(newFocus); + updateRect(); animator.sendEmptyMessageDelayed(0, 1000); } private void updateRect() { - if (focused == null) { - return; - } - - View focusedView = this.focused.get(); + View focusedView = focused == null ? null : this.focused.get(); int l = focusRect.left; int r = focusRect.right; int t = focusRect.top; int b = focusRect.bottom; - if (focusedView != null) { + if (focusedView != null && isShown(focusedView)) { focusedView.getGlobalVisibleRect(focusRect); } else { focusRect.setEmpty(); @@ -123,6 +105,10 @@ public final class FocusOverlayView extends Drawable implements } } + private boolean isShown(final View view) { + return view.getWidth() != 0 && view.getHeight() != 0 && view.isShown(); + } + @Override public void onDraw() { updateRect(); @@ -223,6 +209,7 @@ public final class FocusOverlayView extends Drawable implements observer.addOnGlobalFocusChangeListener(overlay); observer.addOnGlobalLayoutListener(overlay); observer.addOnTouchModeChangeListener(overlay); + observer.addOnDrawListener(overlay); overlay.setCurrentFocus(decor.getFocusedChild());