From a47f8245dacffad2b7f8f71a38b7eb41ee28b0b5 Mon Sep 17 00:00:00 2001 From: Tobrun Date: Fri, 10 Nov 2017 16:33:51 +0100 Subject: Monkey crashes (#10440) * [android] - avoid null map from trackballevent * [android] - fixup animated marker test activity from monkey runs * [android] - harden NativeMapView OnMapChangeListener * [android] - harden against destroyed wrapper activity while moving touch pointers * [android] - harden bulk marker activity for monkey runner * [android] - harden scale end gesture event for null velocity tracker * [android] - invalid mapboxMap invocation * [android] - reset test setup --- .../mapbox/mapboxsdk/maps/MapGestureDetector.java | 11 +++++++++-- .../com/mapbox/mapboxsdk/maps/NativeMapView.java | 4 +++- .../java/com/mapbox/mapboxsdk/maps/Transform.java | 20 +++++++++++--------- .../activity/annotation/AnimatedMarkerActivity.java | 14 ++++++++------ .../activity/annotation/BulkMarkerActivity.java | 4 ++++ 5 files changed, 35 insertions(+), 18 deletions(-) diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java index 4120e164a4..9d7d980ae3 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java @@ -235,8 +235,10 @@ final class MapGestureDetector { velocityTracker = null; break; case MotionEvent.ACTION_MOVE: - velocityTracker.addMovement(event); - velocityTracker.computeCurrentVelocity(1000); + if (velocityTracker != null) { + velocityTracker.addMovement(event); + velocityTracker.computeCurrentVelocity(1000); + } break; } @@ -551,6 +553,11 @@ final class MapGestureDetector { // Called when fingers leave screen @Override public void onScaleEnd(final ScaleGestureDetector detector) { + if (velocityTracker == null) { + return; + } + + if (rotateGestureOccurred || quickZoom) { reset(); return; diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java index 8b6bce69e2..e8eb7e8718 100755 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java @@ -1082,7 +1082,9 @@ final class NativeMapView { // void addOnMapChangedListener(@NonNull MapView.OnMapChangedListener listener) { - mapView.addOnMapChangedListener(listener); + if (mapView != null) { + mapView.addOnMapChangedListener(listener); + } } void removeOnMapChangedListener(@NonNull MapView.OnMapChangedListener listener) { diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java index 0366e50627..16c45ebea2 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java @@ -238,16 +238,18 @@ final class Transform implements MapView.OnMapChangedListener { } void setZoom(double zoom, @NonNull PointF focalPoint, long duration) { - mapView.addOnMapChangedListener(new MapView.OnMapChangedListener() { - @Override - public void onMapChanged(int change) { - if (change == MapView.REGION_DID_CHANGE_ANIMATED) { - cameraChangeDispatcher.onCameraIdle(); - mapView.removeOnMapChangedListener(this); + if (mapView != null) { + mapView.addOnMapChangedListener(new MapView.OnMapChangedListener() { + @Override + public void onMapChanged(int change) { + if (change == MapView.REGION_DID_CHANGE_ANIMATED) { + cameraChangeDispatcher.onCameraIdle(); + mapView.removeOnMapChangedListener(this); + } } - } - }); - mapView.setZoom(zoom, focalPoint, duration); + }); + mapView.setZoom(zoom, focalPoint, duration); + } } // Direction diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/AnimatedMarkerActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/AnimatedMarkerActivity.java index 52181cee0c..d8752bbea2 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/AnimatedMarkerActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/AnimatedMarkerActivity.java @@ -236,12 +236,14 @@ public class AnimatedMarkerActivity extends AppCompatActivity { stopped = true; - // Stop ongoing animations, prevent memory lekas - MarkerViewManager markerViewManager = mapboxMap.getMarkerViewManager(); - for (MarkerView markerView : markerViews) { - View view = markerViewManager.getView(markerView); - if (view != null) { - view.animate().cancel(); + // Stop ongoing animations, prevent memory leaks + if (mapboxMap != null) { + MarkerViewManager markerViewManager = mapboxMap.getMarkerViewManager(); + for (MarkerView markerView : markerViews) { + View view = markerViewManager.getView(markerView); + if (view != null) { + view.animate().cancel(); + } } } diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/BulkMarkerActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/BulkMarkerActivity.java index 50adeb2d74..666fd2eee6 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/BulkMarkerActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/BulkMarkerActivity.java @@ -100,6 +100,10 @@ public class BulkMarkerActivity extends AppCompatActivity implements AdapterView } private void showMarkers(int amount) { + if (mapboxMap == null || locations == null) { + return; + } + mapboxMap.clear(); if (locations.size() < amount) { -- cgit v1.2.1