Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0f4d5df5 authored by Svetoslav Ganov's avatar Svetoslav Ganov Committed by Android (Google) Code Review
Browse files

Merge "View's visibility to the user not checking predecessor alpha." into jb-mr1-dev

parents c87f198b 11f19f15
Loading
Loading
Loading
Loading
+24 −13
Original line number Diff line number Diff line
@@ -5088,24 +5088,35 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
     */
    protected boolean isVisibleToUser(Rect boundInView) {
        if (mAttachInfo != null) {
            // Attached to invisible window means this view is not visible.
            if (mAttachInfo.mWindowVisibility != View.VISIBLE) {
                return false;
            }
            // An invisible predecessor or one with alpha zero means
            // that this view is not visible to the user.
            Object current = this;
            while (current instanceof View) {
                View view = (View) current;
                // We have attach info so this view is attached and there is no
                // need to check whether we reach to ViewRootImpl on the way up.
                if (view.getAlpha() <= 0 || view.getVisibility() != VISIBLE) {
                    return false;
                }
                current = view.mParent;
            }
            // Check if the view is entirely covered by its predecessors.
            Rect visibleRect = mAttachInfo.mTmpInvalRect;
            Point offset = mAttachInfo.mPoint;
            // The first two checks are made also made by isShown() which
            // however traverses the tree up to the parent to catch that.
            // Therefore, we do some fail fast check to minimize the up
            // tree traversal.
            boolean isVisible = mAttachInfo.mWindowVisibility == View.VISIBLE
                && getAlpha() > 0
                && isShown()
                && getGlobalVisibleRect(visibleRect, offset);
            if (isVisible && boundInView != null) {
            if (!getGlobalVisibleRect(visibleRect, offset)) {
                return false;
            }
            // Check if the visible portion intersects the rectangle of interest.
            if (boundInView != null) {
                visibleRect.offset(-offset.x, -offset.y);
                // isVisible is always true here, use a simple assignment
                isVisible = boundInView.intersect(visibleRect);
                return boundInView.intersect(visibleRect);
            }
            return isVisible;
            return true;
        }
        return false;
    }