#pragma once #include #include #include #include #include #include #include #include "annotation/marker.hpp" #include "annotation/polygon.hpp" #include "annotation/polyline.hpp" #include "graphics/pointf.hpp" #include "graphics/rectf.hpp" #include "geojson/feature.hpp" #include "geojson/geometry.hpp" #include "gson/json_object.hpp" #include "geometry/lat_lng.hpp" #include "geometry/projected_meters.hpp" #include "style/layers/layer_manager.hpp" #include "style/sources/source.hpp" #include "geometry/lat_lng_bounds.hpp" #include "map/camera_position.hpp" #include "map/image.hpp" #include "style/light.hpp" #include "native_map_options.hpp" #include "bitmap.hpp" #include #include #include #include #include #include namespace mbgl { namespace android { class AndroidRendererFrontend; class FileSource; class MapRenderer; class RenderingStats; class NativeMapView : public MapObserver { public: static constexpr auto Name() { return "org/maplibre/android/maps/NativeMapView"; }; static void registerNative(jni::JNIEnv&); NativeMapView(jni::JNIEnv&, const jni::Object&, const jni::Object&, const jni::Object&, const jni::Object&); virtual ~NativeMapView(); // mbgl::RendererBackend (mbgl::MapObserver) // void onCameraWillChange(MapObserver::CameraChangeMode) override; void onCameraIsChanging() override; void onCameraDidChange(MapObserver::CameraChangeMode) override; void onWillStartLoadingMap() override; void onDidFinishLoadingMap() override; void onDidFailLoadingMap(MapLoadError, const std::string&) override; void onWillStartRenderingFrame() override; void onDidFinishRenderingFrame(const MapObserver::RenderFrameStatus&) override; void onWillStartRenderingMap() override; void onDidFinishRenderingMap(MapObserver::RenderMode) override; void onDidBecomeIdle() override; void onDidFinishLoadingStyle() override; void onSourceChanged(mbgl::style::Source&) override; void onStyleImageMissing(const std::string&) override; bool onCanRemoveUnusedStyleImage(const std::string&) override; // JNI // void resizeView(jni::JNIEnv&, int, int); jni::Local getStyleUrl(jni::JNIEnv&); void setStyleUrl(jni::JNIEnv&, const jni::String&); jni::Local getStyleJson(jni::JNIEnv&); void setStyleJson(jni::JNIEnv&, const jni::String&); void setLatLngBounds(jni::JNIEnv&, const jni::Object&); void cancelTransitions(jni::JNIEnv&); void setGestureInProgress(jni::JNIEnv&, jni::jboolean); void moveBy(jni::JNIEnv&, jni::jdouble, jni::jdouble, jni::jlong); void jumpTo(jni::JNIEnv&, jni::jdouble, jni::jdouble, jni::jdouble, jni::jdouble, jni::jdouble, const jni::Array&); void easeTo(jni::JNIEnv&, jni::jdouble, jni::jdouble, jni::jdouble, jni::jlong, jni::jdouble, jni::jdouble, const jni::Array&, jni::jboolean); void flyTo(jni::JNIEnv&, jni::jdouble, jni::jdouble, jni::jdouble, jni::jlong, jni::jdouble, jni::jdouble, const jni::Array&); jni::Local> getLatLng(JNIEnv&); void setLatLng(jni::JNIEnv&, jni::jdouble, jni::jdouble, const jni::Array&, jni::jlong); jni::Local> getCameraForLatLngBounds(jni::JNIEnv&, const jni::Object&, double top, double left, double bottom, double right, double bearing, double tilt); jni::Local> getCameraForGeometry(jni::JNIEnv&, const jni::Object&, double top, double left, double bottom, double right, double bearing, double tilt); void setReachability(jni::JNIEnv&, jni::jboolean); void resetPosition(jni::JNIEnv&); jni::jdouble getPitch(jni::JNIEnv&); void setPitch(jni::JNIEnv&, jni::jdouble, jni::jlong); void setZoom(jni::JNIEnv&, jni::jdouble, jni::jdouble, jni::jdouble, jni::jlong); jni::jdouble getZoom(jni::JNIEnv&); void resetZoom(jni::JNIEnv&); void setMinZoom(jni::JNIEnv&, jni::jdouble); jni::jdouble getMinZoom(jni::JNIEnv&); void setMaxZoom(jni::JNIEnv&, jni::jdouble); jni::jdouble getMaxZoom(jni::JNIEnv&); void setMinPitch(jni::JNIEnv&, jni::jdouble); jni::jdouble getMinPitch(jni::JNIEnv&); void setMaxPitch(jni::JNIEnv&, jni::jdouble); jni::jdouble getMaxPitch(jni::JNIEnv&); void rotateBy(jni::JNIEnv&, jni::jdouble, jni::jdouble, jni::jdouble, jni::jdouble, jni::jlong); void setBearing(jni::JNIEnv&, jni::jdouble, jni::jlong); void setBearingXY(jni::JNIEnv&, jni::jdouble, jni::jdouble, jni::jdouble, jni::jlong); jni::jdouble getBearing(jni::JNIEnv&); void resetNorth(jni::JNIEnv&); void setVisibleCoordinateBounds( JNIEnv&, const jni::Array>&, const jni::Object&, jni::jdouble, jni::jlong); void getVisibleCoordinateBounds(JNIEnv& env, jni::Array& output); void scheduleSnapshot(jni::JNIEnv&); jni::Local> getCameraPosition(jni::JNIEnv&); void updateMarker(jni::JNIEnv&, jni::jlong, jni::jdouble, jni::jdouble, const jni::String&); jni::Local> addMarkers(jni::JNIEnv&, const jni::Array>&); void onLowMemory(JNIEnv& env); void setDebug(JNIEnv&, jni::jboolean); jni::jboolean getDebug(JNIEnv&); jni::Local> getActionJournalLogFiles(JNIEnv&); jni::Local> getActionJournalLog(JNIEnv&); void clearActionJournalLog(JNIEnv&); jni::jboolean isFullyLoaded(JNIEnv&); jni::jdouble getMetersPerPixelAtLatitude(JNIEnv&, jni::jdouble, jni::jdouble); jni::Local> projectedMetersForLatLng(JNIEnv&, jni::jdouble, jni::jdouble); jni::Local> pixelForLatLng(JNIEnv&, jdouble, jdouble); void pixelsForLatLngs(JNIEnv&, const jni::Array&, jni::Array&, jfloat); jni::Local> latLngForProjectedMeters(JNIEnv&, jdouble, jdouble); jni::Local> latLngForPixel(JNIEnv&, jfloat, jfloat); void latLngsForPixels(JNIEnv&, const jni::Array&, jni::Array&, jfloat); jni::Local> addPolylines(JNIEnv&, const jni::Array>&); jni::Local> addPolygons(JNIEnv&, const jni::Array>&); void updatePolyline(JNIEnv&, jlong, const jni::Object&); void updatePolygon(JNIEnv&, jlong, const jni::Object&); void removeAnnotations(JNIEnv&, const jni::Array&); void addAnnotationIcon(JNIEnv&, const jni::String&, jint, jint, jfloat, const jni::Array&); void removeAnnotationIcon(JNIEnv&, const jni::String&); jni::jdouble getTopOffsetPixelsForAnnotationSymbol(JNIEnv&, const jni::String&); jni::Local> getTransitionOptions(JNIEnv&); void setTransitionOptions(JNIEnv&, const jni::Object&); jni::Local> queryPointAnnotations(JNIEnv&, const jni::Object&); jni::Local> queryShapeAnnotations(JNIEnv&, const jni::Object&); jni::Local>> queryRenderedFeaturesForPoint( JNIEnv&, jni::jfloat, jni::jfloat, const jni::Array&, const jni::Array>& jfilter); jni::Local>> queryRenderedFeaturesForBox( JNIEnv&, jni::jfloat, jni::jfloat, jni::jfloat, jni::jfloat, const jni::Array&, const jni::Array>& jfilter); void setFeatureState(JNIEnv&, const jni::String& sourceId, const jni::String& sourceLayerId, const jni::String& featureId, const jni::Object& state); jni::Local> getFeatureState(JNIEnv&, const jni::String& sourceId, const jni::String& sourceLayerId, const jni::String& featureId); void removeFeatureState(JNIEnv&, const jni::String& sourceId, const jni::String& sourceLayerId, const jni::String& featureId, const jni::String& stateKey); jni::Local> getLight(JNIEnv&); jni::Local>> getLayers(JNIEnv&); jni::Local> getLayer(JNIEnv&, const jni::String&); jni::jboolean setStyleLayerFloatProperty(JNIEnv&, const jni::String&, const jni::String&, jni::jfloat); jni::jboolean advanceRasterArraySourceFieldWindow(JNIEnv&, const jni::String&); void addLayer(JNIEnv&, jlong, const jni::String&); void addLayerAbove(JNIEnv&, jlong, const jni::String&); void addLayerAt(JNIEnv&, jni::jlong, jni::jint); jni::jboolean removeLayerAt(JNIEnv&, jni::jint); jni::jboolean removeLayer(JNIEnv&, jlong); jni::Local>> getSources(JNIEnv&); jni::Local> getSource(JNIEnv&, const jni::String&); void addSource(JNIEnv&, const jni::Object&, jlong nativePtr); jni::jboolean removeSource(JNIEnv&, const jni::Object&, jlong nativePtr); void addImage(JNIEnv&, const jni::String&, const jni::Object& bitmap, jni::jfloat, jni::jboolean); void addImages(JNIEnv&, const jni::Array>&); void removeImage(JNIEnv&, const jni::String&); jni::Local> getImage(JNIEnv&, const jni::String&); void setPrefetchTiles(JNIEnv&, jni::jboolean); jni::jboolean getPrefetchTiles(JNIEnv&); void setPrefetchZoomDelta(JNIEnv&, jni::jint); jni::jint getPrefetchZoomDelta(JNIEnv&); void setTileCacheEnabled(JNIEnv&, jni::jboolean); jni::jboolean getTileCacheEnabled(JNIEnv&); void setTileLodMinRadius(JNIEnv&, jni::jdouble); jni::jdouble getTileLodMinRadius(JNIEnv&); void setTileLodScale(JNIEnv&, jni::jdouble); jni::jdouble getTileLodScale(JNIEnv&); void setTileLodPitchThreshold(JNIEnv&, jni::jdouble); jni::jdouble getTileLodPitchThreshold(JNIEnv&); void setTileLodZoomShift(JNIEnv&, jni::jdouble); jni::jdouble getTileLodZoomShift(JNIEnv&); mbgl::Map& getMap(); void triggerRepaint(JNIEnv&); jni::jboolean isRenderingStatsViewEnabled(JNIEnv&); void enableRenderingStatsView(JNIEnv&, jni::jboolean); void setFrustumOffset(JNIEnv&, const jni::Object&); // Shader compilation void onRegisterShaders(mbgl::gfx::ShaderRegistry&) override; void onPreCompileShader(mbgl::shaders::BuiltIn, mbgl::gfx::Backend::Type, const std::string&) override; void onPostCompileShader(mbgl::shaders::BuiltIn, mbgl::gfx::Backend::Type, const std::string&) override; void onShaderCompileFailed(mbgl::shaders::BuiltIn, mbgl::gfx::Backend::Type, const std::string&) override; // Glyph requests void onGlyphsLoaded(const mbgl::FontStack&, const mbgl::GlyphRange&) override; void onGlyphsError(const mbgl::FontStack&, const mbgl::GlyphRange&, std::exception_ptr) override; void onGlyphsRequested(const mbgl::FontStack&, const mbgl::GlyphRange&) override; // Tile requests void onTileAction(mbgl::TileOperation, const mbgl::OverscaledTileID&, const std::string&) override; // Sprite requests void onSpriteLoaded(const std::optional&) override; void onSpriteError(const std::optional&, std::exception_ptr) override; void onSpriteRequested(const std::optional&) override; // Renderer void onRenderError(std::exception_ptr) override; private: std::shared_ptr rendererFrontend; JavaVM* vm = nullptr; jni::WeakReference> javaPeer; MapRenderer& mapRenderer; std::string styleUrl; float pixelRatio; jni::Global> renderingStats; // Minimum texture size according to OpenGL ES 2.0 specification. int width = 64; int height = 64; static constexpr auto annotationRequestTimeout = std::chrono::milliseconds(200); // Ensure these are initialised last std::unique_ptr map; }; } // namespace android } // namespace mbgl