summaryrefslogtreecommitdiff
path: root/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationLayerController.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationLayerController.java')
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationLayerController.java464
1 files changed, 0 insertions, 464 deletions
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
deleted file mode 100644
index 54f8ee6d1a..0000000000
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationLayerController.java
+++ /dev/null
@@ -1,464 +0,0 @@
-package com.mapbox.mapboxsdk.location;
-
-import android.graphics.Bitmap;
-import android.graphics.PointF;
-import android.support.annotation.ColorInt;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.VisibleForTesting;
-
-import com.google.gson.JsonArray;
-import com.google.gson.JsonObject;
-import com.mapbox.geojson.Feature;
-import com.mapbox.geojson.Point;
-import com.mapbox.mapboxsdk.geometry.LatLng;
-import com.mapbox.mapboxsdk.location.modes.RenderMode;
-import com.mapbox.mapboxsdk.maps.MapboxMap;
-import com.mapbox.mapboxsdk.maps.Style;
-import com.mapbox.mapboxsdk.style.layers.Layer;
-import com.mapbox.mapboxsdk.style.layers.SymbolLayer;
-import com.mapbox.mapboxsdk.style.sources.GeoJsonSource;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import static com.mapbox.mapboxsdk.location.LocationComponentConstants.ACCURACY_LAYER;
-import static com.mapbox.mapboxsdk.location.LocationComponentConstants.BACKGROUND_ICON;
-import static com.mapbox.mapboxsdk.location.LocationComponentConstants.BACKGROUND_LAYER;
-import static com.mapbox.mapboxsdk.location.LocationComponentConstants.BACKGROUND_STALE_ICON;
-import static com.mapbox.mapboxsdk.location.LocationComponentConstants.BEARING_ICON;
-import static com.mapbox.mapboxsdk.location.LocationComponentConstants.BEARING_LAYER;
-import static com.mapbox.mapboxsdk.location.LocationComponentConstants.FOREGROUND_ICON;
-import static com.mapbox.mapboxsdk.location.LocationComponentConstants.FOREGROUND_LAYER;
-import static com.mapbox.mapboxsdk.location.LocationComponentConstants.FOREGROUND_STALE_ICON;
-import static com.mapbox.mapboxsdk.location.LocationComponentConstants.LOCATION_SOURCE;
-import static com.mapbox.mapboxsdk.location.LocationComponentConstants.PROPERTY_ACCURACY_ALPHA;
-import static com.mapbox.mapboxsdk.location.LocationComponentConstants.PROPERTY_ACCURACY_COLOR;
-import static com.mapbox.mapboxsdk.location.LocationComponentConstants.PROPERTY_ACCURACY_RADIUS;
-import static com.mapbox.mapboxsdk.location.LocationComponentConstants.PROPERTY_BACKGROUND_ICON;
-import static com.mapbox.mapboxsdk.location.LocationComponentConstants.PROPERTY_BACKGROUND_STALE_ICON;
-import static com.mapbox.mapboxsdk.location.LocationComponentConstants.PROPERTY_BEARING_ICON;
-import static com.mapbox.mapboxsdk.location.LocationComponentConstants.PROPERTY_COMPASS_BEARING;
-import static com.mapbox.mapboxsdk.location.LocationComponentConstants.PROPERTY_FOREGROUND_ICON;
-import static com.mapbox.mapboxsdk.location.LocationComponentConstants.PROPERTY_FOREGROUND_ICON_OFFSET;
-import static com.mapbox.mapboxsdk.location.LocationComponentConstants.PROPERTY_FOREGROUND_STALE_ICON;
-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_SHADOW_ICON_OFFSET;
-import static com.mapbox.mapboxsdk.location.LocationComponentConstants.SHADOW_ICON;
-import static com.mapbox.mapboxsdk.location.LocationComponentConstants.SHADOW_LAYER;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.interpolate;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.linear;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.stop;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.zoom;
-import static com.mapbox.mapboxsdk.style.layers.Property.NONE;
-import static com.mapbox.mapboxsdk.style.layers.Property.VISIBLE;
-import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.iconSize;
-import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.visibility;
-import static com.mapbox.mapboxsdk.utils.ColorUtils.colorToRgbaString;
-
-final class LocationLayerController {
-
- @RenderMode.Mode
- private int renderMode;
-
- private final MapboxMap mapboxMap;
- private Style style;
- private final LayerSourceProvider layerSourceProvider;
- private final LayerBitmapProvider bitmapProvider;
- private LocationComponentOptions options;
- private final OnRenderModeChangedListener internalRenderModeChangedListener;
-
- @VisibleForTesting
- final Set<String> layerSet = new HashSet<>();
- private Feature locationFeature;
- private GeoJsonSource locationSource;
-
- private boolean isHidden = true;
-
- private LocationComponentPositionManager positionManager;
-
- LocationLayerController(MapboxMap mapboxMap, Style style, LayerSourceProvider layerSourceProvider,
- LayerFeatureProvider featureProvider, LayerBitmapProvider bitmapProvider,
- @NonNull LocationComponentOptions options,
- @NonNull OnRenderModeChangedListener internalRenderModeChangedListener) {
- this.mapboxMap = mapboxMap;
- this.style = style;
- this.layerSourceProvider = layerSourceProvider;
- this.bitmapProvider = bitmapProvider;
- this.locationFeature = featureProvider.generateLocationFeature(locationFeature, options);
- this.internalRenderModeChangedListener = internalRenderModeChangedListener;
- initializeComponents(style, options);
- }
-
- void initializeComponents(Style style, LocationComponentOptions options) {
- this.style = style;
- this.positionManager = new LocationComponentPositionManager(style, options.layerAbove(), options.layerBelow());
- addLocationSource();
- addLayers();
- applyStyle(options);
-
- if (isHidden) {
- hide();
- } else {
- show();
- }
- }
-
- void applyStyle(@NonNull LocationComponentOptions options) {
- if (positionManager.update(options.layerAbove(), options.layerBelow())) {
- removeLayers();
- addLayers();
- if (isHidden) {
- hide();
- }
- }
-
- this.options = options;
-
- float elevation = options.elevation();
- // Only add icon elevation if the values greater than 0.
- if (elevation > 0) {
- styleShadow(options);
- }
- styleForeground(options);
- styleBackground(options);
- styleBearing(options);
- styleAccuracy(options.accuracyAlpha(), options.accuracyColor());
- styleScaling(options);
- determineIconsSource(options);
-
- if (!isHidden) {
- show();
- }
- }
-
- void setRenderMode(@RenderMode.Mode int renderMode) {
- if (this.renderMode == renderMode) {
- return;
- }
- this.renderMode = renderMode;
-
- styleForeground(options);
- determineIconsSource(options);
- if (!isHidden) {
- show();
- }
- internalRenderModeChangedListener.onRenderModeChanged(renderMode);
- }
-
- int getRenderMode() {
- return renderMode;
- }
-
- //
- // Layer action
- //
-
- void show() {
- isHidden = false;
- boolean isStale = locationFeature.getBooleanProperty(PROPERTY_LOCATION_STALE);
- switch (renderMode) {
- case RenderMode.NORMAL:
- setLayerVisibility(SHADOW_LAYER, true);
- setLayerVisibility(FOREGROUND_LAYER, true);
- setLayerVisibility(BACKGROUND_LAYER, true);
- setLayerVisibility(ACCURACY_LAYER, !isStale);
- setLayerVisibility(BEARING_LAYER, false);
- break;
- case RenderMode.COMPASS:
- setLayerVisibility(SHADOW_LAYER, true);
- setLayerVisibility(FOREGROUND_LAYER, true);
- setLayerVisibility(BACKGROUND_LAYER, true);
- setLayerVisibility(ACCURACY_LAYER, !isStale);
- setLayerVisibility(BEARING_LAYER, true);
- break;
- case RenderMode.GPS:
- setLayerVisibility(SHADOW_LAYER, false);
- setLayerVisibility(FOREGROUND_LAYER, true);
- setLayerVisibility(BACKGROUND_LAYER, true);
- setLayerVisibility(ACCURACY_LAYER, false);
- setLayerVisibility(BEARING_LAYER, false);
- break;
- default:
- break;
- }
- }
-
- void hide() {
- isHidden = true;
- for (String layerId : layerSet) {
- setLayerVisibility(layerId, false);
- }
- }
-
- void updateForegroundOffset(double tilt) {
- JsonArray foregroundJsonArray = new JsonArray();
- foregroundJsonArray.add(0f);
- foregroundJsonArray.add((float) (-0.05 * tilt));
- locationFeature.addProperty(PROPERTY_FOREGROUND_ICON_OFFSET, foregroundJsonArray);
-
- JsonArray backgroundJsonArray = new JsonArray();
- backgroundJsonArray.add(0f);
- backgroundJsonArray.add((float) (0.05 * tilt));
- locationFeature.addProperty(PROPERTY_SHADOW_ICON_OFFSET, backgroundJsonArray);
-
- refreshSource();
- }
-
- void updateForegroundBearing(float bearing) {
- if (renderMode != RenderMode.GPS) {
- setBearingProperty(PROPERTY_GPS_BEARING, bearing);
- }
- }
-
- boolean isHidden() {
- return isHidden;
- }
-
- boolean isConsumingCompass() {
- return renderMode == RenderMode.COMPASS;
- }
-
- private void setLayerVisibility(@NonNull String layerId, boolean visible) {
- Layer layer = style.getLayer(layerId);
- if (layer != null) {
- String targetVisibility = visible ? VISIBLE : NONE;
- if (!layer.getVisibility().value.equals(targetVisibility)) {
- layer.setProperties(visibility(visible ? VISIBLE : NONE));
- }
- }
- }
-
- private void addLayers() {
- // positions the top-most reference layer
- Layer layer = layerSourceProvider.generateLayer(BEARING_LAYER);
- positionManager.addLayerToMap(layer);
- layerSet.add(layer.getId());
-
- // adds remaining layers while keeping the order
- addSymbolLayer(FOREGROUND_LAYER, BEARING_LAYER);
- addSymbolLayer(BACKGROUND_LAYER, FOREGROUND_LAYER);
- addSymbolLayer(SHADOW_LAYER, BACKGROUND_LAYER);
- addAccuracyLayer();
- }
-
- private void addSymbolLayer(@NonNull String layerId, @NonNull String beforeLayerId) {
- Layer layer = layerSourceProvider.generateLayer(layerId);
- addLayerToMap(layer, beforeLayerId);
- }
-
- private void addAccuracyLayer() {
- Layer accuracyLayer = layerSourceProvider.generateAccuracyLayer();
- addLayerToMap(accuracyLayer, BACKGROUND_LAYER);
- }
-
- private void addLayerToMap(Layer layer, @NonNull String idBelowLayer) {
- style.addLayerBelow(layer, idBelowLayer);
- layerSet.add(layer.getId());
- }
-
- private void removeLayers() {
- for (String layerId : layerSet) {
- style.removeLayer(layerId);
- }
- layerSet.clear();
- }
-
- private void setBearingProperty(@NonNull String propertyId, float bearing) {
- locationFeature.addNumberProperty(propertyId, bearing);
- refreshSource();
- }
-
- private void updateAccuracyRadius(float accuracy) {
- locationFeature.addNumberProperty(PROPERTY_ACCURACY_RADIUS, accuracy);
- refreshSource();
- }
-
- //
- // Source actions
- //
-
- private void addLocationSource() {
- locationSource = layerSourceProvider.generateSource(locationFeature);
- style.addSource(locationSource);
- }
-
- private void refreshSource() {
- GeoJsonSource source = style.getSourceAs(LOCATION_SOURCE);
- if (source != null) {
- locationSource.setGeoJson(locationFeature);
- }
- }
-
- private void setLocationPoint(Point locationPoint) {
- JsonObject properties = locationFeature.properties();
- if (properties != null) {
- locationFeature = Feature.fromGeometry(locationPoint, properties);
- refreshSource();
- }
- }
-
- //
- // Styling
- //
-
- private void styleBackground(LocationComponentOptions options) {
- Bitmap backgroundBitmap = bitmapProvider.generateBitmap(
- options.backgroundDrawable(), options.backgroundTintColor()
- );
- Bitmap backgroundStaleBitmap = bitmapProvider.generateBitmap(
- options.backgroundDrawableStale(), options.backgroundStaleTintColor()
- );
- style.addImage(BACKGROUND_ICON, backgroundBitmap);
- style.addImage(BACKGROUND_STALE_ICON, backgroundStaleBitmap);
- }
-
- private void styleShadow(@NonNull LocationComponentOptions options) {
- style.addImage(SHADOW_ICON, bitmapProvider.generateShadowBitmap(options));
- }
-
- private void styleBearing(LocationComponentOptions options) {
- Bitmap bearingBitmap = bitmapProvider.generateBitmap(options.bearingDrawable(), options.bearingTintColor());
- style.addImage(BEARING_ICON, bearingBitmap);
- }
-
- private void styleAccuracy(float accuracyAlpha, @ColorInt int accuracyColor) {
- locationFeature.addNumberProperty(PROPERTY_ACCURACY_ALPHA, accuracyAlpha);
- locationFeature.addStringProperty(PROPERTY_ACCURACY_COLOR, colorToRgbaString(accuracyColor));
- refreshSource();
- }
-
- private void styleForeground(LocationComponentOptions options) {
- Bitmap foregroundBitmap = bitmapProvider.generateBitmap(
- options.foregroundDrawable(), options.foregroundTintColor()
- );
- Bitmap foregroundBitmapStale = bitmapProvider.generateBitmap(
- options.foregroundDrawableStale(), options.foregroundStaleTintColor()
- );
- if (renderMode == RenderMode.GPS) {
- foregroundBitmap = bitmapProvider.generateBitmap(
- options.gpsDrawable(), options.foregroundTintColor()
- );
- foregroundBitmapStale = bitmapProvider.generateBitmap(
- options.gpsDrawable(), options.foregroundStaleTintColor()
- );
- }
- style.addImage(FOREGROUND_ICON, foregroundBitmap);
- style.addImage(FOREGROUND_STALE_ICON, foregroundBitmapStale);
- }
-
- private void styleScaling(@NonNull LocationComponentOptions options) {
- for (String layerId : layerSet) {
- Layer layer = style.getLayer(layerId);
- if (layer instanceof SymbolLayer) {
- layer.setProperties(
- iconSize(
- interpolate(linear(), zoom(),
- stop(mapboxMap.getMinZoomLevel(), options.minZoomIconScale()),
- stop(mapboxMap.getMaxZoomLevel(), options.maxZoomIconScale())
- )
- )
- );
- }
- }
- }
-
- private void determineIconsSource(LocationComponentOptions options) {
- String foregroundIconString = buildIconString(
- renderMode == RenderMode.GPS ? options.gpsName() : options.foregroundName(), FOREGROUND_ICON);
- String foregroundStaleIconString = buildIconString(options.foregroundStaleName(), FOREGROUND_STALE_ICON);
- String backgroundIconString = buildIconString(options.backgroundName(), BACKGROUND_ICON);
- String backgroundStaleIconString = buildIconString(options.backgroundStaleName(), BACKGROUND_STALE_ICON);
- String bearingIconString = buildIconString(options.bearingName(), BEARING_ICON);
-
- locationFeature.addStringProperty(PROPERTY_FOREGROUND_ICON, foregroundIconString);
- locationFeature.addStringProperty(PROPERTY_BACKGROUND_ICON, backgroundIconString);
- locationFeature.addStringProperty(PROPERTY_FOREGROUND_STALE_ICON, foregroundStaleIconString);
- locationFeature.addStringProperty(PROPERTY_BACKGROUND_STALE_ICON, backgroundStaleIconString);
- locationFeature.addStringProperty(PROPERTY_BEARING_ICON, bearingIconString);
- refreshSource();
- }
-
- @NonNull
- private String buildIconString(@Nullable String bitmapName, @NonNull String drawableName) {
- if (bitmapName != null) {
- return bitmapName;
- }
- return drawableName;
- }
-
- void setLocationsStale(boolean isStale) {
- locationFeature.addBooleanProperty(PROPERTY_LOCATION_STALE, isStale);
- refreshSource();
- if (renderMode != RenderMode.GPS) {
- setLayerVisibility(ACCURACY_LAYER, !isStale);
- }
- }
-
- //
- // Map click event
- //
-
- boolean onMapClick(@NonNull LatLng point) {
- PointF screenLoc = mapboxMap.getProjection().toScreenLocation(point);
- List<Feature> features = mapboxMap.queryRenderedFeatures(screenLoc,
- BACKGROUND_LAYER,
- FOREGROUND_LAYER,
- BEARING_LAYER
- );
- return !features.isEmpty();
- }
-
- private final MapboxAnimator.AnimationsValueChangeListener<LatLng> latLngValueListener =
- new MapboxAnimator.AnimationsValueChangeListener<LatLng>() {
- @Override
- public void onNewAnimationValue(LatLng value) {
- Point point = Point.fromLngLat(value.getLongitude(), value.getLatitude());
- setLocationPoint(point);
- }
- };
-
- private final MapboxAnimator.AnimationsValueChangeListener<Float> gpsBearingValueListener =
- new MapboxAnimator.AnimationsValueChangeListener<Float>() {
- @Override
- public void onNewAnimationValue(Float value) {
- setBearingProperty(PROPERTY_GPS_BEARING, value);
- }
- };
-
- private final MapboxAnimator.AnimationsValueChangeListener<Float> compassBearingValueListener =
- new MapboxAnimator.AnimationsValueChangeListener<Float>() {
- @Override
- public void onNewAnimationValue(Float value) {
- setBearingProperty(PROPERTY_COMPASS_BEARING, value);
- }
- };
-
- private final MapboxAnimator.AnimationsValueChangeListener<Float> accuracyValueListener =
- new MapboxAnimator.AnimationsValueChangeListener<Float>() {
- @Override
- public void onNewAnimationValue(Float value) {
- updateAccuracyRadius(value);
- }
- };
-
- Set<AnimatorListenerHolder> getAnimationListeners() {
- Set<AnimatorListenerHolder> holders = new HashSet<>();
- holders.add(new AnimatorListenerHolder(MapboxAnimator.ANIMATOR_LAYER_LATLNG, latLngValueListener));
-
- if (renderMode == RenderMode.GPS) {
- holders.add(new AnimatorListenerHolder(MapboxAnimator.ANIMATOR_LAYER_GPS_BEARING, gpsBearingValueListener));
- } else if (renderMode == RenderMode.COMPASS) {
- holders.add(
- new AnimatorListenerHolder(MapboxAnimator.ANIMATOR_LAYER_COMPASS_BEARING, compassBearingValueListener));
- }
-
- if (renderMode == RenderMode.COMPASS || renderMode == RenderMode.NORMAL) {
- holders.add(new AnimatorListenerHolder(MapboxAnimator.ANIMATOR_LAYER_ACCURACY, accuracyValueListener));
- }
-
- return holders;
- }
-} \ No newline at end of file