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

Commit 323596de authored by Alan Viverette's avatar Alan Viverette
Browse files

Pull out dirty bounds before nulling ripples

BUG: 14378485
Change-Id: I286374db9865d2338852fd0df896928099a8eb24
parent 2a56ef70
Loading
Loading
Loading
Loading
+25 −20
Original line number Diff line number Diff line
@@ -501,10 +501,32 @@ public class TouchFeedbackDrawable extends LayerDrawable {
    }

    private int drawRippleLayer(Canvas canvas, Rect bounds, boolean maskOnly) {
        final Ripple[] activeRipples = mActiveRipples;
        final int ripplesCount = mActiveRipplesCount;
        if (ripplesCount == 0) {
            return -1;
        }

        final Ripple[] activeRipples = mActiveRipples;
        final boolean projected = isProjected();
        final Rect layerBounds = projected ? getDirtyBounds() : bounds;

        // Separate the ripple color and alpha channel. The alpha will be
        // applied when we merge the ripples down to the canvas.
        final int rippleColor;
        if (mState.mTint != null) {
            rippleColor = mState.mTint.getColorForState(getState(), Color.TRANSPARENT);
        } else {
            rippleColor = Color.TRANSPARENT;
        }
        final int rippleAlpha = Color.alpha(rippleColor);

        if (mRipplePaint == null) {
            mRipplePaint = new Paint();
            mRipplePaint.setAntiAlias(true);
        }
        final Paint ripplePaint = mRipplePaint;
        ripplePaint.setColor(rippleColor);

        Paint ripplePaint = null;
        boolean drewRipples = false;
        int restoreToCount = -1;
        int activeRipplesCount = 0;
@@ -524,20 +546,9 @@ public class TouchFeedbackDrawable extends LayerDrawable {
            // If we're masking the ripple layer, make sure we have a layer
            // first. This will merge SRC_OVER (directly) onto the canvas.
            if (restoreToCount < 0) {
                // Separate the ripple color and alpha channel. The alpha will be
                // applied when we merge the ripples down to the canvas.
                final int rippleColor;
                if (mState.mTint != null) {
                    rippleColor = mState.mTint.getColorForState(getState(), Color.TRANSPARENT);
                } else {
                    rippleColor = Color.TRANSPARENT;
                }
                final int rippleAlpha = Color.alpha(rippleColor);

                // If we're projecting or we only have a mask, we want to treat the
                // underlying canvas as our content and merge the ripple layer down
                // using the tint xfermode.
                final boolean projected = isProjected();
                final PorterDuffXfermode xfermode;
                if (projected || maskOnly) {
                    xfermode = mState.getTintXfermode();
@@ -547,18 +558,12 @@ public class TouchFeedbackDrawable extends LayerDrawable {

                final Paint layerPaint = getMaskingPaint(xfermode);
                layerPaint.setAlpha(rippleAlpha);
                final Rect layerBounds = projected ? getDirtyBounds() : bounds;
                restoreToCount = canvas.saveLayer(layerBounds.left, layerBounds.top,
                        layerBounds.right, layerBounds.bottom, layerPaint);
                layerPaint.setAlpha(255);
            }

            if (mRipplePaint == null) {
                mRipplePaint = new Paint();
                mRipplePaint.setAntiAlias(true);
            }

            drewRipples |= ripple.draw(canvas, mRipplePaint);
            drewRipples |= ripple.draw(canvas, ripplePaint);

            activeRipples[activeRipplesCount] = activeRipples[i];
            activeRipplesCount++;