diff options
| author | 2010-11-04 21:06:31 -0700 | |
|---|---|---|
| committer | 2010-11-05 13:05:27 -0700 | |
| commit | ec6ac82a295b80a39f12ff7951ec254ba45809fd (patch) | |
| tree | b4a65529b78af92ce7b517fbbf46b5bb1c8661dd | |
| parent | 2332a74c61fb0c5041bff4f0e361364a3378b4c7 (diff) | |
Fix 3165868: Fix stall in state machine logic in WaveView
It was possible for the state machine to get stuck when
user interaction and animations both completed before success
was detected. This fixes the problem by explicitly advancing
the state machine when an up event is detected.
Change-Id: I802e3f1bb35aeab7a0d6f64e85acaa6980b9d65a
| -rw-r--r-- | core/java/com/android/internal/widget/WaveView.java | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/core/java/com/android/internal/widget/WaveView.java b/core/java/com/android/internal/widget/WaveView.java index f91d3d6a5c2b..81633b12f286 100644 --- a/core/java/com/android/internal/widget/WaveView.java +++ b/core/java/com/android/internal/widget/WaveView.java @@ -269,7 +269,7 @@ public class WaveView extends View implements ValueAnimator.AnimatorUpdateListen break; case STATE_ATTEMPTING: - if (DBG) Log.v(TAG, "State ATTEMPTING"); + if (DBG) Log.v(TAG, "State ATTEMPTING (fingerDown = " + fingerDown + ")"); //TweenMax.to(unlockHalo, 0.4, { x:mouseX, y:mouseY, scaleX:1, scaleY:1, // alpha: 1, ease:Quint.easeOut }); if (dragDistance > mSnapRadius) { @@ -282,6 +282,7 @@ public class WaveView extends View implements ValueAnimator.AnimatorUpdateListen mUnlockHalo.addAnimTo(0, 0, "scaleY", 1.0f, true); mUnlockHalo.addAnimTo(0, 0, "alpha", 1.0f, true); } else { + if (DBG) Log.v(TAG, "up detected, moving to STATE_UNLOCK_ATTEMPT"); mLockState = STATE_UNLOCK_ATTEMPT; } } else { @@ -480,9 +481,16 @@ public class WaveView extends View implements ValueAnimator.AnimatorUpdateListen break; case MotionEvent.ACTION_UP: + if (DBG) Log.v(TAG, "ACTION_UP"); mFingerDown = false; postDelayed(mLockTimerActions, RESET_TIMEOUT); setGrabbedState(OnTriggerListener.NO_HANDLE); + // Normally the state machine is driven by user interaction causing redraws. + // However, when there's no more user interaction and no running animations, + // the state machine stops advancing because onDraw() never gets called. + // The following ensures we advance to the next state in this case, + // either STATE_UNLOCK_ATTEMPT or STATE_RESET_LOCK. + waveUpdateFrame(mMouseX, mMouseY, mFingerDown); handled = true; break; |