Skip to content
This repository was archived by the owner on Aug 8, 2023. It is now read-only.

Commit 7a1fc73

Browse files
committed
[android] - rewire gesture handling and telemetry event push
1 parent 3b26177 commit 7a1fc73

File tree

1 file changed

+57
-64
lines changed

1 file changed

+57
-64
lines changed

platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java

+57-64
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,12 @@ final class MapGestureDetector {
5050

5151
private PointF focalPoint;
5252

53-
private boolean twoTap = false;
54-
private boolean zoomStarted = false;
55-
private boolean dragStarted = false;
56-
private boolean quickZoom = false;
57-
private boolean scrollInProgress = false;
58-
private boolean scaleGestureOccurred = false;
59-
private boolean recentScaleGestureOccurred = false;
53+
private boolean twoTap;
54+
private boolean quickZoom;
55+
private boolean tiltGestureOccurred;
56+
private boolean scrollGestureOccurred;
57+
private boolean scaleGestureOccurred;
58+
private boolean recentScaleGestureOccurred;
6059

6160
MapGestureDetector(Context context, Transform transform, Projection projection, UiSettings uiSettings,
6261
TrackingSettings trackingSettings, AnnotationManager annotationManager,
@@ -193,10 +192,10 @@ boolean onTouchEvent(MotionEvent event) {
193192
}
194193

195194
// Scroll / Pan Has Stopped
196-
if (scrollInProgress) {
195+
if (scrollGestureOccurred) {
197196
MapboxTelemetry.getInstance().pushEvent(MapboxEventWrapper.buildMapDragEndEvent(
198197
getLocationFromGesture(event.getX(), event.getY()), transform));
199-
scrollInProgress = false;
198+
scrollGestureOccurred = false;
200199
cameraChangeDispatcher.onCameraIdle();
201200
}
202201

@@ -393,20 +392,18 @@ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float d
393392
return false;
394393
}
395394

396-
if (dragStarted) {
395+
if (tiltGestureOccurred) {
397396
return false;
398397
}
399398

400-
if (scaleGestureOccurred) {
401-
return false;
402-
}
403-
404-
if (!scrollInProgress) {
405-
scrollInProgress = true;
399+
if (!scrollGestureOccurred) {
400+
scrollGestureOccurred = true;
406401

407402
// Cancel any animation
408-
transform.cancelTransitions();
409-
cameraChangeDispatcher.onCameraMoveStarted(REASON_API_GESTURE);
403+
if (!scaleGestureOccurred) {
404+
transform.cancelTransitions();
405+
cameraChangeDispatcher.onCameraMoveStarted(REASON_API_GESTURE);
406+
}
410407

411408
MapboxTelemetry.getInstance().pushEvent(MapboxEventWrapper.buildMapClickEvent(
412409
getLocationFromGesture(e1.getX(), e1.getY()),
@@ -456,7 +453,6 @@ public void onScaleEnd(ScaleGestureDetector detector) {
456453
scaleGestureOccurred = false;
457454
beginTime = 0;
458455
scaleFactor = 1.0f;
459-
zoomStarted = false;
460456
cameraChangeDispatcher.onCameraIdle();
461457
}
462458

@@ -468,27 +464,27 @@ public boolean onScale(ScaleGestureDetector detector) {
468464
return super.onScale(detector);
469465
}
470466

471-
// If scale is large enough ignore a tap
472-
scaleFactor *= detector.getScaleFactor();
473-
if ((scaleFactor > 1.05f) || (scaleFactor < 0.95f)) {
474-
// notify camera change listener
475-
cameraChangeDispatcher.onCameraMoveStarted(REASON_API_GESTURE);
476-
zoomStarted = true;
467+
if (tiltGestureOccurred) {
468+
return false;
477469
}
478470

479471
// Ignore short touches in case it is a tap
480472
// Also ignore small scales
481473
long time = detector.getEventTime();
482474
long interval = time - beginTime;
483-
if (!zoomStarted && (interval <= ViewConfiguration.getTapTimeout())) {
475+
if (!scaleGestureOccurred && (interval <= ViewConfiguration.getTapTimeout())) {
484476
return false;
485477
}
486478

487-
if (!zoomStarted) {
488-
return false;
479+
// If scale is large enough ignore a tap
480+
scaleFactor *= detector.getScaleFactor();
481+
if ((scaleFactor > 1.05f) || (scaleFactor < 0.95f)) {
482+
// notify camera change listener
483+
cameraChangeDispatcher.onCameraMoveStarted(REASON_API_GESTURE);
484+
scaleGestureOccurred = true;
489485
}
490486

491-
if (dragStarted) {
487+
if (!scaleGestureOccurred) {
492488
return false;
493489
}
494490

@@ -506,18 +502,20 @@ public boolean onScale(ScaleGestureDetector detector) {
506502
// Scale the map
507503
if (focalPoint != null) {
508504
// arround user provided focal point
509-
transform.zoomBy(Math.log(detector.getScaleFactor()) / Math.log(2), focalPoint.x, focalPoint.y);
505+
transform.zoomBy(Math.log(detector.getScaleFactor()) / Math.log(Math.PI / 2), focalPoint.x, focalPoint.y);
510506
} else if (quickZoom) {
511507
cameraChangeDispatcher.onCameraMove();
512508
// clamp scale factors we feed to core #7514
513509
float scaleFactor = MathUtils.clamp(detector.getScaleFactor(),
514510
MapboxConstants.MINIMUM_SCALE_FACTOR_CLAMP,
515511
MapboxConstants.MAXIMUM_SCALE_FACTOR_CLAMP);
516512
// around center map
517-
transform.zoomBy(Math.log(scaleFactor) / Math.log(2), uiSettings.getWidth() / 2, uiSettings.getHeight() / 2);
513+
transform.zoomBy(Math.log(scaleFactor) / Math.log(Math.PI / 2),
514+
uiSettings.getWidth() / 2, uiSettings.getHeight() / 2);
518515
} else {
519516
// around gesture
520-
transform.zoomBy(Math.log(detector.getScaleFactor()) / Math.log(2), detector.getFocusX(), detector.getFocusY());
517+
transform.zoomBy(Math.log(detector.getScaleFactor()) / Math.log(Math.PI / 2),
518+
detector.getFocusX(), detector.getFocusY());
521519
}
522520

523521
return true;
@@ -544,9 +542,6 @@ public boolean onRotateBegin(RotateGestureDetector detector) {
544542
cameraChangeDispatcher.onCameraMoveStarted(REASON_API_GESTURE);
545543

546544
beginTime = detector.getEventTime();
547-
MapboxTelemetry.getInstance().pushEvent(MapboxEventWrapper.buildMapClickEvent(
548-
getLocationFromGesture(detector.getFocusX(), detector.getFocusY()),
549-
MapboxEvent.GESTURE_ROTATION_START, transform));
550545
return true;
551546
}
552547

@@ -563,17 +558,10 @@ public void onRotateEnd(RotateGestureDetector detector) {
563558
// Called for rotation
564559
@Override
565560
public boolean onRotate(RotateGestureDetector detector) {
566-
if (!trackingSettings.isRotateGestureCurrentlyEnabled() || dragStarted) {
561+
if (!trackingSettings.isRotateGestureCurrentlyEnabled() || tiltGestureOccurred) {
567562
return false;
568563
}
569564

570-
// If rotate is large enough ignore a tap
571-
// Also is zoom already started, don't rotate
572-
totalAngle += detector.getRotationDegreesDelta();
573-
if (totalAngle > 20.0f || totalAngle < -20.0f) {
574-
started = true;
575-
}
576-
577565
// Ignore short touches in case it is a tap
578566
// Also ignore small rotate
579567
long time = detector.getEventTime();
@@ -582,6 +570,16 @@ public boolean onRotate(RotateGestureDetector detector) {
582570
return false;
583571
}
584572

573+
// If rotate is large enough ignore a tap
574+
// Also is zoom already started, don't rotate
575+
totalAngle += detector.getRotationDegreesDelta();
576+
if (totalAngle > 35.0f || totalAngle < -35.0f) {
577+
MapboxTelemetry.getInstance().pushEvent(MapboxEventWrapper.buildMapClickEvent(
578+
getLocationFromGesture(detector.getFocusX(), detector.getFocusY()),
579+
MapboxEvent.GESTURE_ROTATION_START, transform));
580+
started = true;
581+
}
582+
585583
if (!started) {
586584
return false;
587585
}
@@ -610,9 +608,8 @@ public boolean onRotate(RotateGestureDetector detector) {
610608
*/
611609
private class ShoveGestureListener implements ShoveGestureDetector.OnShoveGestureListener {
612610

613-
long beginTime = 0;
614-
float totalDelta = 0.0f;
615-
boolean started = false;
611+
private long beginTime = 0;
612+
private float totalDelta = 0.0f;
616613

617614
@Override
618615
public boolean onShoveBegin(ShoveGestureDetector detector) {
@@ -622,19 +619,14 @@ public boolean onShoveBegin(ShoveGestureDetector detector) {
622619

623620
// notify camera change listener
624621
cameraChangeDispatcher.onCameraMoveStarted(REASON_API_GESTURE);
625-
beginTime = detector.getEventTime();
626-
MapboxTelemetry.getInstance().pushEvent(MapboxEventWrapper.buildMapClickEvent(
627-
getLocationFromGesture(detector.getFocusX(), detector.getFocusY()),
628-
MapboxEvent.GESTURE_PITCH_START, transform));
629622
return true;
630623
}
631624

632625
@Override
633626
public void onShoveEnd(ShoveGestureDetector detector) {
634627
beginTime = 0;
635628
totalDelta = 0.0f;
636-
started = false;
637-
dragStarted = false;
629+
tiltGestureOccurred = false;
638630
}
639631

640632
@Override
@@ -643,22 +635,26 @@ public boolean onShove(ShoveGestureDetector detector) {
643635
return false;
644636
}
645637

646-
// If tilt is large enough ignore a tap
647-
// Also if zoom already started, don't tilt
648-
totalDelta += detector.getShovePixelsDelta();
649-
if (!zoomStarted && ((totalDelta > 10.0f) || (totalDelta < -10.0f))) {
650-
started = true;
651-
}
652-
653638
// Ignore short touches in case it is a tap
654639
// Also ignore small tilt
655640
long time = detector.getEventTime();
656641
long interval = time - beginTime;
657-
if (!started && (interval <= ViewConfiguration.getTapTimeout())) {
642+
if (!tiltGestureOccurred && (interval <= ViewConfiguration.getTapTimeout())) {
658643
return false;
659644
}
660645

661-
if (!started) {
646+
// If tilt is large enough ignore a tap
647+
// Also if zoom already started, don't tilt
648+
totalDelta += detector.getShovePixelsDelta();
649+
if (!tiltGestureOccurred && ((totalDelta > 10.0f) || (totalDelta < -10.0f))) {
650+
tiltGestureOccurred = true;
651+
beginTime = detector.getEventTime();
652+
MapboxTelemetry.getInstance().pushEvent(MapboxEventWrapper.buildMapClickEvent(
653+
getLocationFromGesture(detector.getFocusX(), detector.getFocusY()),
654+
MapboxEvent.GESTURE_PITCH_START, transform));
655+
}
656+
657+
if (!tiltGestureOccurred) {
662658
return false;
663659
}
664660

@@ -669,9 +665,6 @@ public boolean onShove(ShoveGestureDetector detector) {
669665

670666
// Tilt the map
671667
transform.setTilt(pitch);
672-
673-
dragStarted = true;
674-
675668
return true;
676669
}
677670
}

0 commit comments

Comments
 (0)