Fix crash in AnimationDrawable

When a drawable becomes invisible, it unschedule itself, which
sets mCurrentFrame to -1. Later, when it becomes visible, it
calls setFrame() with either 0 (if 'restart' is true) or
mCurrentFrame. Calling setFrame() with a value of -1 causes a crash
later as we dereference an invalid location in the state durations
array.

This fix also checks mCurrentFrame and calls setFrame with 0 when the
current frame is invalid. This takes the code back closer to what it
used to be when setFrame was always called with 0, although now it will
use a valid frame when it is set.

Issue #16489419 Google Translate crashes whenever hitting done button on keyboard to get translation result.

Change-Id: I1f5b8672d209017aa8a4eaa15bd7ddd2f3ae38d1
This commit is contained in:
Chet Haase
2014-08-18 10:33:58 -07:00
parent 95d9ad0f79
commit 030435773d

View File

@@ -114,7 +114,9 @@ public class AnimationDrawable extends DrawableContainer implements Runnable, An
final boolean changed = super.setVisible(visible, restart);
if (visible) {
if (restart || changed) {
setFrame(restart ? 0 : mCurFrame, true, mAnimating);
boolean startFromZero = restart || mCurFrame < 0 ||
mCurFrame >= mAnimationState.getChildCount();
setFrame(startFromZero ? 0 : mCurFrame, true, mAnimating);
}
} else {
unscheduleSelf(this);