focus on:
applyAnimations(openingWcs, openingApps, transit, true /* visible */, animLp,
voiceInteraction);
SurfaceAnimator
mSurfaceAnimator.startAnimation
windowEnterAnimation
// applyAnimations(openingWcs, openingApps, transit, true /* visible /, animLp,
// voiceInteraction);
// applyAnimations(closingWcs, closingApps, transit, false / visible */, animLp,
// voiceInteraction);
WindowContainer: which window is animating now ?
1. WindowContainer#startAnimation()
2. SurfaceAnimator#startAnimation()
1. WindowState#startAnimation()
2. WindowStateAnimator#applyEnterAnimationLocked()
void scheduleAnimationLocked() {
mAnimator.scheduleAnimation();
}
void scheduleAnimation() {
if (!mAnimationFrameCallbackScheduled) {
mAnimationFrameCallbackScheduled = true;
mChoreographer.postFrameCallback(mAnimationFrameCallback);
}
}
mAnimationFrameCallback = frameTimeNs -> {
synchronized (mService.mGlobalLock) {
mAnimationFrameCallbackScheduled = false;
final long vsyncId = mChoreographer.getVsyncId();
animate(frameTimeNs, vsyncId);
if (mNotifyWhenNoAnimation && !mLastRootAnimating) {
mService.mGlobalLock.notifyAll();
}
}
};
applyAnimations(mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps, transit,
animLp, voiceInteraction);
finally calls :
SurfaceAnimationRunner#startAnimationLocked()
WindowAnimationSpec#apply()