package com.mapbox.mapboxsdk.maps; import android.content.Context; import android.graphics.Bitmap; import android.graphics.PointF; import android.graphics.RectF; import android.os.Bundle; import android.support.annotation.FloatRange; import android.support.annotation.IntRange; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.Size; import android.support.annotation.UiThread; import android.support.v4.util.Pools; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; import com.mapbox.android.gestures.AndroidGesturesManager; import com.mapbox.android.gestures.MoveGestureDetector; import com.mapbox.android.gestures.RotateGestureDetector; import com.mapbox.android.gestures.ShoveGestureDetector; import com.mapbox.android.gestures.StandardScaleGestureDetector; import com.mapbox.geojson.Feature; import com.mapbox.geojson.Geometry; import com.mapbox.mapboxsdk.annotations.Annotation; import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; import com.mapbox.mapboxsdk.annotations.BaseMarkerViewOptions; import com.mapbox.mapboxsdk.annotations.Marker; import com.mapbox.mapboxsdk.annotations.MarkerOptions; import com.mapbox.mapboxsdk.annotations.MarkerView; import com.mapbox.mapboxsdk.annotations.MarkerViewManager; import com.mapbox.mapboxsdk.annotations.Polygon; import com.mapbox.mapboxsdk.annotations.PolygonOptions; import com.mapbox.mapboxsdk.annotations.Polyline; import com.mapbox.mapboxsdk.annotations.PolylineOptions; import com.mapbox.mapboxsdk.camera.CameraPosition; import com.mapbox.mapboxsdk.camera.CameraUpdate; import com.mapbox.mapboxsdk.camera.CameraUpdateFactory; import com.mapbox.mapboxsdk.constants.MapboxConstants; import com.mapbox.mapboxsdk.constants.Style; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.geometry.LatLngBounds; import com.mapbox.mapboxsdk.log.Logger; import com.mapbox.mapboxsdk.style.expressions.Expression; import com.mapbox.mapboxsdk.style.layers.Layer; import com.mapbox.mapboxsdk.style.light.Light; import com.mapbox.mapboxsdk.style.sources.Source; import java.util.HashMap; import java.util.List; /** * The general class to interact with in the Android Mapbox SDK. It exposes the entry point for all * methods related to the MapView. You cannot instantiate {@link MapboxMap} object directly, rather, * you must obtain one from the getMapAsync() method on a MapFragment or MapView that you have * added to your application. *
* Note: Similar to a View object, a MapboxMap should only be read and modified from the main thread. *
*/ @UiThread public final class MapboxMap { private static final String TAG = "Mbgl-MapboxMap"; private final NativeMapView nativeMapView; private final UiSettings uiSettings; private final Projection projection; private final Transform transform; private final AnnotationManager annotationManager; private final CameraChangeDispatcher cameraChangeDispatcher; private final OnGesturesManagerInteractionListener onGesturesManagerInteractionListener; private MapboxMap.OnFpsChangedListener onFpsChangedListener; MapboxMap(NativeMapView map, Transform transform, UiSettings ui, Projection projection, OnGesturesManagerInteractionListener listener, AnnotationManager annotations, CameraChangeDispatcher cameraChangeDispatcher) { this.nativeMapView = map; this.uiSettings = ui; this.projection = projection; this.annotationManager = annotations.bind(this); this.transform = transform; this.onGesturesManagerInteractionListener = listener; this.cameraChangeDispatcher = cameraChangeDispatcher; } void initialise(@NonNull Context context, @NonNull MapboxMapOptions options) { transform.initialise(this, options); uiSettings.initialise(context, options); // Map configuration setDebugActive(options.getDebugActive()); setApiBaseUrl(options); setStyleUrl(options); setStyleJson(options); setPrefetchesTiles(options); } /** * Called when the hosting Activity/Fragment onStart() method is called. */ void onStart() { nativeMapView.update(); if (TextUtils.isEmpty(nativeMapView.getStyleUrl()) && TextUtils.isEmpty(nativeMapView.getStyleJson())) { // if user hasn't loaded a Style yet nativeMapView.setStyleUrl(Style.MAPBOX_STREETS); } } /** * Called when the hosting Activity/Fragment onStop() method is called. */ void onStop() { } /** * Called when the hosting Activity/Fragment is going to be destroyed and map state needs to be saved. * * @param outState the bundle to save the state to. */ void onSaveInstanceState(@NonNull Bundle outState) { outState.putParcelable(MapboxConstants.STATE_CAMERA_POSITION, transform.getCameraPosition()); outState.putBoolean(MapboxConstants.STATE_DEBUG_ACTIVE, nativeMapView.getDebug()); outState.putString(MapboxConstants.STATE_STYLE_URL, nativeMapView.getStyleUrl()); uiSettings.onSaveInstanceState(outState); } /** * Called when the hosting Activity/Fragment is recreated and map state needs to be restored. * * @param savedInstanceState the bundle containing the saved state */ void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { final CameraPosition cameraPosition = savedInstanceState.getParcelable(MapboxConstants.STATE_CAMERA_POSITION); uiSettings.onRestoreInstanceState(savedInstanceState); if (cameraPosition != null) { moveCamera(CameraUpdateFactory.newCameraPosition( new CameraPosition.Builder(cameraPosition).build()) ); } nativeMapView.setDebug(savedInstanceState.getBoolean(MapboxConstants.STATE_DEBUG_ACTIVE)); final String styleUrl = savedInstanceState.getString(MapboxConstants.STATE_STYLE_URL); if (!TextUtils.isEmpty(styleUrl)) { nativeMapView.setStyleUrl(savedInstanceState.getString(MapboxConstants.STATE_STYLE_URL)); } } /** * Called before the OnMapReadyCallback is invoked. */ void onPreMapReady() { invalidateCameraPosition(); annotationManager.reloadMarkers(); annotationManager.adjustTopOffsetPixels(this); } /** * Called when the OnMapReadyCallback has finished executing. ** Invalidation of the camera position is required to update the added components in * OnMapReadyCallback with the correct transformation. *
*/ void onPostMapReady() { invalidateCameraPosition(); } /** * Called when the region is changing or has changed. */ void onUpdateRegionChange() { annotationManager.update(); } /** * Called when the map frame is fully rendered. */ void onUpdateFullyRendered() { CameraPosition cameraPosition = transform.invalidateCameraPosition(); if (cameraPosition != null) { uiSettings.update(cameraPosition); } } // Style /** ** Get the animation duration for style changes. *
* The default value is zero, so any changes take effect without animation. * * @return Duration in milliseconds */ public long getTransitionDuration() { return nativeMapView.getTransitionDuration(); } /** * Set the animation duration for style changes. * * @param durationMs Duration in milliseconds */ public void setTransitionDuration(long durationMs) { nativeMapView.setTransitionDuration(durationMs); } /** ** Get the animation delay for style changes. *
* The default value is zero, so any changes begin to animate immediately. * * @return Delay in milliseconds */ public long getTransitionDelay() { return nativeMapView.getTransitionDelay(); } /** * Set the animation delay for style changes. * * @param delayMs Delay in milliseconds */ public void setTransitionDelay(long delayMs) { nativeMapView.setTransitionDelay(delayMs); } /** * Sets tile pre-fetching from MapboxOptions. * * @param options the options object */ private void setPrefetchesTiles(@NonNull MapboxMapOptions options) { setPrefetchesTiles(options.getPrefetchesTiles()); } /** * Enable or disable tile pre-fetching. Pre-fetching makes sure that a low-resolution * tile is rendered as soon as possible at the expense of a little bandwidth. * * @param enable true to enable */ public void setPrefetchesTiles(boolean enable) { nativeMapView.setPrefetchesTiles(enable); } /** * Check whether tile pre-fetching is enabled or not. * * @return true if enabled * @see MapboxMap#setPrefetchesTiles(boolean) */ public boolean getPrefetchesTiles() { return nativeMapView.getPrefetchesTiles(); } /** * Retrieve all the layers in the style * * @return all the layers in the current style */ @NonNull public List