[android] arbitrary offline region geometries

This commit is contained in:
Ivo van Dongen
2018-03-26 21:33:52 +03:00
committed by Ivo van Dongen
parent fae099933b
commit 4fedcf8d06
7 changed files with 223 additions and 7 deletions

View File

@@ -180,6 +180,7 @@ void registerNatives(JavaVM *vm) {
OfflineRegion::registerNative(env);
OfflineRegionDefinition::registerNative(env);
OfflineTilePyramidRegionDefinition::registerNative(env);
OfflineGeometryRegionDefinition::registerNative(env);
OfflineRegionError::registerNative(env);
OfflineRegionStatus::registerNative(env);

View File

@@ -48,9 +48,7 @@ void OfflineManager::createOfflineRegion(jni::JNIEnv& env_,
jni::Array<jni::jbyte> metadata_,
jni::Object<CreateOfflineRegionCallback> callback_) {
// Convert
// XXX hardcoded cast for now as we only support OfflineTilePyramidRegionDefinition
auto definition = OfflineTilePyramidRegionDefinition::getDefinition(env_, jni::Object<OfflineTilePyramidRegionDefinition>(*definition_));
auto definition = OfflineRegionDefinition::getDefinition(env_, definition_);
mbgl::OfflineRegionMetadata metadata;
if (metadata_) {
@@ -152,7 +150,7 @@ void OfflineManager::CreateOfflineRegionCallback::onCreate(jni::JNIEnv& env,
jni::Object<FileSource> jFileSource,
jni::Object<OfflineManager::CreateOfflineRegionCallback> callback,
mbgl::optional<mbgl::OfflineRegion> region) {
//Convert the region to java peer object
// Convert the region to java peer object
auto jregion = OfflineRegion::New(env, jFileSource, std::move(*region));
// Trigger callback

View File

@@ -159,7 +159,14 @@ void OfflineRegion::updateOfflineRegionMetadata(jni::JNIEnv& env_, jni::Array<jn
jni::Object<OfflineRegion> OfflineRegion::New(jni::JNIEnv& env, jni::Object<FileSource> jFileSource, mbgl::OfflineRegion region) {
// Definition
auto definition = jni::Object<OfflineRegionDefinition>(*OfflineTilePyramidRegionDefinition::New(env, region.getDefinition()));
auto definition = region.getDefinition().match(
[&](const mbgl::OfflineTilePyramidRegionDefinition def) {
return jni::Object<OfflineRegionDefinition>(
*OfflineTilePyramidRegionDefinition::New(env, def));
}, [&](const mbgl::OfflineGeometryRegionDefinition def) {
return jni::Object<OfflineRegionDefinition>(
*OfflineGeometryRegionDefinition::New(env, def));
});
// Metadata
auto metadata = OfflineRegion::metadata(env, region.getMetadata());

View File

@@ -1,6 +1,9 @@
#include "offline_region_definition.hpp"
#include "../geometry/lat_lng_bounds.hpp"
#include "../geojson/geometry.hpp"
#include <exception>
namespace mbgl {
namespace android {
@@ -13,9 +16,21 @@ void OfflineRegionDefinition::registerNative(jni::JNIEnv& env) {
javaClass = *jni::Class<OfflineRegionDefinition>::Find(env).NewGlobalRef(env).release();
}
mbgl::OfflineRegionDefinition OfflineRegionDefinition::getDefinition(JNIEnv& env,
jni::Object<OfflineRegionDefinition> jDefinition) {
if (jDefinition.IsInstanceOf(env, OfflineTilePyramidRegionDefinition::javaClass)) {
return OfflineTilePyramidRegionDefinition::getDefinition(env, jni::Object<OfflineTilePyramidRegionDefinition>(*jDefinition));
} else if (jDefinition.IsInstanceOf(env, OfflineGeometryRegionDefinition::javaClass)) {
return OfflineGeometryRegionDefinition::getDefinition(env, jni::Object<OfflineGeometryRegionDefinition>(*jDefinition));
}
throw std::runtime_error("Unknown offline region definition java class");
}
// OfflineTilePyramidRegionDefinition //
jni::Object<OfflineTilePyramidRegionDefinition> OfflineTilePyramidRegionDefinition::New(jni::JNIEnv& env, mbgl::OfflineTilePyramidRegionDefinition definition) {
jni::Object<OfflineTilePyramidRegionDefinition> OfflineTilePyramidRegionDefinition::New(jni::JNIEnv& env, const mbgl::OfflineTilePyramidRegionDefinition& definition) {
//Convert objects
auto styleURL = jni::Make<jni::String>(env, definition.styleURL);
@@ -65,5 +80,56 @@ void OfflineTilePyramidRegionDefinition::registerNative(jni::JNIEnv& env) {
javaClass = *jni::Class<OfflineTilePyramidRegionDefinition>::Find(env).NewGlobalRef(env).release();
}
// OfflineGeometryRegionDefinition //
jni::Object<OfflineGeometryRegionDefinition> OfflineGeometryRegionDefinition::New(jni::JNIEnv& env, const mbgl::OfflineGeometryRegionDefinition& definition) {
//Convert objects
auto styleURL = jni::Make<jni::String>(env, definition.styleURL);
auto geometry = geojson::Geometry::New(env, definition.geometry);
static auto constructor = javaClass.GetConstructor<jni::String, jni::Object<geojson::Geometry>, jni::jdouble, jni::jdouble, jni::jfloat>(env);
auto jdefinition = javaClass.New(env, constructor, styleURL, geometry, definition.minZoom, definition.maxZoom, definition.pixelRatio);
//Delete References
jni::DeleteLocalRef(env, styleURL);
jni::DeleteLocalRef(env, geometry);
return jdefinition;
}
mbgl::OfflineGeometryRegionDefinition OfflineGeometryRegionDefinition::getDefinition(jni::JNIEnv& env, jni::Object<OfflineGeometryRegionDefinition> jDefinition) {
// Field references
static auto styleURLF = javaClass.GetField<jni::String>(env, "styleURL");
static auto geometryF = javaClass.GetField<jni::Object<geojson::Geometry>>(env, "geometry");
static auto minZoomF = javaClass.GetField<jni::jdouble>(env, "minZoom");
static auto maxZoomF = javaClass.GetField<jni::jdouble>(env, "maxZoom");
static auto pixelRatioF = javaClass.GetField<jni::jfloat>(env, "pixelRatio");
// Get objects
auto jStyleURL = jDefinition.Get(env, styleURLF);
auto jGeometry = jDefinition.Get(env, geometryF);
// Create definition
mbgl::OfflineGeometryRegionDefinition definition(
jni::Make<std::string>(env, jStyleURL),
geojson::Geometry::convert(env, jGeometry),
jDefinition.Get(env, minZoomF),
jDefinition.Get(env, maxZoomF),
jDefinition.Get(env, pixelRatioF)
);
// Delete references
jni::DeleteLocalRef(env, jStyleURL);
jni::DeleteLocalRef(env, jGeometry);
return definition;
}
jni::Class<OfflineGeometryRegionDefinition> OfflineGeometryRegionDefinition::javaClass;
void OfflineGeometryRegionDefinition::registerNative(jni::JNIEnv& env) {
javaClass = *jni::Class<OfflineGeometryRegionDefinition>::Find(env).NewGlobalRef(env).release();
}
} // namespace android
} // namespace mbgl

View File

@@ -14,13 +14,14 @@ public:
static void registerNative(jni::JNIEnv&);
static mbgl::OfflineRegionDefinition getDefinition(JNIEnv& env, jni::Object<OfflineRegionDefinition> jDefinition);
};
class OfflineTilePyramidRegionDefinition: public OfflineRegionDefinition {
public:
static constexpr auto Name() { return "com/mapbox/mapboxsdk/offline/OfflineTilePyramidRegionDefinition"; };
static jni::Object<OfflineTilePyramidRegionDefinition> New(jni::JNIEnv&, mbgl::OfflineTilePyramidRegionDefinition);
static jni::Object<OfflineTilePyramidRegionDefinition> New(jni::JNIEnv&, const mbgl::OfflineTilePyramidRegionDefinition&);
static mbgl::OfflineTilePyramidRegionDefinition getDefinition(jni::JNIEnv&, jni::Object<OfflineTilePyramidRegionDefinition>);
@@ -30,5 +31,19 @@ public:
};
class OfflineGeometryRegionDefinition: public OfflineRegionDefinition {
public:
static constexpr auto Name() { return "com/mapbox/mapboxsdk/offline/OfflineGeometryRegionDefinition"; };
static jni::Object<OfflineGeometryRegionDefinition> New(jni::JNIEnv&, const mbgl::OfflineGeometryRegionDefinition&);
static mbgl::OfflineGeometryRegionDefinition getDefinition(jni::JNIEnv&, jni::Object<OfflineGeometryRegionDefinition>);
static jni::Class<OfflineGeometryRegionDefinition> javaClass;
static void registerNative(jni::JNIEnv&);
};
} // namespace android
} // namespace mbgl