Prevent divided by zero if animation is disable

Developer could disable window animation in developer options,
but it could lead to system crash because the transform values
may divid duration time which is set to zero.

Bug: 154894010
Test: disable animation, open simlated display, resize
Change-Id: I550c309d9f684e2a5a50b4d6812703dd20a179b5
This commit is contained in:
arthurhung
2020-04-23 15:30:21 +08:00
parent d8759bb38d
commit d3b0e54819
4 changed files with 15 additions and 5 deletions

View File

@@ -382,8 +382,8 @@ class Dimmer {
@Override
public void apply(SurfaceControl.Transaction t, SurfaceControl sc, long currentPlayTime) {
float alpha = ((float) currentPlayTime / getDuration()) * (mToAlpha - mFromAlpha)
+ mFromAlpha;
final float fraction = getFraction(currentPlayTime);
final float alpha = fraction * (mToAlpha - mFromAlpha) + mFromAlpha;
t.setAlpha(sc, alpha);
}

View File

@@ -130,6 +130,16 @@ class LocalAnimationAdapter implements AnimationAdapter {
*/
default boolean needsEarlyWakeup() { return false; }
/**
* @return The fraction of the animation, returns 1 if duration is 0.
*
* @param currentPlayTime The current play time.
*/
default float getFraction(float currentPlayTime) {
final float duration = getDuration();
return duration > 0 ? currentPlayTime / duration : 1.0f;
}
void dump(PrintWriter pw, String prefix);
default void dumpDebug(ProtoOutputStream proto, long fieldId) {

View File

@@ -646,8 +646,8 @@ class ScreenRotationAnimation {
@Override
public void apply(SurfaceControl.Transaction t, SurfaceControl leash,
long currentPlayTime) {
float fraction = (float)currentPlayTime / (float)getDuration();
int color = (Integer) va.evaluate(fraction, startColor, endColor);
final float fraction = getFraction(currentPlayTime);
final int color = (Integer) va.evaluate(fraction, startColor, endColor);
Color middleColor = Color.valueOf(color);
rgbTmpFloat[0] = middleColor.red();
rgbTmpFloat[1] = middleColor.green();

View File

@@ -5595,7 +5595,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
@Override
public void apply(Transaction t, SurfaceControl leash, long currentPlayTime) {
final float fraction = (float) currentPlayTime / getDuration();
final float fraction = getFraction(currentPlayTime);
final float v = mInterpolator.getInterpolation(fraction);
t.setPosition(leash, mFrom.x + (mTo.x - mFrom.x) * v,
mFrom.y + (mTo.y - mFrom.y) * v);