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

Commit 49e0b395 authored by Alan Viverette's avatar Alan Viverette Committed by android-build-merger
Browse files

Merge "Prevent LayerDrawable bounds updates from being re-entrant" into nyc-dev am: 5c944421

am: 64432a51

* commit '64432a51':
  Prevent LayerDrawable bounds updates from being re-entrant

Change-Id: I09ad57a573d8e6e5dfc23bb6794af3755a66fac3
parents 79a34d4c 64432a51
Loading
Loading
Loading
Loading
+41 −1
Original line number Diff line number Diff line
@@ -104,6 +104,9 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
    private Rect mHotspotBounds;
    private boolean mMutated;

    private boolean mSuspendChildInvalidation;
    private boolean mChildRequestedInvalidation;

    /**
     * Creates a new layer drawable with the list of specified layers.
     *
@@ -944,10 +947,38 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
      return mLayerState.mPaddingMode;
    }

    /**
     * Temporarily suspends child invalidation.
     *
     * @see #resumeChildInvalidation()
     */
    private void suspendChildInvalidation() {
        mSuspendChildInvalidation = true;
    }

    /**
     * Resumes child invalidation after suspension, immediately performing an
     * invalidation if one was requested by a child during suspension.
     *
     * @see #suspendChildInvalidation()
     */
    private void resumeChildInvalidation() {
        mSuspendChildInvalidation = false;

        if (mChildRequestedInvalidation) {
            mChildRequestedInvalidation = false;
            invalidateSelf();
        }
    }

    @Override
    public void invalidateDrawable(@NonNull Drawable who) {
        if (mSuspendChildInvalidation) {
            mChildRequestedInvalidation = true;
        } else {
            invalidateSelf();
        }
    }

    @Override
    public void scheduleDrawable(@NonNull Drawable who, @NonNull Runnable what, long when) {
@@ -1482,6 +1513,15 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
    }

    private void updateLayerBounds(Rect bounds) {
        try {
            suspendChildInvalidation();
            updateLayerBoundsInternal(bounds);
        } finally {
            resumeChildInvalidation();
        }
    }

    private void updateLayerBoundsInternal(Rect bounds) {
        int paddingL = 0;
        int paddingT = 0;
        int paddingR = 0;