From 9a44ddfa3546fdf7de82ab66e9508828d07f6570 Mon Sep 17 00:00:00 2001 From: langsmith Date: Fri, 29 Mar 2019 16:17:04 -0700 Subject: [PATCH] more adjustments on Lukasz feedback --- .../location/LocationAnimatorCoordinator.java | 91 +++++++++++++------ .../mapboxsdk/location/LocationComponent.java | 24 +---- .../location/LocationComponentOptions.java | 2 - .../location/LocationLayerController.java | 25 +++-- .../PulsingLocationCircleAnimator.java | 23 +---- 5 files changed, 76 insertions(+), 89 deletions(-) diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinator.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinator.java index da612beedee..35e9d5381d6 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinator.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinator.java @@ -6,7 +6,6 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; -import android.util.Log; import android.util.SparseArray; import android.view.animation.AccelerateInterpolator; import android.view.animation.BounceInterpolator; @@ -36,6 +35,7 @@ import static com.mapbox.mapboxsdk.location.MapboxAnimator.ANIMATOR_LAYER_COMPASS_BEARING; import static com.mapbox.mapboxsdk.location.MapboxAnimator.ANIMATOR_LAYER_GPS_BEARING; import static com.mapbox.mapboxsdk.location.MapboxAnimator.ANIMATOR_LAYER_LATLNG; +import static com.mapbox.mapboxsdk.location.MapboxAnimator.ANIMATOR_PULSING_CIRCLE_RADIUS; import static com.mapbox.mapboxsdk.location.MapboxAnimator.ANIMATOR_TILT; import static com.mapbox.mapboxsdk.location.MapboxAnimator.ANIMATOR_ZOOM; import static com.mapbox.mapboxsdk.location.Utils.immediateAnimation; @@ -50,6 +50,7 @@ final class LocationAnimatorCoordinator { private final Projection projection; private Location previousLocation; private float previousAccuracyRadius = -1; + private float previousPulsingRadius = -1; private float previousCompassBearing = -1; private long locationUpdateTimestamp = -1; private float durationMultiplier; @@ -58,6 +59,7 @@ final class LocationAnimatorCoordinator { private boolean compassAnimationEnabled; private boolean accuracyAnimationEnabled; private PulsingLocationCircleAnimator pulsingLocationCircleAnimator; + private LocationComponentOptions locationComponentOptions; @VisibleForTesting int maxAnimationFps = Integer.MAX_VALUE; @@ -66,10 +68,12 @@ final class LocationAnimatorCoordinator { final SparseArray listeners = new SparseArray<>(); LocationAnimatorCoordinator(@NonNull Projection projection, @NonNull MapboxAnimatorSetProvider animatorSetProvider, - @NonNull MapboxAnimatorProvider animatorProvider) { + @NonNull MapboxAnimatorProvider animatorProvider, + @NonNull LocationComponentOptions locationComponentOptions) { this.projection = projection; this.animatorProvider = animatorProvider; this.animatorSetProvider = animatorSetProvider; + this.locationComponentOptions = locationComponentOptions; } void updateAnimatorListenerHolders(@NonNull Set listenerHolders) { @@ -142,42 +146,53 @@ void feedNewAccuracyRadius(float targetAccuracyRadius, boolean noAnimation) { this.previousAccuracyRadius = targetAccuracyRadius; } - void feedNewZoomLevel(double targetZoomLevel, @NonNull CameraPosition currentCameraPosition, long animationDuration, - @Nullable MapboxMap.CancelableCallback callback) { - updateZoomAnimator((float) targetZoomLevel, (float) currentCameraPosition.zoom, callback); - playAnimators(animationDuration, ANIMATOR_ZOOM); - } + void feedNewPulsingRadius(float targetPulsingRadius, MapboxMap mapboxMap) { - void feedNewTilt(double targetTilt, @NonNull CameraPosition currentCameraPosition, long animationDuration, - @Nullable MapboxMap.CancelableCallback callback) { - updateTiltAnimator((float) targetTilt, (float) currentCameraPosition.tilt, callback); - playAnimators(animationDuration, ANIMATOR_TILT); - } + /*if (previousPulsingRadius < 0) { + previousPulsingRadius = targetPulsingRadius; + } - void startLocationCirclePulsing(LocationComponentOptions options, MapboxMap mapboxMap) { + float previousPulsingRadius = getPreviousPulsingRadius(); + updateAccuracyAnimators(targetPulsingRadius, previousPulsingRadius); + playAnimators( + noAnimation || !locationComponentOptions.pulseEnabled() ? 0 : ACCURACY_RADIUS_ANIMATION_DURATION, + ANIMATOR_PULSING_CIRCLE_RADIUS); + + this.previousPulsingRadius = targetPulsingRadius;*/ + + if (previousPulsingRadius < 0) { + previousPulsingRadius = targetPulsingRadius; + } + + // TODO: Use animator here? pulsingLocationCircleAnimator = new PulsingLocationCircleAnimator(retrievePulseInterpolator( - options.pulseInterpolator()), mapboxMap, options); - pulsingLocationCircleAnimator.startPulsingAnimation(); - } + locationComponentOptions.pulseInterpolator()), mapboxMap, locationComponentOptions); - void stopPulsingAnimation() { - pulsingLocationCircleAnimator.stopPulsingAnimation(); - } - void pausePulsingAnimation() { - pulsingLocationCircleAnimator.pausePulsingAnimation(); - } + pulsingLocationCircleAnimator.onAnimationUpdate(pulsingLocationCircleAnimator.getValueAnimator()); + + + float previousPulsingRadius = getPreviousPulsingRadius(); + + updatePulsingAnimators(targetPulsingRadius, previousPulsingRadius); - void resumePulsingAnimation() { - pulsingLocationCircleAnimator.resumePulsingAnimation(); + playAnimators(!locationComponentOptions.pulseEnabled() ? 0 : ACCURACY_RADIUS_ANIMATION_DURATION, + ANIMATOR_PULSING_CIRCLE_RADIUS); + + this.previousPulsingRadius = targetPulsingRadius; } - void pulsingAnimationIsRunning() { - pulsingLocationCircleAnimator.pulsingAnimationIsRunning(); + + void feedNewZoomLevel(double targetZoomLevel, @NonNull CameraPosition currentCameraPosition, long animationDuration, + @Nullable MapboxMap.CancelableCallback callback) { + updateZoomAnimator((float) targetZoomLevel, (float) currentCameraPosition.zoom, callback); + playAnimators(animationDuration, ANIMATOR_ZOOM); } - boolean pulsingAnimationIsStarted() { - return pulsingLocationCircleAnimator.pulsingAnimationIsStarted(); + void feedNewTilt(double targetTilt, @NonNull CameraPosition currentCameraPosition, long animationDuration, + @Nullable MapboxMap.CancelableCallback callback) { + updateTiltAnimator((float) targetTilt, (float) currentCameraPosition.tilt, callback); + playAnimators(animationDuration, ANIMATOR_TILT); } private LatLng getPreviousLayerLatLng() { @@ -225,6 +240,17 @@ private float getPreviousAccuracyRadius() { return previousRadius; } + private float getPreviousPulsingRadius() { + MapboxAnimator animator = animatorArray.get(ANIMATOR_PULSING_CIRCLE_RADIUS); + float previousRadius; + if (animator != null) { + previousRadius = (float) animator.getAnimatedValue(); + } else { + previousRadius = previousPulsingRadius; + } + return previousRadius; + } + private void updateLayerAnimators(LatLng previousLatLng, LatLng targetLatLng, float previousBearing, float targetBearing) { createNewLatLngAnimator(ANIMATOR_LAYER_LATLNG, previousLatLng, targetLatLng); @@ -254,6 +280,11 @@ private void updateAccuracyAnimators(float targetAccuracyRadius, float previousA createNewFloatAnimator(ANIMATOR_LAYER_ACCURACY, previousAccuracyRadius, targetAccuracyRadius); } + private void updatePulsingAnimators(float targetPulsingRadius, float previousPulsingRadius) { + createNewFloatAnimator(ANIMATOR_PULSING_CIRCLE_RADIUS, previousPulsingRadius, targetPulsingRadius); + } + + private void updateZoomAnimator(float targetZoomLevel, float previousZoomLevel, @Nullable MapboxMap.CancelableCallback cancelableCallback) { createNewCameraAdapterAnimator(ANIMATOR_ZOOM, previousZoomLevel, targetZoomLevel, cancelableCallback); @@ -422,8 +453,8 @@ void setMaxAnimationFps(int maxAnimationFps){ this.maxAnimationFps = maxAnimationFps; } - private Interpolator retrievePulseInterpolator(String interpolatorAnimationType) { - switch(interpolatorAnimationType) { + private Interpolator retrievePulseInterpolator(String desiredInterpolatorFromOptions) { + switch(desiredInterpolatorFromOptions) { case PulseMode.LINEAR: return new LinearInterpolator(); case PulseMode.ACCELERATE: diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java index b6b9f924e6e..a9283171e3e 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java @@ -658,7 +658,6 @@ public void applyStyle(@NonNull Context context, @StyleRes int styleRes) { @SuppressLint("MissingPermission") public void applyStyle(@NonNull final LocationComponentOptions options) { checkActivationState(); - Logger.d(TAG, "LocationComponent applyStyle()"); LocationComponent.this.options = options; if (mapboxMap.getStyle() != null) { locationLayerController.applyStyle(options); @@ -1061,7 +1060,6 @@ public void removeOnLocationStaleListener(@NonNull OnLocationStaleListener liste */ public void onStart() { isComponentStarted = true; - Logger.d(TAG, "onStart()"); onLocationLayerStart(); } @@ -1090,15 +1088,8 @@ public void onStartLoadingMap() { * Internal use. */ public void onFinishLoadingStyle() { - Logger.d(TAG, "onFinishLoadingStyle"); - Logger.d(TAG, "isComponentInitialized = " + isComponentInitialized); - if (isComponentInitialized) { style = mapboxMap.getStyle(); - Logger.d(TAG, "isComponentInitialized == true && options.pulseAlpha() = " + options.pulseAlpha()); - Logger.d(TAG, "isComponentInitialized == true && options.pulseSingleDuration() = " + options.pulseSingleDuration()); - Logger.d(TAG, "isComponentInitialized == true && options.pulseColor() = " + options.pulseColor()); - locationLayerController.initializeComponents(style, options); locationCameraController.initializeOptions(options); onLocationLayerStart(); @@ -1118,13 +1109,6 @@ private void onLocationLayerStart() { if (options.enableStaleState()) { staleStateManager.onStart(); } - Logger.d(TAG, "onLocationLayerStart: options.pulseEnabled() = " + options.pulseEnabled()); - if (options.pulseEnabled()) { - Logger.d(TAG, "onLocationLayerStart: locationAnimatorCoordinator.startLocationCirclePulsing(options, mapboxMap)"); - Logger.d(TAG, "onLocationLayerStart: options.pulseColor() = " + options.pulseColor()); - Logger.d(TAG, "onLocationLayerStart: options.pulseSingleDuration() = " + options.pulseSingleDuration()); - locationAnimatorCoordinator.startLocationCirclePulsing(options, mapboxMap); - } } if (isEnabled) { @@ -1158,11 +1142,6 @@ private void onLocationLayerStop() { if (locationEngine != null) { locationEngine.removeLocationUpdates(currentLocationEngineListener); } - if (options.pulseEnabled()) { - Logger.d(TAG, "onLocationLayerStop: options.pulseEnabled()"); - Logger.d(TAG, "onLocationLayerStop: locationAnimatorCoordinator.stopPulsingAnimation()"); - locationAnimatorCoordinator.stopPulsingAnimation(); - } mapboxMap.removeOnCameraMoveListener(onCameraMoveListener); mapboxMap.removeOnCameraIdleListener(onCameraIdleListener); } @@ -1195,7 +1174,7 @@ private void initialize(@NonNull final Context context, @NonNull Style style, locationAnimatorCoordinator = new LocationAnimatorCoordinator( mapboxMap.getProjection(), MapboxAnimatorSetProvider.getInstance(), - MapboxAnimatorProvider.getInstance() + MapboxAnimatorProvider.getInstance(), options ); locationAnimatorCoordinator.setTrackingAnimationDurationMultiplier(options .trackingAnimationDurationMultiplier()); @@ -1306,7 +1285,6 @@ private void updateLocation(@Nullable final Location location, boolean fromLastL } private void showLocationLayerIfHidden() { - Logger.d(TAG, "showLocationLayerIfHidden()"); boolean isLocationLayerHidden = locationLayerController.isHidden(); if (isEnabled && isComponentStarted && isLocationLayerHidden) { locationLayerController.show(); diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponentOptions.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponentOptions.java index 60a77baa661..e12905a6e37 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponentOptions.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponentOptions.java @@ -1195,8 +1195,6 @@ public LocationComponentOptions build() { + locationComponentOptions.elevation() + ". Must be >= 0"); } - // TODO: Finish this logic below - if (locationComponentOptions.pulseEnabled() == null) { Log.d("LCOptions", "autoBuild: this.pulsingCircleFadeEnabled == null "); diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationLayerController.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationLayerController.java index 36709e9fb41..892dc9ecc27 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationLayerController.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationLayerController.java @@ -48,7 +48,6 @@ import static com.mapbox.mapboxsdk.location.LocationComponentConstants.PROPERTY_GPS_BEARING; import static com.mapbox.mapboxsdk.location.LocationComponentConstants.PROPERTY_LOCATION_STALE; import static com.mapbox.mapboxsdk.location.LocationComponentConstants.PROPERTY_PULSING_CIRCLE_LAYER; -import static com.mapbox.mapboxsdk.location.LocationComponentConstants.PROPERTY_PULSING_RADIUS; import static com.mapbox.mapboxsdk.location.LocationComponentConstants.PROPERTY_SHADOW_ICON_OFFSET; import static com.mapbox.mapboxsdk.location.LocationComponentConstants.SHADOW_ICON; import static com.mapbox.mapboxsdk.location.LocationComponentConstants.SHADOW_LAYER; @@ -60,6 +59,7 @@ import static com.mapbox.mapboxsdk.style.layers.Property.VISIBLE; import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.circleColor; import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.circleOpacity; +import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.circleRadius; import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.circleStrokeColor; import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.iconSize; import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.visibility; @@ -117,7 +117,7 @@ void initializeComponents(Style style, LocationComponentOptions options) { } void applyStyle(@NonNull LocationComponentOptions options) { - Logger.d(TAG, "applyStyle()"); + this.options = options; String newLayerBelowOption = options.layerBelow(); if ((layerBelow != null || newLayerBelowOption != null)) { if (layerBelow == null || !layerBelow.equals(newLayerBelowOption)) { @@ -131,9 +131,6 @@ void applyStyle(@NonNull LocationComponentOptions options) { setRenderMode(renderMode); } } - - this.options = options; - float elevation = options.elevation(); // Only add icon elevation if the values greater than 0. if (elevation > 0) { @@ -201,16 +198,13 @@ int getRenderMode() { void show() { isHidden = false; - Logger.d(TAG, "show()"); // addPulsingCircleLayerToMap(); setRenderMode(renderMode); } void hide() { isHidden = true; - Logger.d(TAG, "hide()"); for (String layerId : layerSet) { - Logger.d(TAG, "layerId = " + layerId); setLayerVisibility(layerId, false); } } @@ -254,7 +248,6 @@ private void setLayerVisibility(@NonNull String layerId, boolean visible) { } private void addLayers(@NonNull String idBelowLayer) { - Logger.d(TAG, "LocationLayerController ----> addLayers()"); layerBelow = idBelowLayer; addSymbolLayer(BEARING_LAYER, idBelowLayer); addSymbolLayer(FOREGROUND_LAYER, BEARING_LAYER); @@ -280,10 +273,9 @@ private void addLayerToMap(Layer layer, @NonNull String idBelowLayer) { } private void addPulsingCircleLayerToMap() { - Logger.d(TAG, "LocationLayerController ----> addPulsingCircleLayerToMap()"); + pulsingCircleIsEnabled = options.pulseEnabled(); Layer pulsingCircleLayer = layerSourceProvider.generatePulsingCircleLayer(); addLayerToMap(pulsingCircleLayer, ACCURACY_LAYER); - pulsingCircleIsEnabled = options.pulseEnabled(); } private void removeLayers() { @@ -304,8 +296,14 @@ private void updateAccuracyRadius(float accuracy) { } private void updatePulsingCircleRadius(float radius) { - locationFeature.addNumberProperty(PROPERTY_PULSING_RADIUS, radius); - refreshSource(); + Layer pulsingCircleLayer = mapboxMap.getStyle().getLayer(PROPERTY_PULSING_CIRCLE_LAYER); + if (pulsingCircleLayer != null) { + pulsingCircleLayer.setProperties(circleRadius(radius)); + + // TODO: Finish below to account for fade option usage + /*pulsingCircleLayer.setProperties(circleOpacity(1 - opacityCounter * .01f)); + opacityCounter++;*/ + } } // @@ -398,7 +396,6 @@ private void styleScaling(@NonNull LocationComponentOptions options) { } private void stylePulsingCircle(LocationComponentOptions options) { - Logger.d(TAG, "stylePulsingCircle() starting && options.pulseEnabled() = " + options.pulseEnabled()); if (mapboxMap.getStyle() != null) { if (mapboxMap.getStyle().getLayer(PROPERTY_PULSING_CIRCLE_LAYER) != null) { Logger.d(TAG, "stylePulsingCircle: options.pulseEnabled() = " + options.pulseEnabled()); diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/PulsingLocationCircleAnimator.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/PulsingLocationCircleAnimator.java index 74fbd50c1d9..d01ea8ff6c5 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/PulsingLocationCircleAnimator.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/PulsingLocationCircleAnimator.java @@ -61,32 +61,15 @@ TypeEvaluator provideEvaluator() { return null; } - public void startPulsingAnimation() { - createValueAnimator(); - startValueAnimator(); - } - - private void createValueAnimator() { + public ValueAnimator getValueAnimator() { if (mapboxMap.getStyle().getLayer(PROPERTY_PULSING_CIRCLE_LAYER) != null) { - Logger.d(TAG, "mapboxMap.getStyle().getLayer(PROPERTY_PULSING_CIRCLE_LAYER) != null"); - Logger.d(TAG, "locationComponentOptions.pulseSingleDuration() = " + locationComponentOptions.pulseSingleDuration()); - pulsingCircleLayer = mapboxMap.getStyle().getLayer(PROPERTY_PULSING_CIRCLE_LAYER); animator = ValueAnimator.ofFloat(0f, PULSING_CIRCLE_RADIUS); animator.setDuration((long) locationComponentOptions.pulseSingleDuration()); animator.setRepeatMode(ValueAnimator.RESTART); animator.setRepeatCount(ValueAnimator.INFINITE); animator.setInterpolator(interpolatorToUse); - animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator valueAnimator) { - pulsingCircleLayer.setProperties(circleRadius((Float) valueAnimator.getAnimatedValue())); - if (locationComponentOptions.pulsingCircleFadeEnabled()) { - pulsingCircleLayer.setProperties(circleOpacity(1 - opacityCounter * .01f)); - opacityCounter++; - } - } - }); } + return animator; } private void startValueAnimator() { @@ -121,7 +104,7 @@ public void pausePulsingAnimation() { public void resumePulsingAnimation() { if (animator != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { animator.resume(); -// createValueAnimator(); +// getValueAnimator(); // startValueAnimator(); } }