From 0704b262686186eb747a45b7b949a2bca4916fce Mon Sep 17 00:00:00 2001 From: Tobrun Date: Wed, 24 Jan 2018 19:42:15 +0100 Subject: [android] - add binding integration for RasterDEMSource, add example --- .../mapboxsdk/style/sources/RasterDemSource.java | 93 ++++++++++++++++++++++ .../src/main/AndroidManifest.xml | 11 +++ .../activity/style/HillshadeLayerActivity.java | 84 +++++++++++++++++++ .../res/layout/activity_fill_extrusion_layer.xml | 8 +- .../main/res/layout/activity_hillshade_layer.xml | 17 ++++ .../src/main/res/values/descriptions.xml | 1 + .../src/main/res/values/titles.xml | 1 + platform/android/config.cmake | 2 + .../src/style/sources/raster_dem_source.cpp | 63 +++++++++++++++ .../src/style/sources/raster_dem_source.hpp | 33 ++++++++ platform/android/src/style/sources/source.cpp | 2 + 11 files changed, 312 insertions(+), 3 deletions(-) create mode 100644 platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/RasterDemSource.java create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/HillshadeLayerActivity.java create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_hillshade_layer.xml create mode 100644 platform/android/src/style/sources/raster_dem_source.cpp create mode 100644 platform/android/src/style/sources/raster_dem_source.hpp diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/RasterDemSource.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/RasterDemSource.java new file mode 100644 index 0000000000..54c75d3a40 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/RasterDemSource.java @@ -0,0 +1,93 @@ +package com.mapbox.mapboxsdk.style.sources; + +import android.support.annotation.Nullable; +import android.support.annotation.UiThread; + +import java.net.URL; + +/** + * A raster DEM source. Currently only supports Mapbox Terrain RGB (mapbox://mapbox.terrain-rgb) + * + * @see The style specification + */ +@UiThread +public class RasterDemSource extends Source { + public static final int DEFAULT_TILE_SIZE = 512; + + /** + * Internal use + * + * @param nativePtr - pointer to native peer + */ + public RasterDemSource(long nativePtr) { + super(nativePtr); + } + + /** + * Create the raster dem source from an URL + * + * @param id the source id + * @param url the source url + */ + public RasterDemSource(String id, URL url) { + this(id, url.toExternalForm()); + } + + /** + * Create the raster dem source from an URL + * + * @param id the source id + * @param url the source url + */ + public RasterDemSource(String id, String url) { + initialize(id, url, DEFAULT_TILE_SIZE); + } + + /** + * Create the raster source from an URL with a specific tile size + * + * @param id the source id + * @param url the source url + * @param tileSize the tile size + */ + public RasterDemSource(String id, String url, int tileSize) { + initialize(id, url, tileSize); + } + + /** + * Create the raster dem source from a {@link TileSet} + * + * @param id the source id + * @param tileSet the {@link TileSet} + */ + public RasterDemSource(String id, TileSet tileSet) { + initialize(id, tileSet.toValueObject(), DEFAULT_TILE_SIZE); + } + + /** + * Create the raster source from a {@link TileSet} with a specific tile size + * + * @param id the source id + * @param tileSet the {@link TileSet} + * @param tileSize tje tile size + */ + public RasterDemSource(String id, TileSet tileSet, int tileSize) { + initialize(id, tileSet.toValueObject(), tileSize); + } + + /** + * @return The url or null + */ + @Nullable + public String getUrl() { + return nativeGetUrl(); + } + + protected native void initialize(String layerId, Object payload, int tileSize); + + @Override + protected native void finalize() throws Throwable; + + protected native String nativeGetUrl(); + +} diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml index 003fc1df6c..89f922fb9e 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml @@ -778,6 +778,17 @@ android:name="android.support.PARENT_ACTIVITY" android:value=".activity.FeatureOverviewActivity"/> + + + + { + mapboxMap = map; + + RasterDemSource rasterDemSource = new RasterDemSource(SOURCE_ID, SOURCE_URL); + mapboxMap.addSource(rasterDemSource); + + HillshadeLayer hillshadeLayer = new HillshadeLayer(LAYER_ID, SOURCE_ID); + mapboxMap.addLayerBelow(hillshadeLayer, LAYER_BELOW_ID); + }); + } + + @Override + protected void onStart() { + super.onStart(); + mapView.onStart(); + } + + @Override + protected void onResume() { + super.onResume(); + mapView.onResume(); + } + + @Override + protected void onPause() { + super.onPause(); + mapView.onPause(); + } + + @Override + protected void onStop() { + super.onStop(); + mapView.onStop(); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + mapView.onSaveInstanceState(outState); + } + + @Override + public void onLowMemory() { + super.onLowMemory(); + mapView.onLowMemory(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + mapView.onDestroy(); + } +} \ No newline at end of file diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_fill_extrusion_layer.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_fill_extrusion_layer.xml index 304841dc69..5672687ef8 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_fill_extrusion_layer.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_fill_extrusion_layer.xml @@ -9,9 +9,11 @@ android:id="@id/mapView" android:layout_width="match_parent" android:layout_height="match_parent" - app:mapbox_cameraTargetLat="52.090710" - app:mapbox_cameraTargetLng="5.121125" - app:mapbox_cameraZoom="10" + app:mapbox_cameraTargetLat="46.343350" + app:mapbox_cameraTargetLng="7.497989" + app:mapbox_cameraZoom="9" + app:mapbox_cameraBearing="140" + app:mapbox_cameraTilt="60" app:mapbox_styleUrl="@string/mapbox_style_mapbox_streets"/> diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_hillshade_layer.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_hillshade_layer.xml new file mode 100644 index 0000000000..a2410c547c --- /dev/null +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_hillshade_layer.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/descriptions.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/descriptions.xml index e70c3410a8..e867046c80 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/descriptions.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/descriptions.xml @@ -69,4 +69,5 @@ Animate a map rendered on a TextureView Example Custom Geometry Source Suzhou using Droid Sans for Chinese glyphs + Example raster-dem source and hillshade layer diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/titles.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/titles.xml index c4d13e1068..47fee31c0a 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/titles.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/titles.xml @@ -69,4 +69,5 @@ TextureView animation Grid Source Local CJK glyph generation + Hillshade \ No newline at end of file diff --git a/platform/android/config.cmake b/platform/android/config.cmake index 54c6bbee40..4832f8b251 100644 --- a/platform/android/config.cmake +++ b/platform/android/config.cmake @@ -186,6 +186,8 @@ add_library(mbgl-android STATIC platform/android/src/style/sources/vector_source.hpp platform/android/src/style/sources/image_source.hpp platform/android/src/style/sources/image_source.cpp + platform/android/src/style/sources/raster_dem_source.cpp + platform/android/src/style/sources/raster_dem_source.hpp platform/android/src/style/functions/stop.cpp platform/android/src/style/functions/stop.hpp platform/android/src/style/functions/categorical_stops.cpp diff --git a/platform/android/src/style/sources/raster_dem_source.cpp b/platform/android/src/style/sources/raster_dem_source.cpp new file mode 100644 index 0000000000..75e0159d7c --- /dev/null +++ b/platform/android/src/style/sources/raster_dem_source.cpp @@ -0,0 +1,63 @@ +#include "raster_dem_source.hpp" + +#include "../android_conversion.hpp" +#include "../value.hpp" +#include "../conversion/url_or_tileset.hpp" +#include "source.hpp" + +#include + +#include + +namespace mbgl { +namespace android { + + RasterDEMSource::RasterDEMSource(jni::JNIEnv& env, jni::String sourceId, jni::Object<> urlOrTileSet, jni::jint tileSize) + : Source( + env, + std::make_unique( + jni::Make(env, sourceId), + convertURLOrTileset(Value(env, urlOrTileSet)), + tileSize + ) + ) { + } + + RasterDEMSource::RasterDEMSource(jni::JNIEnv& env, + mbgl::style::Source& coreSource, + AndroidRendererFrontend& frontend) + : Source(env, coreSource, createJavaPeer(env), frontend) { + } + + RasterDEMSource::~RasterDEMSource() = default; + + jni::String RasterDEMSource::getURL(jni::JNIEnv& env) { + optional url = source.as()->RasterDEMSource::getURL(); + return url ? jni::Make(env, *url) : jni::String(); + } + + jni::Class RasterDEMSource::javaClass; + + jni::Object RasterDEMSource::createJavaPeer(jni::JNIEnv& env) { + static auto constructor = RasterDEMSource::javaClass.template GetConstructor(env); + return jni::Object(RasterDEMSource::javaClass.New(env, constructor, reinterpret_cast(this)).Get()); + } + + void RasterDEMSource::registerNative(jni::JNIEnv& env) { + // Lookup the class + RasterDEMSource::javaClass = *jni::Class::Find(env).NewGlobalRef(env).release(); + + #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) + + // Register the peer + jni::RegisterNativePeer( + env, RasterDEMSource::javaClass, "nativePtr", + std::make_unique, jni::jint>, + "initialize", + "finalize", + METHOD(&RasterDEMSource::getURL, "nativeGetUrl") + ); + } + +} // namespace android +} // namespace mbgl diff --git a/platform/android/src/style/sources/raster_dem_source.hpp b/platform/android/src/style/sources/raster_dem_source.hpp new file mode 100644 index 0000000000..56924c1f8d --- /dev/null +++ b/platform/android/src/style/sources/raster_dem_source.hpp @@ -0,0 +1,33 @@ +#pragma once + +#include "source.hpp" +#include +#include + +namespace mbgl { +namespace android { + +class RasterDEMSource : public Source { +public: + + static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/sources/RasterDemSource"; }; + + static jni::Class javaClass; + + static void registerNative(jni::JNIEnv&); + + RasterDEMSource(jni::JNIEnv&, jni::String, jni::Object<>, jni::jint); + + RasterDEMSource(jni::JNIEnv&, mbgl::style::Source&, AndroidRendererFrontend&); + + ~RasterDEMSource(); + + jni::String getURL(jni::JNIEnv&); + +private: + jni::Object createJavaPeer(jni::JNIEnv&); + +}; // class RasterDEMSource + +} // namespace android +} // namespace mbgl diff --git a/platform/android/src/style/sources/source.cpp b/platform/android/src/style/sources/source.cpp index 3b89b25d7d..413530a5ec 100644 --- a/platform/android/src/style/sources/source.cpp +++ b/platform/android/src/style/sources/source.cpp @@ -28,6 +28,7 @@ #include "unknown_source.hpp" #include "vector_source.hpp" #include "custom_geometry_source.hpp" +#include "raster_dem_source.hpp" namespace mbgl { namespace android { @@ -155,6 +156,7 @@ namespace android { UnknownSource::registerNative(env); VectorSource::registerNative(env); CustomGeometrySource::registerNative(env); + RasterDEMSource::registerNative(env); } } // namespace android -- cgit v1.2.1