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

Commit 3a367c4b authored by Rob Carr's avatar Rob Carr
Browse files

InsetAnimationControlImpl: Copy SurfaceControl

This way the lifetime can be bound to the animation. Otherwise
the InsetController owns the lifetime, and it can be challenging
to synchronize the two (we would need to update all the running
animations when we rebuild the control list).

Bug: 150918857
Test: Existing tests pass
Change-Id: I86017b2eaee29ab0d8174479d187c9b7dd014305
parent d56c782f
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -56,4 +56,10 @@ public interface InsetsAnimationControlCallbacks {
     *               apply.
     */
    void applySurfaceParams(SyncRtSurfaceTransactionApplier.SurfaceParams... params);

    /**
     * Post a message to release the Surface, guaranteed to happen after all
     * previous calls to applySurfaceParams.
     */
    void releaseSurfaceControlFromRt(SurfaceControl sc);
}
+12 −0
Original line number Diff line number Diff line
@@ -180,10 +180,19 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
        mAnimation.setAlpha(mPendingAlpha);
        if (mFinished) {
            mController.notifyFinished(this, mShownOnFinish);
            releaseLeashes();
        }
        return mFinished;
    }

    private void releaseLeashes() {
        for (int i = mControls.size() - 1; i >= 0; i--) {
            final InsetsSourceControl c = mControls.valueAt(i);
            if (c == null) continue;
            c.release(mController::releaseSurfaceControlFromRt);
        }
    }

    @Override
    public void finish(boolean shown) {
        if (mCancelled || mFinished) {
@@ -191,6 +200,7 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
        }
        setInsetsAndAlpha(shown ? mShownInsets : mHiddenInsets, 1f /* alpha */, 1f /* fraction */);
        mFinished = true;

        mShownOnFinish = shown;
    }

@@ -207,6 +217,8 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll
        }
        mCancelled = true;
        mListener.onCancelled();

        releaseLeashes();
    }

    public boolean isCancelled() {
+6 −0
Original line number Diff line number Diff line
@@ -75,6 +75,12 @@ public class InsetsAnimationThreadControlRunner implements InsetsAnimationContro
            t.apply();
            t.close();
        }

        @Override
        public void releaseSurfaceControlFromRt(SurfaceControl sc) {
            // Since we don't push the SurfaceParams to the RT we can release directly
            sc.release();
        }
    };

    @UiThread
+1 −1
Original line number Diff line number Diff line
@@ -704,7 +704,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
            }
            final InsetsSourceControl control = consumer.getControl();
            if (control != null) {
                controls.put(consumer.getType(), control);
                controls.put(consumer.getType(), new InsetsSourceControl(control));
                typesReady |= toPublicType(consumer.getType());
            } else if (animationType == ANIMATION_TYPE_SHOW) {

+7 −0
Original line number Diff line number Diff line
@@ -409,6 +409,13 @@ class InsetsPolicy {
                t.close();
            }

            // Since we don't push applySurfaceParams to a Handler-queue we don't need
            // to push release in this case.
            @Override
            public void releaseSurfaceControlFromRt(SurfaceControl sc) {
                sc.release();
            }

            @Override
            public void startAnimation(InsetsAnimationControlImpl controller,
                    WindowInsetsAnimationControlListener listener, int types,