Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Commit

Permalink
[android] - rework expression conversion
Browse files Browse the repository at this point in the history
  • Loading branch information
tobrun committed Mar 24, 2018
1 parent c44fe25 commit 196a2a3
Show file tree
Hide file tree
Showing 26 changed files with 294 additions and 146 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ public CircleLayer withFilter(Expression filter) {
@Nullable
public Expression getFilter() {
Expression expression = null;
JsonArray array = nativeGetFilter();
JsonArray array = (JsonArray) nativeGetFilter();
if (array != null) {
expression = Expression.Converter.convert(array);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ public FillExtrusionLayer withFilter(Expression filter) {
@Nullable
public Expression getFilter() {
Expression expression = null;
JsonArray array = nativeGetFilter();
JsonArray array = (JsonArray) nativeGetFilter();
if (array != null) {
expression = Expression.Converter.convert(array);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ public FillLayer withFilter(Expression filter) {
@Nullable
public Expression getFilter() {
Expression expression = null;
JsonArray array = nativeGetFilter();
JsonArray array = (JsonArray) nativeGetFilter();
if (array != null) {
expression = Expression.Converter.convert(array);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ public HeatmapLayer withFilter(Expression filter) {
@Nullable
public Expression getFilter() {
Expression expression = null;
JsonArray array = nativeGetFilter();
JsonArray array = (JsonArray) nativeGetFilter();
if (array != null) {
expression = Expression.Converter.convert(array);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import android.support.annotation.NonNull;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.mapbox.mapboxsdk.style.expressions.Expression;

/**
Expand Down Expand Up @@ -72,7 +73,7 @@ public void setMaxZoom(float zoom) {

protected native void nativeSetFilter(Object[] filter);

protected native JsonArray nativeGetFilter();
protected native JsonElement nativeGetFilter();

protected native void nativeSetSourceLayer(String sourceLayer);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ public LineLayer withFilter(Expression filter) {
@Nullable
public Expression getFilter() {
Expression expression = null;
JsonArray array = nativeGetFilter();
JsonArray array = (JsonArray) nativeGetFilter();
if (array != null) {
expression = Expression.Converter.convert(array);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ public SymbolLayer withFilter(Expression filter) {
@Nullable
public Expression getFilter() {
Expression expression = null;
JsonArray array = nativeGetFilter();
JsonArray array = (JsonArray) nativeGetFilter();
if (array != null) {
expression = Expression.Converter.convert(array);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ public class <%- camelize(type) %>Layer extends Layer {
@Nullable
public Expression getFilter() {
Expression expression = null;
JsonArray array = nativeGetFilter();
JsonArray array = (JsonArray) nativeGetFilter();
if (array != null) {
expression = Expression.Converter.convert(array);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,13 @@ public void onDataLoaded(@NonNull FeatureCollection featureCollection) {
Expression textFieldExpressionResult = symbolLayer.getTextField().getExpression();
Expression textColorExpressionResult = symbolLayer.getTextColor().getExpression();

// log expressions
Timber.e(iconImageExpressionResult.toString());
Timber.e(iconSizeExpressionResult.toString());
Timber.e(textSizeExpressionResult.toString());
Timber.e(textFieldExpressionResult.toString());
Timber.e(textColorExpressionResult.toString());

// reset expressions
symbolLayer.setProperties(
iconImage(iconImageExpressionResult),
Expand Down
3 changes: 2 additions & 1 deletion platform/android/config.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,6 @@ add_library(mbgl-android STATIC
platform/android/src/conversion/constant.hpp
platform/android/src/conversion/conversion.hpp
platform/android/src/style/conversion/function.hpp
platform/android/src/style/conversion/gson.hpp
platform/android/src/style/conversion/property_value.hpp
platform/android/src/style/conversion/types.hpp
platform/android/src/style/conversion/types_string_values.hpp
Expand Down Expand Up @@ -213,6 +212,8 @@ add_library(mbgl-android STATIC
platform/android/src/map_renderer_runnable.hpp

# Java core classes
platform/android/src/java/lang.cpp
platform/android/src/java/lang.hpp
platform/android/src/java/util.cpp
platform/android/src/java/util.hpp

Expand Down
14 changes: 14 additions & 0 deletions platform/android/src/gson/json_array.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,20 @@ namespace mbgl {
namespace android {
namespace gson {

jni::Object<JsonArray> JsonArray::New(jni::JNIEnv& env, std::vector<mapbox::geometry::value> values){
static auto constructor = JsonArray::javaClass.GetConstructor(env);
static auto addMethod = JsonArray::javaClass.GetMethod<void (jni::Object<JsonElement>)>(env, "add");

auto jsonArray = JsonArray::javaClass.New(env, constructor);

for (const auto &v : values) {
auto jsonElement = JsonElement::New(env, v);
jsonArray.Call(env, addMethod, jsonElement);
}

return jsonArray;
}

std::vector<mapbox::geometry::value> JsonArray::convert(jni::JNIEnv &env, jni::Object<JsonArray> jsonArray) {
std::vector<mapbox::geometry::value> values;

Expand Down
2 changes: 2 additions & 0 deletions platform/android/src/gson/json_array.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ class JsonArray : private mbgl::util::noncopyable {
public:
static constexpr auto Name() { return "com/google/gson/JsonArray"; };

static jni::Object<JsonArray> New(jni::JNIEnv&, std::vector<mapbox::geometry::value>);

static std::vector<mapbox::geometry::value> convert(JNIEnv&, jni::Object<JsonArray>);

static jni::Class<JsonArray> javaClass;
Expand Down
28 changes: 28 additions & 0 deletions platform/android/src/gson/json_element.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,34 @@ namespace mbgl {
namespace android {
namespace gson {

/**
* Turn mapbox::geometry::value into Java Gson JsonElement
*/
class JsonElementEvaluator {
public:

jni::JNIEnv& env;

jni::Object<JsonElement> operator()(const JsonPrimitive::value value) const {
return jni::Cast(env, JsonPrimitive::New(env, value), JsonElement::javaClass);
}

jni::Object<JsonElement> operator()(const std::vector<mapbox::geometry::value> &values) const {
return jni::Cast(env, JsonArray::New(env, values), JsonElement::javaClass);
}

jni::Object<JsonElement> operator()(const std::unordered_map<std::string, mapbox::geometry::value> &values) const {
return jni::Cast(env, JsonObject::New(env, values), JsonElement::javaClass);
}

};


jni::Object<JsonElement> JsonElement::New(jni::JNIEnv& env, mapbox::geometry::value value) {
JsonElementEvaluator evaluator { env } ;
return mapbox::geometry::value::visit(value, evaluator);
}

mapbox::geometry::value JsonElement::convert(jni::JNIEnv &env, jni::Object<JsonElement> jsonElement) {
mapbox::geometry::value value;

Expand Down
2 changes: 2 additions & 0 deletions platform/android/src/gson/json_element.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ class JsonElement : private mbgl::util::noncopyable {
public:
static constexpr auto Name() { return "com/google/gson/JsonElement"; };

static jni::Object<JsonElement> New(jni::JNIEnv&, mapbox::geometry::value);

static mapbox::geometry::value convert(JNIEnv&, jni::Object<JsonElement>);

static bool isJsonObject(JNIEnv&, jni::Object<JsonElement>);
Expand Down
15 changes: 15 additions & 0 deletions platform/android/src/gson/json_object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,21 @@ namespace android {
namespace gson {


jni::Object<JsonObject> JsonObject::New(jni::JNIEnv& env, std::unordered_map<std::string, mapbox::geometry::value> values){
static auto constructor = JsonObject::javaClass.GetConstructor(env);
static auto addMethod = JsonObject::javaClass.GetMethod<void (jni::String, jni::Object<JsonElement>)>(env, "add");

jni::Object<JsonObject> jsonObject = JsonObject::javaClass.New(env, constructor);

for (auto &item : values) {
jni::Object<JsonElement> jsonElement = JsonElement::New(env, item.second);
jni::String key = jni::Make<jni::String>(env, item.first);
jsonObject.Call(env, addMethod, key, jsonElement);
}

return jsonObject;
}

template <typename F> // void (jni::String, jni::Object<gson::JsonElement>)
static void iterateEntrySet(jni::JNIEnv& env, jni::Object<JsonObject> jsonObject, F callback) {
// Get Set<Map.Entry<String, JsonElement>>
Expand Down
2 changes: 2 additions & 0 deletions platform/android/src/gson/json_object.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ class JsonObject : private mbgl::util::noncopyable {
public:
static constexpr auto Name() { return "com/google/gson/JsonObject"; };

static jni::Object<JsonObject> New(jni::JNIEnv&, std::unordered_map<std::string, mapbox::geometry::value>);

static mapbox::geometry::property_map convert(JNIEnv&, jni::Object<JsonObject>);

static jni::Class<JsonObject> javaClass;
Expand Down
70 changes: 70 additions & 0 deletions platform/android/src/gson/json_primitive.cpp
Original file line number Diff line number Diff line change
@@ -1,9 +1,79 @@
#include "json_primitive.hpp"
#include "../java/lang.hpp"

namespace mbgl {
namespace android {
namespace gson {

/**
* Turn mapbox::geometry::value into Java Gson JsonPrimitives
*/
class JsonPrimitiveEvaluator {
public:

jni::JNIEnv& env;

/**
* Create a null primitive
*/
jni::Object<JsonPrimitive> operator()(const mapbox::geometry::null_value_t) const {
return jni::Object<JsonPrimitive>();
}

/**
* Create a primitive containing a string value
*/
jni::Object<JsonPrimitive> operator()(const std::string value) const {
static auto constructor = JsonPrimitive::javaClass.GetConstructor<jni::String>(env);
return JsonPrimitive::javaClass.New(env, constructor, jni::Make<jni::String>(env, value));
}

/**
* Create a primitive containing a number value with type double
*/
jni::Object<JsonPrimitive> operator()(const double value) const {
static auto constructor = JsonPrimitive::javaClass.GetConstructor<jni::Object<java::lang::Number>>(env);
auto boxedValue = java::lang::Double::valueOf(env, value);
auto number = jni::Cast(env, boxedValue, java::lang::Number::javaClass);
return JsonPrimitive::javaClass.New(env, constructor, number);
}

/**
* Create a primitive containing a number value with type long
*/
jni::Object<JsonPrimitive> operator()(const int64_t value) const {
static auto constructor = JsonPrimitive::javaClass.GetConstructor<jni::Object<java::lang::Number>>(env);
auto boxedValue = java::lang::Long::valueOf(env, value);
auto number = jni::Cast(env, boxedValue, java::lang::Number::javaClass);
return JsonPrimitive::javaClass.New(env, constructor, number);
}

/**
* Create a primitive containing a number value with type long
*/
jni::Object<JsonPrimitive> operator()(const uint64_t value) const {
// long conversion
static auto constructor = JsonPrimitive::javaClass.GetConstructor<jni::Object<java::lang::Number>>(env);
auto boxedValue = java::lang::Long::valueOf(env, value);
auto number = jni::Cast(env, boxedValue, java::lang::Number::javaClass);
return JsonPrimitive::javaClass.New(env, constructor, number);
}

/**
* Create a primitive containing a boolean value
*/
jni::Object<JsonPrimitive> operator()(const bool value) const {
static auto constructor = JsonPrimitive::javaClass.GetConstructor<jni::Object<java::lang::Boolean>>(env);
auto boxedValue = java::lang::Boolean::valueOf(env, value);
return JsonPrimitive::javaClass.New(env, constructor, boxedValue);
}
};

jni::Object<JsonPrimitive> JsonPrimitive::New(jni::JNIEnv &env, value value) {
JsonPrimitiveEvaluator evaluator { env };
return value::visit(value, evaluator);
}

JsonPrimitive::value JsonPrimitive::convert(jni::JNIEnv &env, jni::Object<JsonPrimitive> jsonPrimitive) {
value value;
if (jsonPrimitive) {
Expand Down
2 changes: 2 additions & 0 deletions platform/android/src/gson/json_primitive.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ class JsonPrimitive : private mbgl::util::noncopyable {

static constexpr auto Name() { return "com/google/gson/JsonPrimitive"; };

static jni::Object<JsonPrimitive> New(jni::JNIEnv&, value);

static value convert(JNIEnv&, jni::Object<JsonPrimitive>);

static bool isBoolean(JNIEnv&, jni::Object<JsonPrimitive>);
Expand Down
76 changes: 76 additions & 0 deletions platform/android/src/java/lang.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
#include "lang.hpp"

namespace mbgl {
namespace android {
namespace java {
namespace lang {

// Float

jni::Object<Float> Float::valueOf(JNIEnv &env, jfloat value) {
static auto method = javaClass.GetStaticMethod<jni::Object<Float> (jni::jfloat)>(env, "valueOf");
return javaClass.Call(env, method, value);
}

void Float::registerNative(jni::JNIEnv &env) {
// Lookup the class
javaClass = *jni::Class<Float>::Find(env).NewGlobalRef(env).release();
}

jni::Class<Float> Float::javaClass;

// Long

jni::Object<Long> Long::valueOf(JNIEnv &env, jlong value) {
static auto method = javaClass.GetStaticMethod<jni::Object<Long> (jni::jlong)>(env, "valueOf");
return javaClass.Call(env, method, value);
}

void Long::registerNative(jni::JNIEnv &env) {
// Lookup the class
javaClass = *jni::Class<Long>::Find(env).NewGlobalRef(env).release();
}

jni::Class<Long> Long::javaClass;

// Double

jni::Object<Double> Double::valueOf(JNIEnv &env, jdouble value) {
static auto method = javaClass.GetStaticMethod<jni::Object<Double> (jni::jdouble)>(env, "valueOf");
return javaClass.Call(env, method, value);
}

void Double::registerNative(jni::JNIEnv &env) {
// Lookup the class
javaClass = *jni::Class<Double>::Find(env).NewGlobalRef(env).release();
}

jni::Class<Double> Double::javaClass;

// Boolean

jni::Object<Boolean> Boolean::valueOf(JNIEnv &env, jboolean value) {
static auto method = javaClass.GetStaticMethod<jni::Object<Boolean> (jni::jboolean)>(env, "valueOf");
return javaClass.Call(env, method, value);
}

void Boolean::registerNative(jni::JNIEnv &env) {
// Lookup the class
javaClass = *jni::Class<Boolean>::Find(env).NewGlobalRef(env).release();
}

jni::Class<Boolean> Boolean::javaClass;

// Number

void Number::registerNative(jni::JNIEnv &env) {
// Lookup the class
javaClass = *jni::Class<Number>::Find(env).NewGlobalRef(env).release();
}

jni::Class<Number> Number::javaClass;

} // namespace lang
} // namespace java
} // namespace android
} // namespace mbgl
Loading

0 comments on commit 196a2a3

Please sign in to comment.