summaryrefslogtreecommitdiff
path: root/platform/android/src/offline/offline_region_definition.cpp
blob: a856672902ab37e290dc027f1afec1def0edb24b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include "offline_region_definition.hpp"

#include "../geometry/lat_lng_bounds.hpp"
#include "../geojson/geometry.hpp"

#include <exception>

namespace mbgl {
namespace android {

// OfflineRegionDefinition //

jni::Class<OfflineRegionDefinition> OfflineRegionDefinition::javaClass;

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, const mbgl::OfflineTilePyramidRegionDefinition& definition) {

    //Convert objects
    auto styleURL = jni::Make<jni::String>(env, definition.styleURL);
    auto bounds = LatLngBounds::New(env, definition.bounds);

    static auto constructor = javaClass.GetConstructor<jni::String, jni::Object<LatLngBounds>, jni::jdouble, jni::jdouble, jni::jfloat>(env);
    auto jdefinition = javaClass.New(env, constructor, styleURL, bounds, definition.minZoom, definition.maxZoom, definition.pixelRatio);

    //Delete References
    jni::DeleteLocalRef(env, styleURL);
    jni::DeleteLocalRef(env, bounds);

    return jdefinition;
}

mbgl::OfflineTilePyramidRegionDefinition OfflineTilePyramidRegionDefinition::getDefinition(jni::JNIEnv& env, jni::Object<OfflineTilePyramidRegionDefinition> jDefinition) {
    // Field references
    static auto styleURLF = javaClass.GetField<jni::String>(env, "styleURL");
    static auto boundsF = javaClass.GetField<jni::Object<LatLngBounds>>(env, "bounds");
    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 jBounds = jDefinition.Get(env, boundsF);

    // Create definition
    mbgl::OfflineTilePyramidRegionDefinition definition(
        jni::Make<std::string>(env, jStyleURL),
        LatLngBounds::getLatLngBounds(env, jBounds),
        jDefinition.Get(env, minZoomF),
        jDefinition.Get(env, maxZoomF),
        jDefinition.Get(env, pixelRatioF)
    );

    // Delete references
    jni::DeleteLocalRef(env, jStyleURL);
    jni::DeleteLocalRef(env, jBounds);

    return definition;
}

jni::Class<OfflineTilePyramidRegionDefinition> OfflineTilePyramidRegionDefinition::javaClass;

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