From d3b0e54819a2823f8dfe1ab4bafec2038959e7a9 Mon Sep 17 00:00:00 2001 From: arthurhung Date: Thu, 23 Apr 2020 15:30:21 +0800 Subject: [PATCH] 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 --- services/core/java/com/android/server/wm/Dimmer.java | 4 ++-- .../com/android/server/wm/LocalAnimationAdapter.java | 10 ++++++++++ .../com/android/server/wm/ScreenRotationAnimation.java | 4 ++-- .../core/java/com/android/server/wm/WindowState.java | 2 +- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/wm/Dimmer.java b/services/core/java/com/android/server/wm/Dimmer.java index 537ca08f49fcc..5efc9241a494b 100644 --- a/services/core/java/com/android/server/wm/Dimmer.java +++ b/services/core/java/com/android/server/wm/Dimmer.java @@ -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); } diff --git a/services/core/java/com/android/server/wm/LocalAnimationAdapter.java b/services/core/java/com/android/server/wm/LocalAnimationAdapter.java index 7c1a6161236af..f0629fa953fc1 100644 --- a/services/core/java/com/android/server/wm/LocalAnimationAdapter.java +++ b/services/core/java/com/android/server/wm/LocalAnimationAdapter.java @@ -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) { diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java index 86e0818545978..90936efe67157 100644 --- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java @@ -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(); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 706dcba31cfeb..912fdbf0a4cac 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -5595,7 +5595,7 @@ class WindowState extends WindowContainer 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);