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

Commit 7622f46c authored by Alan Viverette's avatar Alan Viverette Committed by Android (Google) Code Review
Browse files

Merge "Draw accessibility focus in View rather than ViewRootImpl" into lmp-dev

parents 4ba3c373 997aa406
Loading
Loading
Loading
Loading
+46 −0
Original line number Diff line number Diff line
@@ -13831,6 +13831,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
                    } else {
                        draw(canvas);
                    }
                    drawAccessibilityFocus(canvas);
                }
            } finally {
                renderNode.end(canvas);
@@ -14125,6 +14126,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
            } else {
                draw(canvas);
            }
            drawAccessibilityFocus(canvas);
            canvas.restoreToCount(restoreCount);
            canvas.setBitmap(null);
@@ -14199,6 +14201,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
        } else {
            draw(canvas);
        }
        drawAccessibilityFocus(canvas);
        mPrivateFlags = flags;
@@ -14792,9 +14795,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
                    if ((mPrivateFlags & PFLAG_SKIP_DRAW) == PFLAG_SKIP_DRAW) {
                        mPrivateFlags &= ~PFLAG_DIRTY_MASK;
                        dispatchDraw(canvas);
                        if (mOverlay != null && !mOverlay.isEmpty()) {
                            mOverlay.getOverlayView().draw(canvas);
                        }
                    } else {
                        draw(canvas);
                    }
                    drawAccessibilityFocus(canvas);
                } else {
                    mPrivateFlags &= ~PFLAG_DIRTY_MASK;
                    ((HardwareCanvas) canvas).drawRenderNode(renderNode, null, flags);
@@ -15045,6 +15052,45 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
        }
    }
    /**
     * Draws the accessibility focus rect onto the specified canvas.
     *
     * @param canvas Canvas on which to draw the focus rect
     */
    private void drawAccessibilityFocus(Canvas canvas) {
        if (mAttachInfo == null) {
            return;
        }
        final Rect bounds = mAttachInfo.mTmpInvalRect;
        final ViewRootImpl viewRoot = getViewRootImpl();
        if (viewRoot == null || viewRoot.getAccessibilityFocusedHost() != this) {
            return;
        }
        final AccessibilityManager manager = AccessibilityManager.getInstance(mContext);
        if (!manager.isEnabled() || !manager.isTouchExplorationEnabled()) {
            return;
        }
        final Drawable drawable = viewRoot.getAccessibilityFocusedDrawable();
        if (drawable == null) {
            return;
        }
        final AccessibilityNodeInfo virtualView = viewRoot.getAccessibilityFocusedVirtualView();
        if (virtualView != null) {
            virtualView.getBoundsInParent(bounds);
        } else {
            bounds.set(0, 0, mRight - mLeft, mBottom - mTop);
        }
        canvas.translate(mScrollX, mScrollY);
        drawable.setBounds(bounds);
        drawable.draw(canvas);
        canvas.translate(-mScrollX, -mScrollY);
    }
    /**
     * Draws the background onto the specified canvas.
     *
+2 −68
Original line number Diff line number Diff line
@@ -2244,7 +2244,6 @@ public final class ViewRootImpl implements ViewParent,
            canvas.drawHardwareLayer(mResizeBuffer, mHardwareXOffset, mHardwareYOffset,
                    mResizePaint);
        }
        drawAccessibilityFocusedDrawableIfNeeded(canvas);
    }

    /**
@@ -2462,25 +2461,9 @@ public final class ViewRootImpl implements ViewParent,
                if (mHardwareYOffset != yOffset || mHardwareXOffset != xOffset) {
                    mHardwareYOffset = yOffset;
                    mHardwareXOffset = xOffset;
                    invalidateRoot = true;
                }
                mResizeAlpha = resizeAlpha;

                if (!invalidateRoot) {
                    // If accessibility focus moved, invalidate the root.
                    final Drawable drawable = mAttachInfo.mAccessibilityFocusDrawable;
                    if (drawable != null) {
                        final Rect bounds = mAttachInfo.mTmpInvalRect;
                        if (getAccessibilityFocusedRect(bounds)
                                && !bounds.equals(drawable.getBounds())) {
                            invalidateRoot = true;
                        }
                    }
                }

                if (invalidateRoot) {
                    mAttachInfo.mHardwareRenderer.invalidateRoot();
                }
                mResizeAlpha = resizeAlpha;

                dirty.setEmpty();

@@ -2600,8 +2583,6 @@ public final class ViewRootImpl implements ViewParent,
                attachInfo.mSetIgnoreDirtyState = false;

                mView.draw(canvas);

                drawAccessibilityFocusedDrawableIfNeeded(canvas);
            } finally {
                if (!attachInfo.mSetIgnoreDirtyState) {
                    // Only clear the flag if it was not set during the mView.draw() call
@@ -2625,54 +2606,7 @@ public final class ViewRootImpl implements ViewParent,
        return true;
    }

    /**
     * We want to draw a highlight around the current accessibility focused.
     * Since adding a style for all possible view is not a viable option we
     * have this specialized drawing method.
     *
     * Note: We are doing this here to be able to draw the highlight for
     *       virtual views in addition to real ones.
     *
     * @param canvas The canvas on which to draw.
     */
    private void drawAccessibilityFocusedDrawableIfNeeded(Canvas canvas) {
        final Rect bounds = mAttachInfo.mTmpInvalRect;
        if (getAccessibilityFocusedRect(bounds)) {
            final Drawable drawable = getAccessibilityFocusedDrawable();
            if (drawable != null) {
                drawable.setBounds(bounds);
                drawable.draw(canvas);
            }
        }
    }

    private boolean getAccessibilityFocusedRect(Rect bounds) {
        final AccessibilityManager manager = AccessibilityManager.getInstance(mView.mContext);
        if (!manager.isEnabled() || !manager.isTouchExplorationEnabled()) {
            return false;
        }

        final View host = mAccessibilityFocusedHost;
        if (host == null || host.mAttachInfo == null) {
            return false;
        }

        final AccessibilityNodeProvider provider = host.getAccessibilityNodeProvider();
        if (provider == null) {
            host.getBoundsOnScreen(bounds);
        } else if (mAccessibilityFocusedVirtualView != null) {
            mAccessibilityFocusedVirtualView.getBoundsInScreen(bounds);
        } else {
            return false;
        }

        final AttachInfo attachInfo = mAttachInfo;
        bounds.offset(-attachInfo.mWindowLeft, -attachInfo.mWindowTop);
        bounds.intersect(0, 0, attachInfo.mViewRootImpl.mWidth, attachInfo.mViewRootImpl.mHeight);
        return true;
    }

    private Drawable getAccessibilityFocusedDrawable() {
    Drawable getAccessibilityFocusedDrawable() {
        // Lazily load the accessibility focus drawable.
        if (mAttachInfo.mAccessibilityFocusDrawable == null) {
            final TypedValue value = new TypedValue();