diff options
7 files changed, 41 insertions, 122 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineManager.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineManager.java index b56ecfc057..e632bcd765 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineManager.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineManager.java @@ -126,7 +126,7 @@ public class OfflineManager { */ public void createOfflineRegion( @NonNull OfflineRegionDefinition definition, - @NonNull OfflineRegionMetadata metadata, + @NonNull byte[] metadata, @NonNull final CreateOfflineRegionCallback callback) { createOfflineRegion(mDefaultFileSourcePtr, definition, metadata, new CreateOfflineRegionCallback() { @@ -176,7 +176,7 @@ public class OfflineManager { private native void createOfflineRegion( long defaultFileSourcePtr, OfflineRegionDefinition definition, - OfflineRegionMetadata metadata, CreateOfflineRegionCallback callback); + byte[] metadata, CreateOfflineRegionCallback callback); private native void setOfflineMapboxTileCountLimit( long defaultFileSourcePtr, long limit); diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegion.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegion.java index 9e518f1e6a..0f05549338 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegion.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegion.java @@ -23,7 +23,13 @@ public class OfflineRegion { // Members private long mId = 0; private OfflineRegionDefinition mDefinition = null; - private OfflineRegionMetadata mMetadata = null; + + /** + * Arbitrary binary region metadata. The contents are opaque to the SDK implementation; + * it just stores and retrieves a byte[]. Check the `OfflineActivity` in the TestApp + * for a sample implementation that uses JSON to store an offline region name. + */ + private byte[] mMetadata = null; // Holds the pointer to JNI OfflineRegion private long mOfflineRegionPtr = 0; @@ -122,7 +128,7 @@ public class OfflineRegion { return mDefinition; } - public OfflineRegionMetadata getMetadata() { + public byte[] getMetadata() { return mMetadata; } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegionMetadata.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegionMetadata.java deleted file mode 100644 index d4445ca037..0000000000 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegionMetadata.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.mapbox.mapboxsdk.offline; - -/** - * Arbitrary binary region metadata. The contents are opaque to the SDK implementation; - * it just stores and retrieves a byte[]. - */ -public class OfflineRegionMetadata { - - private byte[] metadata; - - /* - * Constructor - */ - - public OfflineRegionMetadata(byte[] metadata) { - this.metadata = metadata; - } - - /* - * Getters and setters - */ - - public byte[] getMetadata() { - return metadata; - } - - public void setMetadata(byte[] metadata) { - this.metadata = metadata; - } - - /* - * Overrides - */ - - @Override - public String toString() { - return "OfflineRegionMetadata{metadata=" + metadata + "}"; - } - -} diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/OfflineActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/OfflineActivity.java index 23a8be54a7..b5e6a92ae0 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/OfflineActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/OfflineActivity.java @@ -13,7 +13,6 @@ import android.widget.Button; import android.widget.ProgressBar; import android.widget.Toast; -import com.google.gson.Gson; import com.mapbox.mapboxsdk.camera.CameraPosition; import com.mapbox.mapboxsdk.camera.CameraUpdateFactory; import com.mapbox.mapboxsdk.constants.Style; @@ -24,7 +23,6 @@ import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; import com.mapbox.mapboxsdk.offline.OfflineManager; import com.mapbox.mapboxsdk.offline.OfflineRegion; -import com.mapbox.mapboxsdk.offline.OfflineRegionMetadata; import com.mapbox.mapboxsdk.offline.OfflineTilePyramidRegionDefinition; import com.mapbox.mapboxsdk.offline.OfflineRegionError; import com.mapbox.mapboxsdk.offline.OfflineRegionStatus; @@ -224,8 +222,7 @@ public class OfflineActivity extends AppCompatActivity String regionName; try { - String json = new String(offlineRegion.getMetadata().getMetadata(), CustomMetadata.CHARSET); - CustomMetadata customMetadata = new Gson().fromJson(json, CustomMetadata.class); + CustomMetadata customMetadata = CustomMetadata.decode(offlineRegion.getMetadata()); regionName = customMetadata.getRegionName(); } catch (UnsupportedEncodingException e) { Log.e(LOG_TAG, "Failed to decode metadata: " + e.getMessage()); @@ -262,13 +259,10 @@ public class OfflineActivity extends AppCompatActivity styleURL, bounds, minZoom, maxZoom, pixelRatio); // Sample way of encoding metadata - OfflineRegionMetadata metadata; + byte[] metadata; try { CustomMetadata customMetadata = new CustomMetadata(regionName); - byte[] encoded = new Gson() - .toJson(customMetadata, CustomMetadata.class) - .getBytes(CustomMetadata.CHARSET); - metadata = new OfflineRegionMetadata(encoded); + metadata = customMetadata.encode(); } catch (UnsupportedEncodingException e) { Log.e(LOG_TAG, "Failed to encode metadata: " + e.getMessage()); metadata = null; diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/offline/CustomMetadata.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/offline/CustomMetadata.java index 27bdef6312..75c5f719f5 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/offline/CustomMetadata.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/offline/CustomMetadata.java @@ -1,5 +1,9 @@ package com.mapbox.mapboxsdk.testapp.offline; +import com.google.gson.Gson; + +import java.io.UnsupportedEncodingException; + /** * A custom metadata class */ @@ -33,4 +37,20 @@ public class CustomMetadata { this.regionName = regionName; } + /* + * Helper methods to encode/decode metadata into/from byte[] + */ + + public byte[] encode() throws UnsupportedEncodingException { + return new Gson() + .toJson(this, CustomMetadata.class) + .getBytes(CustomMetadata.CHARSET); + } + + public static CustomMetadata decode(byte[] metadata) throws UnsupportedEncodingException { + String json = new String(metadata, CustomMetadata.CHARSET); + return new Gson() + .fromJson(json, CustomMetadata.class); + } + } diff --git a/platform/android/src/jni.cpp b/platform/android/src/jni.cpp index 9855529c66..c60721ceb3 100755 --- a/platform/android/src/jni.cpp +++ b/platform/android/src/jni.cpp @@ -141,10 +141,6 @@ jfieldID offlineRegionDefinitionMinZoomId = nullptr; jfieldID offlineRegionDefinitionMaxZoomId = nullptr; jfieldID offlineRegionDefinitionPixelRatioId = nullptr; -jclass offlineRegionMetadataClass = nullptr; -jmethodID offlineRegionMetadataConstructorId = nullptr; -jfieldID offlineRegionMetadataMetadataId = nullptr; - jclass createOfflineRegionCallbackClass = nullptr; jmethodID createOnCreateMethodId = nullptr; jmethodID createOnErrorMethodId = nullptr; @@ -1779,8 +1775,7 @@ void JNICALL listOfflineRegions(JNIEnv *env, jobject obj, jlong defaultFileSourc // Metadata object jbyteArray metadata = metadata_from_native(env2, region.getMetadata()); - jobject jmetadata = env2->NewObject(offlineRegionMetadataClass, offlineRegionMetadataConstructorId, metadata); - env2->SetObjectField(jregion, offlineRegionMetadataId, jmetadata); + env2->SetObjectField(jregion, offlineRegionMetadataId, metadata); // Moves the region on the stack into a heap-allocated one env2->SetLongField(jregion, offlineRegionPtrId, @@ -1801,7 +1796,7 @@ void JNICALL listOfflineRegions(JNIEnv *env, jobject obj, jlong defaultFileSourc }); } -void JNICALL createOfflineRegion(JNIEnv *env, jobject obj, jlong defaultFileSourcePtr, jobject definition_, jobject metadata_, jobject createCallback) { +void JNICALL createOfflineRegion(JNIEnv *env, jobject obj, jlong defaultFileSourcePtr, jobject definition_, jbyteArray metadata_, jobject createCallback) { mbgl::Log::Debug(mbgl::Event::JNI, "createOfflineRegion"); // Checks @@ -1827,9 +1822,8 @@ void JNICALL createOfflineRegion(JNIEnv *env, jobject obj, jlong defaultFileSour // Metadata mbgl::OfflineRegionMetadata metadata; - jbyteArray jmetadata = (jbyteArray)env->GetObjectField(metadata_, offlineRegionMetadataMetadataId); - if (jmetadata != nullptr) { - metadata = metadata_from_java(env, jmetadata); + if (metadata_ != nullptr) { + metadata = metadata_from_java(env, metadata_); } // Makes sure the objects don't get GC'ed @@ -1857,9 +1851,8 @@ void JNICALL createOfflineRegion(JNIEnv *env, jobject obj, jlong defaultFileSour env2->SetLongField(jregion, offlineRegionIdId, region->getID()); // Metadata object - jbyteArray xmetadata = metadata_from_native(env2, region->getMetadata()); - jobject xjmetadata = env2->NewObject(offlineRegionMetadataClass, offlineRegionMetadataConstructorId, xmetadata); - env2->SetObjectField(jregion, offlineRegionMetadataId, xjmetadata); + jbyteArray jmetadata = metadata_from_native(env2, region->getMetadata()); + env2->SetObjectField(jregion, offlineRegionMetadataId, jmetadata); // Moves the region on the stack into a heap-allocated one env2->SetLongField(jregion, offlineRegionPtrId, @@ -2582,7 +2575,7 @@ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { return JNI_ERR; } - offlineRegionMetadataId = env->GetFieldID(offlineRegionClass, "mMetadata", "Lcom/mapbox/mapboxsdk/offline/OfflineRegionMetadata;"); + offlineRegionMetadataId = env->GetFieldID(offlineRegionClass, "mMetadata", "[B"); if (offlineRegionMetadataId == nullptr) { env->ExceptionDescribe(); return JNI_ERR; @@ -2637,24 +2630,6 @@ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { return JNI_ERR; } - offlineRegionMetadataClass = env->FindClass("com/mapbox/mapboxsdk/offline/OfflineRegionMetadata"); - if (offlineRegionMetadataClass == nullptr) { - env->ExceptionDescribe(); - return JNI_ERR; - } - - offlineRegionMetadataConstructorId = env->GetMethodID(offlineRegionMetadataClass, "<init>", "([B)V"); - if (offlineRegionMetadataConstructorId == nullptr) { - env->ExceptionDescribe(); - return JNI_ERR; - } - - offlineRegionMetadataMetadataId = env->GetFieldID(offlineRegionMetadataClass, "metadata", "[B"); - if (offlineRegionMetadataMetadataId == nullptr) { - env->ExceptionDescribe(); - return JNI_ERR; - } - createOfflineRegionCallbackClass = env->FindClass("com/mapbox/mapboxsdk/offline/OfflineManager$CreateOfflineRegionCallback"); if (createOfflineRegionCallbackClass == nullptr) { env->ExceptionDescribe(); @@ -2944,7 +2919,7 @@ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { {"setAccessToken", "(JLjava/lang/String;)V", reinterpret_cast<void *>(&setAccessToken)}, {"getAccessToken", "(J)Ljava/lang/String;", reinterpret_cast<void *>(&getAccessToken)}, {"listOfflineRegions", "(JLcom/mapbox/mapboxsdk/offline/OfflineManager$ListOfflineRegionsCallback;)V", reinterpret_cast<void *>(&listOfflineRegions)}, - {"createOfflineRegion", "(JLcom/mapbox/mapboxsdk/offline/OfflineRegionDefinition;Lcom/mapbox/mapboxsdk/offline/OfflineRegionMetadata;Lcom/mapbox/mapboxsdk/offline/OfflineManager$CreateOfflineRegionCallback;)V", reinterpret_cast<void *>(&createOfflineRegion)}, + {"createOfflineRegion", "(JLcom/mapbox/mapboxsdk/offline/OfflineRegionDefinition;[BLcom/mapbox/mapboxsdk/offline/OfflineManager$CreateOfflineRegionCallback;)V", reinterpret_cast<void *>(&createOfflineRegion)}, {"setOfflineMapboxTileCountLimit", "(JJ)V", reinterpret_cast<void *>(&setOfflineMapboxTileCountLimit)} }; @@ -3223,28 +3198,6 @@ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { env->DeleteGlobalRef(offlineRegionClass); } - offlineRegionMetadataClass = reinterpret_cast<jclass>(env->NewGlobalRef(offlineRegionMetadataClass)); - if (offlineRegionMetadataClass == nullptr) { - env->ExceptionDescribe(); - env->DeleteGlobalRef(latLngClass); - env->DeleteGlobalRef(latLngBoundsClass); - env->DeleteGlobalRef(iconClass); - env->DeleteGlobalRef(markerClass); - env->DeleteGlobalRef(polylineClass); - env->DeleteGlobalRef(polygonClass); - env->DeleteGlobalRef(runtimeExceptionClass); - env->DeleteGlobalRef(nullPointerExceptionClass); - env->DeleteGlobalRef(arrayListClass); - env->DeleteGlobalRef(projectedMetersClass); - env->DeleteGlobalRef(pointFClass); - env->DeleteGlobalRef(rectFClass); - env->DeleteGlobalRef(httpContextClass); - env->DeleteGlobalRef(offlineManagerClass); - env->DeleteGlobalRef(listOfflineRegionsCallbackClass); - env->DeleteGlobalRef(offlineRegionClass); - env->DeleteGlobalRef(offlineRegionDefinitionClass); - } - createOfflineRegionCallbackClass = reinterpret_cast<jclass>(env->NewGlobalRef(createOfflineRegionCallbackClass)); if (createOfflineRegionCallbackClass == nullptr) { env->ExceptionDescribe(); @@ -3265,7 +3218,6 @@ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { env->DeleteGlobalRef(listOfflineRegionsCallbackClass); env->DeleteGlobalRef(offlineRegionClass); env->DeleteGlobalRef(offlineRegionDefinitionClass); - env->DeleteGlobalRef(offlineRegionMetadataClass); } offlineRegionObserverClass = reinterpret_cast<jclass>(env->NewGlobalRef(offlineRegionObserverClass)); @@ -3288,7 +3240,6 @@ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { env->DeleteGlobalRef(listOfflineRegionsCallbackClass); env->DeleteGlobalRef(offlineRegionClass); env->DeleteGlobalRef(offlineRegionDefinitionClass); - env->DeleteGlobalRef(offlineRegionMetadataClass); env->DeleteGlobalRef(createOfflineRegionCallbackClass); } @@ -3312,7 +3263,6 @@ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { env->DeleteGlobalRef(listOfflineRegionsCallbackClass); env->DeleteGlobalRef(offlineRegionClass); env->DeleteGlobalRef(offlineRegionDefinitionClass); - env->DeleteGlobalRef(offlineRegionMetadataClass); env->DeleteGlobalRef(createOfflineRegionCallbackClass); env->DeleteGlobalRef(offlineRegionObserverClass); } @@ -3337,7 +3287,6 @@ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { env->DeleteGlobalRef(listOfflineRegionsCallbackClass); env->DeleteGlobalRef(offlineRegionClass); env->DeleteGlobalRef(offlineRegionDefinitionClass); - env->DeleteGlobalRef(offlineRegionMetadataClass); env->DeleteGlobalRef(createOfflineRegionCallbackClass); env->DeleteGlobalRef(offlineRegionObserverClass); env->DeleteGlobalRef(offlineRegionStatusClass); @@ -3363,7 +3312,6 @@ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { env->DeleteGlobalRef(listOfflineRegionsCallbackClass); env->DeleteGlobalRef(offlineRegionClass); env->DeleteGlobalRef(offlineRegionDefinitionClass); - env->DeleteGlobalRef(offlineRegionMetadataClass); env->DeleteGlobalRef(createOfflineRegionCallbackClass); env->DeleteGlobalRef(offlineRegionObserverClass); env->DeleteGlobalRef(offlineRegionStatusClass); @@ -3390,7 +3338,6 @@ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { env->DeleteGlobalRef(listOfflineRegionsCallbackClass); env->DeleteGlobalRef(offlineRegionClass); env->DeleteGlobalRef(offlineRegionDefinitionClass); - env->DeleteGlobalRef(offlineRegionMetadataClass); env->DeleteGlobalRef(createOfflineRegionCallbackClass); env->DeleteGlobalRef(offlineRegionObserverClass); env->DeleteGlobalRef(offlineRegionStatusClass); @@ -3528,10 +3475,6 @@ extern "C" JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved) { offlineRegionDefinitionMaxZoomId = nullptr; offlineRegionDefinitionPixelRatioId = nullptr; - env->DeleteGlobalRef(offlineRegionMetadataClass); - offlineRegionMetadataConstructorId = nullptr; - offlineRegionMetadataMetadataId = nullptr; - env->DeleteGlobalRef(createOfflineRegionCallbackClass); createOnCreateMethodId = nullptr; createOnErrorMethodId = nullptr; diff --git a/platform/android/src/jni.hpp b/platform/android/src/jni.hpp index 2995ea0b35..6a3c248373 100644 --- a/platform/android/src/jni.hpp +++ b/platform/android/src/jni.hpp @@ -127,10 +127,6 @@ extern jfieldID offlineRegionDefinitionMinZoomId; extern jfieldID offlineRegionDefinitionMaxZoomId; extern jfieldID offlineRegionDefinitionPixelRatioId; -extern jclass offlineRegionMetadataClass; -extern jmethodID offlineRegionMetadataConstructorId; -extern jfieldID offlineRegionMetadataMetadataId; - extern jclass createOfflineRegionCallbackClass; extern jmethodID createOnCreateMethodId; extern jmethodID createOnErrorMethodId; |