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

Commit ee6c6ae5 authored by Svetoslav Ganov's avatar Svetoslav Ganov
Browse files

Fixing implementation of View.requestRectangleOnScreen(Rect, boolean).

1. The implementation was not taking into account the transformation
   matrices if the views.

2. The rectangle that was passed as an argument to
   ViewParent.requestChildRectangleOnScreen was modified by
   some implementations - now care is taken to prevent it.

3. The scroll of child was used when a rectangle of its coordinate
   system was mapped to one in the parent system. However, the
   scroll shows how much a parent has scrolled its descendants, so
   the scroll of the parent has to be used not the child.

bug:7139556

Change-Id: I5b09eb7f105047e95282f74308968d5465831c84
parent 36e614c1
Loading
Loading
Loading
Loading
+22 −6
Original line number Diff line number Diff line
@@ -39,7 +39,6 @@ import android.graphics.Region;
import android.graphics.Shader;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManagerGlobal;
import android.os.Bundle;
import android.os.Handler;
@@ -4275,25 +4274,42 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
     * @return Whether any parent scrolled.
     */
    public boolean requestRectangleOnScreen(Rect rectangle, boolean immediate) {
        if (mAttachInfo == null) {
            return false;
        }
        View child = this;
        RectF position = mAttachInfo.mTmpTransformRect;
        position.set(rectangle);
        ViewParent parent = mParent;
        boolean scrolled = false;
        while (parent != null) {
            rectangle.set((int) position.left, (int) position.top,
                    (int) position.right, (int) position.bottom);
            scrolled |= parent.requestChildRectangleOnScreen(child,
                    rectangle, immediate);
            // offset rect so next call has the rectangle in the
            // coordinate system of its direct child.
            rectangle.offset(child.getLeft(), child.getTop());
            rectangle.offset(-child.getScrollX(), -child.getScrollY());
            if (!child.hasIdentityMatrix()) {
                child.getMatrix().mapRect(position);
            }
            position.offset(child.mLeft, child.mTop);
            if (!(parent instanceof View)) {
                break;
            }
            child = (View) parent;
            View parentView = (View) parent;
            position.offset(-parentView.getScrollX(), -parentView.getScrollY());
            child = parentView;
            parent = child.getParent();
        }
        return scrolled;
    }