summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jim Miller <jaggies@google.com> 2010-11-04 21:06:31 -0700
committer Jim Miller <jaggies@google.com> 2010-11-05 13:05:27 -0700
commitec6ac82a295b80a39f12ff7951ec254ba45809fd (patch)
treeb4a65529b78af92ce7b517fbbf46b5bb1c8661dd
parent2332a74c61fb0c5041bff4f0e361364a3378b4c7 (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.java10
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;