Ensure that ghosted view is attached when calculating its matrix.

This CL ensures that the ghosted view is attached to a ViewGroup before
calculating the matrix of that view. It could happen that the view would
be detached after the animation was started, which would then crash
SysUI when calling GhostView.calculateMatrix.

I tested this CL manually by first reproducing this b/202668591 by
detaching ghostedView from its parent after the animation started, and
then confirmed that this fix prevents the animation from crashing.

Test: Manual
Bug: 202668591
Fixes: 202668591
Change-Id: I7bf0bedb4860a00f1c44cac9258ff5dc753fb355
This commit is contained in:
Jordan Demeulenaere
2021-10-13 16:44:05 +02:00
parent 837add11c3
commit d2dc31332a

View File

@@ -209,8 +209,13 @@ open class GhostedViewLaunchAnimatorController(
val heightRatio = state.height.toFloat() / ghostedViewState.height
val scale = min(widthRatio, heightRatio)
if (ghostedView.parent is ViewGroup) {
// Recalculate the matrix in case the ghosted view moved. We ensure that the ghosted
// view is still attached to a ViewGroup, otherwise calculateMatrix will throw.
GhostView.calculateMatrix(ghostedView, launchContainer, ghostViewMatrix)
}
launchContainer.getLocationOnScreen(launchContainerLocation)
GhostView.calculateMatrix(ghostedView, launchContainer, ghostViewMatrix)
ghostViewMatrix.postScale(
scale, scale,
ghostedViewState.centerX - launchContainerLocation[0],