diff options
author | Tobrun <tobrun.van.nuland@gmail.com> | 2016-09-28 07:48:01 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-09-28 07:48:01 +0200 |
commit | 3835ed556b03a7246d238e1ee1a52f3aac29ec98 (patch) | |
tree | d0e976a9b0a8f9b9513f757c0f6a24e81dce69f5 /platform/android/src/jni.cpp | |
parent | 73baa527100a311a3ab4e056b138ff5fc0e63700 (diff) | |
download | qtlocation-mapboxgl-3835ed556b03a7246d238e1ee1a52f3aac29ec98.tar.gz |
6402 update offline metadata android (#6456)
* [android] - update offline metadata jni integration
* extract offline utils for reuse
* add test activity for update metadata
* fix requested signature changes
Diffstat (limited to 'platform/android/src/jni.cpp')
-rwxr-xr-x | platform/android/src/jni.cpp | 56 |
1 files changed, 55 insertions, 1 deletions
diff --git a/platform/android/src/jni.cpp b/platform/android/src/jni.cpp index 03e66c5895..62d4ea1eed 100755 --- a/platform/android/src/jni.cpp +++ b/platform/android/src/jni.cpp @@ -137,6 +137,9 @@ jni::jfieldID* offlineRegionDefinitionPixelRatioId = nullptr; jni::jmethodID* createOnCreateMethodId = nullptr; jni::jmethodID* createOnErrorMethodId = nullptr; +jni::jmethodID* updateMetadataOnUpdateMethodId = nullptr; +jni::jmethodID* updateMetadataOnErrorMethodId = nullptr; + jni::jmethodID* offlineRegionObserveronStatusChangedId = nullptr; jni::jmethodID* offlineRegionObserveronErrorId = nullptr; jni::jmethodID* offlineRegionObserveronLimitId = nullptr; @@ -1670,6 +1673,52 @@ void deleteOfflineRegion(JNIEnv *env, jni::jobject* offlineRegion_, jni::jobject }); } +void updateOfflineRegionMetadata(JNIEnv *env, jni::jobject* offlineRegion_, jni::jarray<jbyte>* metadata_, jni::jobject* updateCallback) { + mbgl::Log::Debug(mbgl::Event::JNI, "updateOfflineRegionMetadata"); + + // Offline region + mbgl::OfflineRegion* offlineRegion = getOfflineRegionPeer(env, offlineRegion_); + + // File source + jni::jobject* jmanager = jni::GetField<jni::jobject*>(*env, offlineRegion_, *offlineRegionOfflineManagerId); + jlong defaultFileSourcePtr = jni::GetField<jlong>(*env, jmanager, *offlineManagerClassPtrId); + mbgl::DefaultFileSource *defaultFileSource = reinterpret_cast<mbgl::DefaultFileSource *>(defaultFileSourcePtr); + + // Id conversion + int64_t id = offlineRegion->getID(); + + // Metadata + mbgl::OfflineRegionMetadata metadata; + if (metadata_ != nullptr) { + metadata = metadata_from_java(env, *metadata_); + } + + // Makes sure the objects don't get GC'ed + updateCallback = jni::NewGlobalRef(*env, updateCallback).release(); + + // Launch updateCallback + defaultFileSource->updateOfflineMetadata(id, metadata, [updateCallback] (std::exception_ptr error, mbgl::optional<mbgl::OfflineRegionMetadata> data) mutable { + // Reattach, the callback comes from a different thread + JNIEnv *env2; + jboolean renderDetach = attach_jni_thread(theJVM, &env2, "Offline Thread"); + if (renderDetach) { + mbgl::Log::Debug(mbgl::Event::JNI, "Attached."); + } + + if (error) { + std::string message = mbgl::util::toString(error); + jni::CallMethod<void>(*env2, updateCallback, *updateMetadataOnErrorMethodId, std_string_to_jstring(env2, message)); + } else if (data) { + jni::jarray<jbyte>* jmetadata = metadata_from_native(env2, *data); + jni::CallMethod<void>(*env2, updateCallback, *updateMetadataOnUpdateMethodId, jmetadata); + } + + // Delete global refs and detach when we're done + jni::DeleteGlobalRef(*env2, jni::UniqueGlobalRef<jni::jobject>(updateCallback)); + detach_jni_thread(theJVM, &env2, renderDetach); + }); +} + // Offline calls end } @@ -1900,7 +1949,8 @@ extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { MAKE_NATIVE_METHOD(setOfflineRegionObserver, "(Lcom/mapbox/mapboxsdk/offline/OfflineRegion$OfflineRegionObserver;)V"), MAKE_NATIVE_METHOD(setOfflineRegionDownloadState, "(I)V"), MAKE_NATIVE_METHOD(getOfflineRegionStatus, "(Lcom/mapbox/mapboxsdk/offline/OfflineRegion$OfflineRegionStatusCallback;)V"), - MAKE_NATIVE_METHOD(deleteOfflineRegion, "(Lcom/mapbox/mapboxsdk/offline/OfflineRegion$OfflineRegionDeleteCallback;)V") + MAKE_NATIVE_METHOD(deleteOfflineRegion, "(Lcom/mapbox/mapboxsdk/offline/OfflineRegion$OfflineRegionDeleteCallback;)V"), + MAKE_NATIVE_METHOD(updateOfflineRegionMetadata, "([BLcom/mapbox/mapboxsdk/offline/OfflineRegion$OfflineRegionUpdateMetadataCallback;)V") ); // This needs to be updated once we support more than one type of region definition @@ -1943,6 +1993,10 @@ extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { offlineRegionDeleteOnDeleteId = &jni::GetMethodID(env, *offlineRegionDeleteCallbackClass, "onDelete", "()V"); offlineRegionDeleteOnErrorId = &jni::GetMethodID(env, *offlineRegionDeleteCallbackClass, "onError", "(Ljava/lang/String;)V"); + jni::jclass* offlineRegionUpdateMetadataCallbackClass = &jni::FindClass(env, "com/mapbox/mapboxsdk/offline/OfflineRegion$OfflineRegionUpdateMetadataCallback"); + updateMetadataOnUpdateMethodId = &jni::GetMethodID(env, *offlineRegionUpdateMetadataCallbackClass, "onUpdate", "([B)V"); + updateMetadataOnErrorMethodId = &jni::GetMethodID(env, *offlineRegionUpdateMetadataCallbackClass, "onError", "(Ljava/lang/String;)V"); + // Offline end char release[PROP_VALUE_MAX] = ""; |