[android] ensure that move detector is enabled if double-tap is interrupted

This commit is contained in:
Łukasz Paczos
2019-07-11 16:04:30 +02:00
committed by Łukasz Paczos
parent 11cd2220a1
commit ac0431eac5
2 changed files with 52 additions and 10 deletions

View File

@@ -86,6 +86,8 @@ final class MapGestureDetector {
@NonNull
private Handler animationsTimeoutHandler = new Handler();
private boolean doubleTapRegistered;
MapGestureDetector(@Nullable Context context, Transform transform, Projection projection, UiSettings uiSettings,
AnnotationManager annotationManager, CameraChangeDispatcher cameraChangeDispatcher) {
this.annotationManager = annotationManager;
@@ -199,7 +201,12 @@ final class MapGestureDetector {
boolean result = gesturesManager.onTouchEvent(motionEvent);
switch (motionEvent.getActionMasked()) {
case MotionEvent.ACTION_POINTER_DOWN:
doubleTapFinished();
break;
case MotionEvent.ACTION_UP:
doubleTapFinished();
transform.setGestureInProgress(false);
if (!scheduledAnimators.isEmpty()) {
@@ -215,6 +222,7 @@ final class MapGestureDetector {
case MotionEvent.ACTION_CANCEL:
scheduledAnimators.clear();
transform.setGestureInProgress(false);
doubleTapFinished();
break;
}
@@ -344,16 +352,10 @@ final class MapGestureDetector {
int action = motionEvent.getActionMasked();
if (action == MotionEvent.ACTION_DOWN) {
doubleTapFocalPoint = new PointF(motionEvent.getX(), motionEvent.getY());
// disable the move detector in preparation for the quickzoom,
// so that we don't move the map's center slightly before the quickzoom is started (see #14227)
gesturesManager.getMoveGestureDetector().setEnabled(false);
doubleTapStarted();
}
if (motionEvent.getActionMasked() == MotionEvent.ACTION_UP) {
// re-enable the move detector
gesturesManager.getMoveGestureDetector().setEnabled(true);
float diffX = Math.abs(motionEvent.getX() - doubleTapFocalPoint.x);
float diffY = Math.abs(motionEvent.getY() - doubleTapFocalPoint.y);
if (diffX > doubleTapMovementThreshold || diffY > doubleTapMovementThreshold) {
@@ -426,6 +428,21 @@ final class MapGestureDetector {
}
}
private void doubleTapStarted() {
// disable the move detector in preparation for the quickzoom,
// so that we don't move the map's center slightly before the quickzoom is started (see #14227)
gesturesManager.getMoveGestureDetector().setEnabled(false);
doubleTapRegistered = true;
}
private void doubleTapFinished() {
if (doubleTapRegistered) {
// re-enable the move detector in case of double tap
gesturesManager.getMoveGestureDetector().setEnabled(true);
doubleTapRegistered = false;
}
}
private final class MoveGestureListener extends MoveGestureDetector.SimpleOnMoveGestureListener {
@Override
public boolean onMoveBegin(@NonNull MoveGestureDetector detector) {
@@ -481,6 +498,8 @@ final class MapGestureDetector {
if (!uiSettings.isQuickZoomGesturesEnabled()) {
return false;
}
// re-try disabling the move detector in case double tap has been interrupted before quickzoom started
gesturesManager.getMoveGestureDetector().setEnabled(false);
}
cancelTransitionsIfRequired();
@@ -516,9 +535,7 @@ final class MapGestureDetector {
@Override
public void onScaleEnd(@NonNull StandardScaleGestureDetector detector, float velocityX, float velocityY) {
if (quickZoom) {
// re-enabled the move detector only if the quickzoom happened
// we need to split the responsibility of re-enabling the move detector,
// because the double tap event (where the detector is disabled) can be canceled without warning (see #14598)
// re-enabled the move detector if the quickzoom happened
gesturesManager.getMoveGestureDetector().setEnabled(true);
}