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
This commit is contained in:
Rob Carr
2020-03-10 15:51:35 -07:00
parent d56c782f8d
commit 3a367c4bab
5 changed files with 32 additions and 1 deletions

View File

@@ -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);
}

View File

@@ -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() {

View File

@@ -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

View File

@@ -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) {

View File

@@ -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,