3535import android .util .TypedValue ;
3636import android .view .MotionEvent ;
3737import android .view .View ;
38- import android .view .ViewConfiguration ;
3938import android .view .accessibility .AccessibilityEvent ;
4039import android .view .accessibility .AccessibilityManager ;
4140
@@ -109,9 +108,6 @@ public interface OnTriggerListener {
109108 private boolean mDragging ;
110109 private int mNewTargetResources ;
111110
112- private boolean mWaveHovered = false ;
113- private long mLastHoverExitTimeMillis = 0 ;
114-
115111 private AnimatorListener mResetListener = new AnimatorListenerAdapter () {
116112 public void onAnimationEnd (Animator animator ) {
117113 switchToState (STATE_IDLE , mWaveCenterX , mWaveCenterY );
@@ -660,66 +656,21 @@ private void moveHandleTo(float x, float y, boolean animate) {
660656 }
661657
662658 private void handleDown (MotionEvent event ) {
663- final float x = event .getX ();
664- final float y = event .getY ();
665- final float dx = x - mWaveCenterX ;
666- final float dy = y - mWaveCenterY ;
667- if (dist2 (dx ,dy ) <= getScaledTapRadiusSquared ()) {
668- if (DEBUG ) Log .v (TAG , "** Handle HIT" );
669- switchToState (STATE_FIRST_TOUCH , x , y );
670- moveHandleTo (x , y , false );
671- mDragging = true ;
672- } else {
659+ if (!trySwitchToFirstTouchState (event )) {
673660 mDragging = false ;
674661 stopTargetAnimation ();
675662 ping ();
676663 }
677664 }
678665
679- @ Override
680- public boolean onHoverEvent (MotionEvent event ) {
681- if (AccessibilityManager .getInstance (mContext ).isTouchExplorationEnabled ()) {
682- final int action = event .getAction ();
683- switch (action ) {
684- case MotionEvent .ACTION_HOVER_ENTER :
685- case MotionEvent .ACTION_HOVER_MOVE :
686- final float dx = event .getX () - mWaveCenterX ;
687- final float dy = event .getY () - mWaveCenterY ;
688- if (dist2 (dx ,dy ) <= getScaledTapRadiusSquared ()) {
689- if (!mWaveHovered ) {
690- mWaveHovered = true ;
691- final long timeSinceLastHoverExitMillis =
692- event .getEventTime () - mLastHoverExitTimeMillis ;
693- final long recurringEventsInterval =
694- ViewConfiguration .getSendRecurringAccessibilityEventsInterval ();
695- if (timeSinceLastHoverExitMillis > recurringEventsInterval ) {
696- String text =
697- mContext .getString (R .string .content_description_sliding_handle );
698- announceText (text );
699- }
700- }
701- } else {
702- mWaveHovered = false ;
703- }
704- break ;
705- case MotionEvent .ACTION_HOVER_EXIT :
706- mLastHoverExitTimeMillis = event .getEventTime ();
707- mWaveHovered = false ;
708- break ;
709- default :
710- mWaveHovered = false ;
711- }
712- }
713- return super .onHoverEvent (event );
714- }
715-
716666 private void handleUp (MotionEvent event ) {
717667 if (DEBUG && mDragging ) Log .v (TAG , "** Handle RELEASE" );
718668 switchToState (STATE_FINISH , event .getX (), event .getY ());
719669 }
720670
721671 private void handleMove (MotionEvent event ) {
722672 if (!mDragging ) {
673+ trySwitchToFirstTouchState (event );
723674 return ;
724675 }
725676
@@ -792,6 +743,27 @@ private void handleMove(MotionEvent event) {
792743 mActiveTarget = activeTarget ;
793744 }
794745
746+ @ Override
747+ public boolean onHoverEvent (MotionEvent event ) {
748+ if (AccessibilityManager .getInstance (mContext ).isTouchExplorationEnabled ()) {
749+ final int action = event .getAction ();
750+ switch (action ) {
751+ case MotionEvent .ACTION_HOVER_ENTER :
752+ event .setAction (MotionEvent .ACTION_DOWN );
753+ break ;
754+ case MotionEvent .ACTION_HOVER_MOVE :
755+ event .setAction (MotionEvent .ACTION_MOVE );
756+ break ;
757+ case MotionEvent .ACTION_HOVER_EXIT :
758+ event .setAction (MotionEvent .ACTION_UP );
759+ break ;
760+ }
761+ onTouchEvent (event );
762+ event .setAction (action );
763+ }
764+ return super .onHoverEvent (event );
765+ }
766+
795767 /**
796768 * Sets the current grabbed state, and dispatches a grabbed state change
797769 * event to our listener.
@@ -808,6 +780,21 @@ private void setGrabbedState(int newState) {
808780 }
809781 }
810782
783+ private boolean trySwitchToFirstTouchState (MotionEvent event ) {
784+ final float x = event .getX ();
785+ final float y = event .getY ();
786+ final float dx = x - mWaveCenterX ;
787+ final float dy = y - mWaveCenterY ;
788+ if (dist2 (dx ,dy ) <= getScaledTapRadiusSquared ()) {
789+ if (DEBUG ) Log .v (TAG , "** Handle HIT" );
790+ switchToState (STATE_FIRST_TOUCH , x , y );
791+ moveHandleTo (x , y , false );
792+ mDragging = true ;
793+ return true ;
794+ }
795+ return false ;
796+ }
797+
811798 private void performInitialLayout (float centerX , float centerY ) {
812799 if (mOuterRadius == 0.0f ) {
813800 mOuterRadius = 0.5f *(float ) Math .sqrt (dist2 (centerX , centerY ));
0 commit comments